3

假设我有一类“MyClass的” - :C++:与重载构造一个类对象的阵列

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... 
} 

但是,当我这样做,我碰到下面的错误 - :

在函数 '廉政的main()':
| 47 |错误:没有匹配的福nction呼叫为 'MyClass的MyClass的::(MyClass的)'
| 47 |注:考生:
| 36 |注:MyClass的MyClass的::(MyClass的&)
| 36 |注:没有已知的参数转换1从 'MyClass的' 到 'MyClass的&'
| 32 |注释:MyClass的:: MyClass的(INT)
| 32 |注:没有已知的转换用于从 'MyClass的' 到 'INT'

参数1但是,当我从类删除复制构造函数myclass(myclass &a),我没有得到任何错误,一切工作正常...

所以现在我的问题是 - :

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

2)。如何成功编译它,考虑到我希望这两个,复制构造函数以及我的类中的整数构造函数?

注:我使用的GCC 4.7.3版本在Ubuntu 13.04

+1

复制构造函数不应该使用'const myclass&a'? – nvoigt

+0

@nvoigt两者都是合法的,并且在极少数情况下(比如'std :: auto_ptr'),拷贝构造函数确实带有一个非const引用。但通常情况下:您希望能够复制临时对象(这需要一个const ref),并且不要修改正在复制的对象(因此您可以使用const ref)。 –

回答

2

在这种情况下的初始化语义是复制 初始化。复制初始化正式转换 争议,然后复制它。转换后的参数不是一个 左值,因此它不能绑定到您的 拷贝构造函数中的非常量引用。如果你没有定义拷贝构造函数 ,那么编译器会为你定义一个拷贝构造函数,它需要一个const 引用。你的拷贝构造函数也应该采用const 的引用,因为它不会修改它的参数。

请注意,允许编译器优化复制 构造。但是,只有当程序合法,如果它 没有。

+0

我会投票赞成但我没有足够的信誉。我会尽快投票。无论如何,感谢您的帮助..! –

2

How to successfully compile it , considering I want both , the copy constructor as well as the integer constructor in my class?

添加const的拷贝构造函数修正的参考参数这个问题(如果是任何关系的。):

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

Demo on ideone

+0

噢!忘记了“5”是一个常量值。非常感谢! –

+1

@AnmolSinghJaggi'5'的类型是int,而不是'int const';这是一个右值,所以不能通过CV认证。 '5'作为'myclass(int)'的参数。它是由'myclass(int)'创建的临时对象的副本,如果复制构造函数接受非const引用,则它会失败。 –

+0

@JamesKanze你是对的!但是,“cv-qualified”的意思是什么? –