为什么不允许复制构造函数按值传递?

时间:2011-12-08 19:24:45

标签: c++ constructor

  

可能重复:
  Why should the copy constructor accept its parameter by reference in C++?
  Can a object be passed as value to the copy constructor

考虑这段代码:

class complex{
        private:
                double re, im;
        public:
                complex(double _re, double _im):re(_re),im(_im){}
                complex(complex c):re(c.re),im(c.im){}
};

编译时,我收到一条错误消息:invalid constructor; you probably meant ‘complex (const complex&)’

在书C++ Programming Language中写道:

  

复制构造函数定义了复制的含义 - 包括什么   复制参数意味着 - 所以写

     

复杂:复杂(复杂c):re(c.re),im(c.im){} //错误

     

是一个错误,因为任何调用都会涉及无限递归。

为什么会导致无限递归?这没有意义。

3 个答案:

答案 0 :(得分:32)

按值传递意味着参数 复制 进入函数。这称为复制构造函数。

如果您的复制构造函数参数是按值传递的......它会自己调用......一遍又一遍......

答案 1 :(得分:9)

按值传递(而不是通过引用)意味着需要复制。因此,将值传递到复制构造函数意味着您需要在调用复制构造函数之前制作副本,但需要创建copy you first need to call the copy constructor

答案 2 :(得分:1)

当函数与参数一起传递时,会创建与参数对应的局部变量,并使用传递给函数调用的参数进行复制。因此,在调用函数时,将调用函数的复制构造函数,以将传递给调用的参数复制到创建的局部变量。这导致无限循环。

当引用传递给函数时,不会创建与参数对应的局部变量。