假设我有一个“myclass”类 - :
class myclass
{
public:
int n;
myclass(int n=0)
{
this->n=n;
}
myclass(myclass &a)
{
this->n=a.n;
}
~myclass()
{
cout<<n<<"\n";
}
};
现在我想创建一个“myclass”对象数组,如下所示 - :
int main()
{
myclass arr[]= {5}; // Only 1 element for simplicity...
}
但是当我这样做时,我收到以下错误 - :
在函数'int main()'中:
| 47 |错误:没有用于调用'myclass :: myclass(myclass)'的匹配函数
| 47 |注意:候选人是:
| 36 |注意:myclass :: myclass(myclass&amp;)
| 36 |注意:参数1从'myclass'到'myclass&amp;'没有已知的转换
| 32 |注意:myclass :: myclass(int)
| 32 |注意:参数1从'myclass'到'int'
但是当我从课程中删除复制构造函数 myclass(myclass &a)
时,我没有收到任何错误,一切正常......
所以现在我的问题是 - :
1)。为什么会这样? myclass(int n=0)
不是比这里的复制构造函数更好的匹配吗?
2)。如何成功编译它,考虑到我想要两者,复制构造函数以及我的类中的整数构造函数?
注意:我在Ubuntu 13.04上使用GCC 4.7.3版(如果它有任何相关性。)
答案 0 :(得分:2)
如何成功编译它,考虑到我同时需要复制构造函数以及我类中的整数构造函数?
将const
添加到复制构造函数的引用参数可以解决此问题:
myclass(const myclass &a) : n(a.n) {}
答案 1 :(得分:2)
这种情况下的初始化语义是copy 初始化。复制初始化正式转换 争论,然后复制它。转换后的争论不是一个 左值,所以它不能绑定到你的非const引用 复制构造函数。如果您没有定义复制构造函数, 编译器为你定义一个,它接受一个const 参考。你是复制构造函数应该采用const 引用也是如此,因为它不会修改它的参数。
请注意,允许编译器优化副本 施工。但是,只有该计划是合法的,如果它 没有。