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

Amu*_*umu 17 c++ constructor

可能重复:
为什么复制构造函数应该通过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){}
};
Run Code Online (Sandbox Code Playgroud)

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

在书中C++ Programming Language,写道:

复制构造函数定义了复制的含义 - 包括复制参数的含义 - 所以写作

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

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

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

Mys*_*ial 33

按值传递意味着将参数复制到函数中.这称为复制构造函数.

如果你的拷贝构造函数参数是按值传递的...它会自己调用......一遍又一遍......


Lau*_*ves 9

通过值(而不是通过引用)传递意味着需要进行复制.因此,将值传递到复制构造函数意味着您需要在复制构造函数被调用之前制作副本,但是要创建副本,首先需要调用复制构造函数.