我正在学习C ++,这是我第一次尝试理解复制构造函数的工作原理:
class Cents
{
private:
int m_nCents;
public:
Cents(int nCents=0)
{
m_nCents = nCents;
}
// Copy constructor
Cents( Cents cSource)
{
m_nCents = cSource.m_nCents;
}
};
int main()
{
Cents cMark(5); // calls Cents constructor
Cents cNancy = cMark; // calls Cents copy constructor!
return 0;
}
但是我收到了这个错误:
错误1错误C2652:' Cents' :非法复制构造函数:第一个 参数不能是' Cents'
我的复制构造函数有什么问题?
我检查过如果在构造函数中我通过引用传递参数,那么它编译得很好,但是我不会按照我正在做的方式工作。为什么会这样?
答案 0 :(得分:4)
按值传递任何参数需要复制构造函数 - 显式或隐式。 当我们定义一个拷贝构造函数时,我们的意思是我们不想使用隐式拷贝构造函数。 使用为复制构造函数定义的复制构造函数将创建循环依赖。
答案 1 :(得分:3)
就像最后一个答案一样
如果您使用以下声明:
Cents c1 ;
Cents c2(c1) ;
或者按照这样的值将对象传递给函数:
void Func (Cents c) {}
int main() {
Cents c1 ;
func (c1);
}
或使用赋值运算符初始化对象:
Cents c2 = c1 ;
编译器将搜索复制构造函数,它会发现Cents( cents csource)
(您建议的复制构造函数)也按值传递对象。从技术上讲,要通过值传递,您要求编译器在函数体中创建对象的临时副本。因此,要求复制构造函数本身调用复制构造函数(这将是一个递归调用)不是逻辑
答案 2 :(得分:2)
我检查过如果在构造函数中我通过引用传递参数,那么它编译得很好,但是我不会按照我正在做的方式工作。为什么会这样?
您正在定义如何制作Cents
的副本。
您 必须 获取参考参数,因为如果您尝试按值获取该参数,则该值将是副本。