可能重复:
Why should the copy constructor accept its parameter by reference in C++?
Why is copy constructor not allowed pass by value?
我正在阅读关于C ++课程的讲义。在注释中,他们说类的复制构造函数签名是
MyClass(MyClass& other)
和
MyClass(MyClass other)
不起作用。那是为什么?
谢谢!
答案 0 :(得分:15)
因为MyClass(MyClass other)
正在按值传递参数,而这本身需要创建一个副本。这将导致无限循环(仅在堆栈溢出时终止)。
答案 1 :(得分:3)
这是因为为了将MyClass other
的实例传递给具有第二个签名的构造函数,构造函数需要调用它自己,导致无限的再生导致堆栈溢出。
尝试一下,这是一项非常有益的练习!
答案 2 :(得分:2)
MyClass(MyClass other)
正在通过副本传递other
,它将调用您正在定义的复制构造函数,因此您最终会得到无限递归。
答案 3 :(得分:1)
MyClass(MyClass other)
已创建other
的副本,因为您将参数other
作为变量而不是参考,所以这种情况下的复制构造函数将毫无意义
答案 4 :(得分:1)
有效的复制构造函数签名是
MyClass(MyClass &other)
MyClass(const MyClass &other)
MyClass(MyClass const &other)
在C ++中,所有函数参数都按值传递。这意味着如果你按值传递other
,它将在函数调用操作符完成后被销毁。
而且,在复制构造函数的情况下,将满足复制构造函数执行的无限循环。
因此,复制构造函数参数始终通过引用传递。