3
class A {};
class B { public: B (A a) {} };

A a;
B b=a;

从技术上讲,复制构造函数是否在此处应用于创建b?

4

4 回答 4

14

是的,理论上。这是复制初始化。首先B从初始化器 ( ) 构造一个临时实例a,然后b通过复制构造函数从这个临时实例初始化。

但是,编译器被允许并且经常这样做,省略临时和复制构造,并b直接a使用构造函数进行B(A)构造。

于 2012-06-27T07:28:09.707 回答
7

从技术上讲,这里是否在创建 b 时应用了复制构造函数?

是的……但可能不是你想的那样。 A的复制构造函数在创建 b 时被调用,以便将参数的值传递A a作为 B 构造函数的参数。

但是,它并没有在创建 b 时运行 B 的复制构造函数。


编辑:一个人每天都会学到新东西。显然,从技术上讲,正如@CharlesBailey 指出的那样……如果您使用B b = a;语法(“复制初始化”)而不是语法(“直接初始化”),则可能需要创建B b (a);B 类型的临时值。此时 B 的复制构造函数将被调用。

研究这种现象有点困难,但 Charles 指出 gcc 有一个-fno-elide-constructors选项(也:Wikipedia on Copy Elision)@JesseGood 的链接有详尽的解释和一些演示代码:

复制初始化和直接初始化在 C++ 中有区别吗?

于 2012-06-27T07:27:25.953 回答
3

不,复制构造函数引用同类型的对象。

C++03 12.1 构造函数

  1. 类 X的复制构造函数X&是第一个参数类型为or的构造函数const X&

编辑:好的,公平地说(在阅读其他答案之后),正在调用复制构造函数,但它A复制构造函数。我以为你的意思是B's。

EDIT2:为了公平起见,根本没有必要调用它:

A a;
B b = a;   //called
B c = A(); //probably not called due to copy elision
于 2012-06-27T07:23:25.367 回答
0

不,它不是复制构造函数。

如果您通过使用相同类的对象来初始化对象来创建对象,那就是复制构造函数。

A a;
A b=a;

上面的代码是复制构造函数。

于 2012-06-27T07:28:38.617 回答