可能重复:
Why should the copy constructor accept its parameter by reference in C++?
我知道复制构造函数必须有一个引用作为参数,以避免对自身进行“无限次调用”。我的问题是 - 为什么会发生这种情况,背后的逻辑是什么?
CExample(const CExample& temp)
{
length = temp.length;
}
答案 0 :(得分:6)
假设您对副本C'tor的参数是通过值传递的,C'tor会做的第一件事就是复制参数[这就是每个函数,包括构造函数使用by-value参数]。为了做到这一点,它必须再次调用C'tor,从原始变量到局部变量...... [并且一遍又一遍......]最终会导致无限循环。
答案 1 :(得分:2)
在C ++中有时会调用复制构造函数。其中之一就是当你有像
这样的功能时void f(CExample obj)
{
// ...
}
在这种情况下,当您拨打电话时
CExample x;
f( x );
调用 CExample::CExample
从obj
构建x
。
如果您有以下签名
void f(CExample &obj)
{
// ...
}
(请注意obj
现在通过引用传递),复制构造函数CExample::CExample
不会被调用。
如果构造函数接受要按值复制的对象(与第一个示例中的函数f
一样),编译器必须按顺序调用复制构造函数 first 创建一个副本(与函数f
一样),但是......哎呀,我们必须调用复制构造函数来调用复制构造函数。这听起来很糟糕,不是吗?
答案 2 :(得分:1)
“它是一个引用,因为一个值参数需要制作一个副本,它将调用复制构造函数,它将复制其参数,这将调用复制构造函数,...”
或者以不同的方式,构造函数的值参数必须调用构造函数来复制参数中的值。这个新的构造函数需要做同样的事情 - 导致无限递归!