copy-constructor相关问题(native c ++)

时间:2011-08-29 12:03:52

标签: c++ class syntax copy-constructor

  

可能重复:
  Why should the copy constructor accept its parameter by reference in C++?

我知道复制构造函数必须有一个引用作为参数,以避免对自身进行“无限次调用”。我的问题是 - 为什么会发生这种情况,背后的逻辑是什么?

CExample(const CExample& temp)
{
   length = temp.length;
}

3 个答案:

答案 0 :(得分:6)

假设您对副本C'tor的参数是通过值传递的,C'tor会做的第一件事就是复制参数[这就是每个函数,包括构造函数使用by-value参数]。为了做到这一点,它必须再次调用C'tor,从原始变量到局部变量...... [并且一遍又一遍......]最终会导致无限循环。

答案 1 :(得分:2)

在C ++中有时会调用复制构造函数。其中之一就是当你有像

这样的功能时
void f(CExample obj)
{
    // ...
}

在这种情况下,当您拨打电话时

CExample x;
f( x );
调用

CExample::CExampleobj构建x

如果您有以下签名

void f(CExample &obj)
{
     // ...
}

(请注意obj现在通过引用传递),复制构造函数CExample::CExample 不会被调用。

如果构造函数接受要按值复制的对象(与第一个示例中的函数f一样),编译器必须按顺序调用复制构造函数 first 创建一个副本(与函数f一样),但是......哎呀,我们必须调用复制构造函数来调用复制构造函数。这听起来很糟糕,不是吗?

答案 2 :(得分:1)

See here

“它是一个引用,因为一个值参数需要制作一个副本,它将调用复制构造函数,它将复制其参数,这将调用复制构造函数,...”

或者以不同的方式,构造函数的值参数必须调用构造函数来复制参数中的值。这个新的构造函数需要做同样的事情 - 导致无限递归!