Jon*_*ony 112 c++ constructor copy copy-constructor
为什么必须通过引用传递复制构造函数的参数?
GMa*_*ckG 173
因为如果它不是通过引用,它是按价值的.要做到这一点,你做一个副本,并为此,你调用复制构造函数.但要做到这一点,我们需要创建一个新值,所以我们调用复制构造函数,依此类推......
(你会有无限的递归,因为"要制作副本,你需要制作副本".)
Pot*_*ter 21
pass-by-reference的替代方法是pass-by-value.按值传递实际上是逐个复制的.复制构造函数需要进行复制.
如果你不得不复制只是为了调用复制构造函数,那将是一个难题.
(我认为无限递归会在编译器中发生,你实际上从来没有得到过这样的程序.)
除了合理的原因,§12.8/ 3中的标准禁止它:
如果类X的构造函数的第一个参数是类型(可选地是cv-限定的)X并且没有其他参数或者所有其他参数都具有默认参数,那么它的构造函数的声明是错误的.
小智 8
每当你调用一个函数(例如:int f(car c))它的参数不是内置数据类型(这里是 car)时,需要将调用者提供的实际对象复制到被调用函数参数中的变量。
例子:
car carobj;
f(carobj);
也就是说,复制carobj
到c
.
carobj
需要复制到c
函数中的参数f
。
为了实现复制,调用了复制构造函数。
在这种情况下,f
使用按值传递调用的函数或换句话说,函数f
被声明为按值传递。
如果函数f
通过引用传递,那么它的声明是
int f(car &c);
在这种情况下,
car carobj;
f(carobj);
不需要复制构造函数。
在这种情况下,c
成为 的别名carobj
。
使用上述 2 个场景,为了您的清晰起见,我将它们总结为:
如果函数被声明为将参数作为对象的值,则调用该对象的复制构造函数。
如果函数被声明为采用“通过引用传递”的参数,则该参数将成为调用者提供的对象的别名。不需要复制构造函数!
现在的问题是为什么需要通过引用传递。如果复制构造函数接受引用,则接收变量将成为所提供对象的别名。因此,不需要复制构造函数(在这种情况下,调用自身)将调用者提供的对象中的值复制到参数列表中复制构造函数的变量。
否则,如果复制构造函数将调用者提供的对象作为值,即传值,那么它需要给定对象的复制构造函数;因此,为了从调用者那里获取提供的对象到我们的函数本身(在这种情况下是复制构造函数),我们需要调用复制构造函数,它只是在函数声明期间调用相同的函数。
这就是将引用传递给复制构造函数的原因。