简体   繁体   中英

Why should the copy constructor accept its parameter by reference in C++?

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

Because if it's not by reference, it's by value. To do that you make a copy, and to do that you call the copy constructor. But to do that, we need to make a new value, so we call the copy constructor, and so on...

(You would have infinite recursion because "to make a copy, you need to make a copy".)

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

The alternative to pass-by-reference is pass-by-value. Pass-by-value is really pass-by-copy. The copy constructor is needed to make a copy.

If you had to make a copy just to call the copy constructor, it would be a conundrum.

(I think the infinite recursion would occur in the compiler and you'd never actually get such a program.)

Besides rational reasons, it's forbidden by the standard in §12.8/3:

A declaration of a constructor for a class X is ill-formed if its first parameter is of type (optionally cv- qualified) X and either there are no other parameters or else all other parameters have default arguments.

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

whenever you call a function (example: int f(car c)) which takes its arguments other than built-in data types (here car) a requirement to copy the actual object supplied by the caller to the variable in the called function's parameter.
example:

car carobj; f(carobj);

that is, copy carobj to c .

carobj needs to be copied to the parameter c in function f .

To achieve copying, the copy constructor is called.

In this case, function f called using pass by value or in other words, function f is declared to take pass by value.

If function f takes pass by reference, then its declaration is int f(car &c);

In this case,
car carobj; f(carobj);

does not need a copy constructor.

In this case, c becomes the alias of carobj .

Using the above 2 scenarios, for your clarity I am summarizing them as:

  1. If a function is declared to take a parameter as value of a object, then the copy constructor of the object is called.

  2. If a function is declared to take a parameter as "pass by reference", the parameter becomes an alias of the object supplied by the caller. No need of a copy constructor!

Now the question is why pass by reference is required. If copy constructor accepts reference, the receiving variable become aliases of supplied object. Hence, no need of copy constructor (in this case, call to itself) to copy the value in caller supplied object to copy constructor's variable in argument list.

Otherwise, if copy constructor takes the caller supplied object as value, ie pass by value, then it needs the copy constructor of the given object; hence, to get the supplied object from caller into our function itself (in this case the copy constructor) we need to call the copy constructor, which is nothing but calling the same function during function declaration.

That's the reason for passing a reference to a copy constructor.

必须将对象作为引用而不是按值传递,因为如果按值传递它的副本是使用复制构造函数构造的。这意味着复制构造函数将调用自身进行复制。此过程将一直持续到编译器运行完毕的记忆。

It is very essential to pass objects as reference. If an object is passed as value to the Copy Constructor then its copy constructor would call itself, to copy the actual parameter to the formal parameter. Thus an endless chain of call to the copy constructor will be initiated. This process would go on untill the system run out of memory.

Hence, in a copy constructor, the parameter should always be passed as reference.

If its not passed by reference then it would pass by value. If the argument is passed by value, its copy constructor would call itself to copy the actual parameter to formal parameter. This process would go on until the system runs out of memory. So, we should pass it by reference , so that copy constructor does not get invoked.

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM