为什么复制构造函数在C ++中通过引用接受它的参数?
为什么复制构造函数必须通过引用传递参数?
因为如果不是通过引用,它是有价值的。 要做到这一点,你做了一个副本,并做到这一点你调用复制构造函数。 但要做到这一点,我们需要创造一个新的价值,所以我们调用复制构造函数,等等…
(你会有无限的recursion,因为“做一个副本,你需要做一个副本”)。
因为传值会调用复制构造函数:)
传递引用的替代方法是传值。 通过值是真正的通过副本。 复制构造函数需要复制。
如果你只是为了复制构造函数而创build一个副本,那将是一个难题。
(我认为无限recursion会发生在编译器中,你永远不会得到这样的程序。)
除了合理的理由,第12.8 / 3条的标准也禁止这样做:
如果类X的第一个参数是type(可选的是cv-qualified)X并且没有其他参数,否则所有其他参数都具有默认参数,那么对于类X的构造函数的声明是不合格的。
如果你通过价值传递,那将是无限的recursion
无论何时调用一个函数(例如:int f(car c)),该函数的参数都不是内置数据types(这里是car),则需要将调用者提供的实际对象复制到被调用函数的参数中的variables中。
例如:car carobj; F(carobj);
即将carobj复制到c。
carobj需要应付函数f中的参数c。
为了实现复制,复制构造函数被调用。
在这种情况下,函数f使用按值传递或换句话说函数f被声明为按值传递。
如果函数f按引用传递,则其声明为int f(car&c);
在这种情况下,汽车carobj; F(carobj); 不需要复制构造函数。
在这种情况下,c成为carobj的别名。
使用上述2场景,为了清晰起见,我将它们概括为:1.如果一个函数声明了一个参数作为一个对象的值,则调用该对象的复制构造函数。 2.如果声明了一个参数为通过引用的函数,则该参数将成为调用者提供的对象的别名。 不需要复制构造函数!
现在的问题是为什么通过引用是必需的。 如果复制构造函数接受引用,则接收variables将成为提供对象的别名。 因此,不需要复制构造函数(在这种情况下,调用自身)来复制调用方提供的对象中的值,以将构造函数的variables复制到参数列表中。
否则,如果拷贝构造函数将调用者提供的对象作为值,即按值传递,则需要拷贝给定对象的构造函数; 因此,为了从调用者获得提供的对象到我们的函数本身(在这种情况下是复制构造函数),我们需要调用复制构造函数,这只是在函数参数初始化期间调用相同的函数。 这是传递复制构造函数的引用的原因。
如果它没有通过引用传递,那么它会传递值。 如果参数是按值传递的,那么它的拷贝构造函数会调用它自己将实际的参数复制到forms参数中。 这个过程将继续下去,直到系统内存不足。 所以,我们应该通过引用来传递它,这样copy构造函数就不会被调用。
传递对象作为参考是非常重要的。 如果一个对象作为值传递给复制构造函数,那么它的复制构造函数会调用它自己,将实际参数复制到forms参数中。 因此,复制构造函数的连续调用将启动。 这个过程将继续,直到系统内存不足。
因此,在复制构造函数中,参数应始终作为参考传递。
有必要将对象作为参考传递,而不是按值传递,因为如果按值传递它的副本,则使用副本构造函数构造副本。这意味着副本构造函数将自行调用以进行副本。此过程将继续,直到编译器耗尽的记忆。