我可以显式调用复制构造函数吗?

Ale*_*lex 16 c++ copy-constructor

我对复制构造函数的机制有点困惑.如我错了请纠正我:

如果一个方法将一个对象的引用作为参数,并且该类定义了一个复制构造器,那么该类使用构造函数来创建自身的副本,并将其传递给函数而不是对原始对象的引用?

此外,人们可以打电话

Object * obj = new Object(&anotherObject);
Run Code Online (Sandbox Code Playgroud)

创建另一个对象的副本?

小智 27

不,如果函数需要参考:

void f1( Object & o );   // call by reference
Run Code Online (Sandbox Code Playgroud)

然后没有复制.如果函数采用值:

void f2( Object o );   // call by value
Run Code Online (Sandbox Code Playgroud)

然后编译器使用复制构造函数创建一个副本.

是的,当你说:

Object * obj = new Object(anotherObject);   // not &anotherObject
Run Code Online (Sandbox Code Playgroud)

显式使用复制构造函数(假设anotherObject的类型为Object.)new然而,在这里使用没有什么神奇之处- 在这种情况下:

Object obj2(anotherObject);
Run Code Online (Sandbox Code Playgroud)

也使用了复制构造函数.

  • "然后编译器使用复制构造函数创建一个副本." - 它可能使用move-constructor,而且这也是一个copy-elision场景,所以甚至根本就没有构造函数. (2认同)

Meh*_*ari 7

如果方法将对象的引用作为参数,则不会调用复制构造函数.如果是这种情况,那么对复制构造函数本身的调用将导致无限循环(因为它将引用作为参数).

该行不是调用复制构造函数的有效方法.它期望引用作为参数,而不是指针.