为什么不允许复制构造函数按值传递
Why is copy constructor not allowed pass by value?
可能的重复项:
为什么复制构造函数应该在 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
是一个错误,因为任何调用都会涉及无限递归。
为什么这会导致无限递归?这没有意义。
按值传递意味着将参数复制到函数中。这将调用复制构造函数。
如果复制构造函数参数是按值传递的...它会称自己为...一遍又一遍...
按值(而不是按引用(传递意味着需要创建副本。因此,将值传递到复制构造函数中意味着您需要在调用复制构造函数之前创建副本,但要创建副本,您首先需要调用复制构造函数。
当函数与参数一起传递时,将创建与参数对应的局部变量,并将参数复制到函数调用中。因此,当调用函数时,将调用函数的复制构造函数以将传递给调用的参数复制到创建的局部变量。这会导致无限循环。
当引用传递给函数时,不会创建与参数对应的局部变量。
相关文章:
- 将函数参数完美转发到函数指针:按值传递呢?
- 获取 std::函数以推断按引用传递/按值传递
- 在函数中按值传递 unordered_map/unordered_set 是否有效? C++
- 使用 enable_if 在按值传递与按引用传递之间更改函数声明
- 为什么在按值返回时创建临时对象,而不是在按值传递给函数参数时创建临时对象
- shared_ptr构造函数参数是否应按值传递
- 复制构造函数、按值传递和按值返回、链式操作、编译器
- 如果函数按值传递并按值返回,将调用复制构造函数多少次
- 引用成员到构造函数参数按值传递
- std::auto_ptr 在按值传递给函数后变为无效
- 当函数按值传递参数时,复制构造函数如何工作
- C++11:在按值传递参数初始化时转换构造函数和转换函数之间的歧义
- 为什么在按值传递时不调用构造函数
- 为什么不允许复制构造函数按值传递
- 是在按值传递参数时保证的复制构造函数调用
- 为什么即使对象没有复制构造函数,也可以按值传递对象
- 按值传递给函数和按值传递给另一个构造函数时,调用构造函数有什么不同?
- 由于超类(按值传递)导致重载构造函数调用不明确
- 在按值传递的重成员的构造函数初始化列表中是否真的需要std::move ?
- 按值传递对象时出现断言错误--它是我的复制构造函数