为什么复制建构子的参数必须通过引用传递?
因为如果不是通过引用,那就是通过值。要做到这一点,你需要复制一份,然后打电话给复制建构子。但要做到这一点,我们需要创建一个新的值,所以我们调用复制建构子,以此类推... ..。
(你会有无限递归,因为“要复制,你需要复制”。)
因为 pass-by-value 会调用复制建构子:)
如果通过值传递它,它将是无限递归的
通过引用传递的替代方法是通过值传递(Pass-by-value) ,通过值传递实际上是通过拷贝传递(pass-by-copy) ,制作拷贝需要复制建构子。
如果你只是为了打电话给复制建构子而复制一份,那将是一个难题。
(我认为在编译器中会出现无限递归,而且你永远不会得到这样的程序。)
除了 理智的原因,12.8/3版本的标准禁止使用:
对象的构造函数的声明 如果类 X 的第一个 参数的类型(可选 cv- 不符合资格人士) 其他参数或其他所有其他参数 参数有默认参数。
无论何时调用函数(例如: int f (car c)) 它使用内置数据类型以外的参数(这里是 car) 复制调用者提供的实际对象的要求 到被调用函数的参数中的变量。 例如:
汽车; F (carobj) ;
就是把 carobj拷贝到 c。
carobj
c
需要将 carobj复制到函数 f中的参数 c。
f
为了达到复制的目的,复制建构子被称为。
在这种情况下,函数 f调用使用传递值,或者换句话说,函数 f被声明采用传递值。
如果函数 f通过引用传递,那么它的声明是 int f(car &c);
int f(car &c);
在这种情况下, 汽车; F (carobj) ;
不需要复制建构子。
在这种情况下,c成为 carobj的别名。
使用以上两种情况,为了让你更清楚,我将它们总结为:
如果一个函数被声明接受一个参数作为一个对象的值,那么这个对象的复制建构子就被调用。
如果一个函数被声明为接受一个参数作为“通过引用传递”,那么该参数将成为调用者提供的对象的别名。不需要复制建构子!
现在的问题是为什么需要通过引用传递。如果复制建构子接受引用,接收变量就成为所提供对象的别名。因此,不需要复制建构子(在这种情况下,调用自身)将调用方提供的对象中的值复制到参数列表中复制建构子的变量中。
否则,如果复制建构子将调用方提供的对象作为值,即通过值传递,那么它就需要给定对象的复制建构子,因此,为了将调用方提供的对象传递到函数本身(在这种情况下是复制建构子) ,我们需要调用复制建构子,这不过是在函数声明期间调用同一个函数。
这就是为什么要提及复制建构子。
将对象作为引用传递是非常重要的。如果一个对象作为值传递给复制建构子,那么它的复制建构子会调用自己,将实际参数复制到形式参数。 因此,一连串的复制建构子呼叫将被启动。这个过程将一直进行,直到系统耗尽内存。
因此,在复制建构子中,参数应始终作为引用传递。
如果它不通过引用传递,那么它将通过值传递。如果参数是通过值传递的,那么它的复制建构子就会调用自己将实际参数复制到形式参数。这个过程将一直进行,直到系统耗尽内存。 因此,我们应该通过引用传递它,这样复制建构子就不会被调用。
有必要传递对象作为引用,而不是通过值,因为如果你通过值传递对象,它的副本是使用复制建构子构造的。这意味着复制建构子会自称为“复制者”。这个过程将一直进行,直到编译器耗尽内存。
复制建构子定义了复制的含义,所以如果我们只传递一个对象(我们将传递该对象的副本) ,但是要创建副本,我们需要一个复制建构子,因此它导致无限递归。
因此,复制建构子必须有一个参考作为参数。