class A {};
class B { public: B (A a) {} };
A a;
B b=a;
从技术上讲,复制构造函数是否在此处应用于创建b
?
是的,理论上。这是复制初始化。首先B
从初始化器 ( ) 构造一个临时实例a
,然后b
通过复制构造函数从这个临时实例初始化。
但是,编译器被允许并且经常这样做,省略临时和复制构造,并b
直接a
使用构造函数进行B(A)
构造。
从技术上讲,这里是否在创建 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++03 12.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
不,它不是复制构造函数。
如果您通过使用相同类的对象来初始化对象来创建对象,那就是复制构造函数。
A a;
A b=a;
上面的代码是复制构造函数。