137

为什么必须通过引用传递复制构造函数的参数?

4

9 回答 9

204

因为如果它不是通过引用,它是通过值。为此,您制作一个副本,并为此调用复制构造函数。但要做到这一点,我们需要创建一个新值,所以我们调用复制构造函数,等等......

(您将有无限递归,因为“要制作副本,您需要制作副本”。)

于 2010-04-21T19:14:41.770 回答
72

因为按值传递会调用复制构造函数:)

于 2010-04-21T19:15:43.600 回答
24

传递引用的替代方法是传递值。Pass-by-value 实际上是 pass-by-copy。需要复制构造函数来制作副本。

如果您必须复制只是为了调用复制构造函数,那将是一个难题。

(我认为无限递归会发生在编译器中,你永远不会真正得到这样的程序。)

除了合理的原因,第 12.8/3 节中的标准禁止这样做:

如果类 X 的第一个参数是类型(可选 cv 限定)X 并且没有其他参数或者所有其他参数都具有默认参数,则类 X 的构造函数声明是格式错误的。

于 2010-04-21T19:30:52.020 回答
14

如果您按值传递它将是无限递归的

于 2010-04-21T19:16:06.637 回答
9

每当你调用一个函数(例如:int f(car c)),它的参数不是内置数据类型(这里是 car),需要将调用者提供的实际对象复制到被调用函数参数中的变量。
例子:

car carobj; f(carobj);

也就是说,复制carobjc.

carobj需要复制到c函数中的参数f

为了实现复制,调用了复制构造函数。

在这种情况下,f使用按值传递调用的函数,或者换句话说,函数f被声明为按值传递。

如果函数f通过引用传递,那么它的声明是 int f(car &c);

在这种情况下,
car carobj; f(carobj);

不需要复制构造函数。

在这种情况下,c成为 的别名carobj

使用上述两种情况,为了您的清楚,我将它们总结为:

  1. 如果函数被声明为将参数作为对象的值,则调用该对象的复制构造函数。

  2. 如果函数被声明为将参数作为“按引用传递”,则该参数将成为调用者提供的对象的别名。不需要复制构造函数!

现在的问题是为什么需要通过引用传递。如果复制构造函数接受引用,则接收变量将成为提供对象的别名。因此,不需要复制构造函数(在这种情况下,调用自身)将调用者提供的对象中的值复制到参数列表中的构造函数变量。

否则,如果复制构造函数将调用者提供的对象作为值,即按值传递,那么它需要给定对象的复制构造函数;因此,要将调用者提供的对象获取到我们的函数本身(在本例中为复制构造函数),我们需要调用复制构造函数,这只不过是在函数声明期间调用相同的函数。

这就是将引用传递给复制构造函数的原因。

于 2012-03-13T00:20:49.883 回答
6

It is necessary to pass object as reference and not by value because if you pass it by value its copy is constructed using the copy constructor.This means the copy constructor would call itself to make copy.This process will go on until the compiler runs out of memory.

于 2015-08-29T15:42:57.903 回答
1

将对象作为参考传递是非常重要的。如果一个对象作为值传递给复制构造函数,那么它的复制构造函数将调用自身,将实际参数复制到形式参数。因此,将启动对复制构造函数的无限调用链。这个过程将一直持续到系统内存不足。

因此,在复制构造函数中,参数应始终作为引用传递。

于 2014-01-29T10:07:23.637 回答
1

如果它不是按引用传递,那么它将按值传递。如果参数是按值传递的,它的复制构造函数会调用自己将实际参数复制到形参。这个过程会一直持续到系统内存不足。所以,我们应该通过引用传递它,这样复制构造函数就不会被调用。

于 2014-03-10T13:46:20.610 回答
0

A copy constructor defines what copying means,So if we pass an object only (we will be passing the copy of that object) but to create the copy we will need a copy constructor, Hence it leads to infinite recursion.

So, A copy constructor must have a reference as an argument.

于 2021-08-12T12:14:04.243 回答