Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;:具有重载构造函数的类的对象数组_C++_Arrays_Constructor_Copy Constructor_Constructor Overloading - Fatal编程技术网

C++ C++;:具有重载构造函数的类的对象数组

C++ C++;:具有重载构造函数的类的对象数组,c++,arrays,constructor,copy-constructor,constructor-overloading,C++,Arrays,Constructor,Copy Constructor,Constructor Overloading,假设我有一个类“myclass”-: 但当我这样做时,我得到以下错误-: 在函数“int main()”中: |47 |错误:调用“myclass::myclass(myclass)”时没有匹配函数 |47 |注:候选人为: |36 |注:myclass::myclass(myclass&) |36 |注意:参数1从“myclass”到“myclass&”的转换未知 |32 |注:myclass::myclass(int) |32 |注意:参数1从“myclass”到“int”的转换未知 但是,

假设我有一个类“myclass”-:

但当我这样做时,我得到以下错误-:

在函数“int main()”中:
|47 |错误:调用“myclass::myclass(myclass)”时没有匹配函数
|47 |注:候选人为:
|36 |注:myclass::myclass(myclass&)
|36 |注意:参数1从“myclass”到“myclass&”的转换未知
|32 |注:myclass::myclass(int)
|32 |注意:参数1从“myclass”到“int”的转换未知

但是,当我从类中删除复制构造函数
myclass(myclass&a)
时,我没有收到任何错误,一切正常

现在我的问题是-:

1)。为什么会发生这种情况??
myclass(int n=0)
是否比这里的复制构造函数更匹配??

2)。考虑到我想要复制构造函数和类中的整数构造函数,如何成功编译它??

注意:我在Ubuntu 13.04上使用的是GCC版本4.7.3(如果相关的话)

考虑到我想要复制构造函数和整数构造函数,如何成功编译它

const
添加到复制构造函数的引用参数可修复此问题:

myclass(const myclass &a) : n(a.n) {}

.

本例中的初始化语义为复制 初始化。复制初始化正式转换 辩论,然后复制它。转换后的参数不是 左值,因此它不能绑定到 复制构造函数。如果不定义复制构造函数, 编译器为您定义了一个,它采用常量 参考资料。你的副本构造函数应该取常量 引用,因为它不修改其参数

请注意,允许编译器优化副本 建设但前提是该计划是合法的
没有

复制构造函数不应该采用
const myclass&a
?@nvoigt两者都是合法的,而且很少有复制构造函数采用非const引用的情况(如
std::auto_ptr
)。但通常情况下:您希望能够复制临时对象(这需要常量ref),而不需要修改要复制的对象(因此可以使用常量ref)。哦,是的!忘记“5”是常量值。非常感谢@AnmolSinghJaggi
5
具有类型
int
,而不是
int const
;它是一个右值,因此不能被cv限定。而
5
用作
myclass(int)
的参数。它是由
myclass(int)
创建的临时对象的副本,如果复制构造函数采用非常量引用,则会失败。@JamesKanze你说得对!但是你所说的“cv合格”到底是什么意思呢?@AnmolSinghJaggi被
const
volatile
限定。(“cv qualified”是这个标准中使用的术语。)我本来会投赞成票的,但我没有足够的声誉。我一拿到票就会投赞成票。无论如何,谢谢你的帮助。。!!
int main()
{
    myclass arr[]= {5};  // Only 1 element for simplicity...
}
myclass(const myclass &a) : n(a.n) {}