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

Why is copy constructor not allowed pass by value?

本文关键字:按值传递 构造函数 复制 不允许 为什么      更新时间:2023-10-16

可能的重复项:
为什么复制构造函数应该在 C++ 中通过引用接受其参数?
是否可以将对象作为值传递给复制构造函数

考虑这段代码:

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书中写道:

复制

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

Complex : complex(

complex C( :re(c.re( , im(c.im( { }//error

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

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

按值传递意味着将参数复制到函数中。这将调用复制构造函数。

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

按值(而不是按引用(传递意味着需要创建副本。因此,将值传递到复制构造函数中意味着您需要在调用复制构造函数之前创建副本,但要创建副本,您首先需要调用复制构造函数。

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

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