这是一个复制构造函数吗?

Mic*_*ael 3 c++

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

A a;
B b=a;
Run Code Online (Sandbox Code Playgroud)

从技术上讲,这是一个复制构造函数在这里应用的创建b

CB *_*ley 14

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

但是,允许编译器(通常也会)忽略临时和复制结构,并b直接a使用B(A)构造函数构造.


Hos*_*ork 7

从技术上讲,这是一个复制构造函数,在这里应用于创建b?

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

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


编辑:每天都学到新东西.显然,更具技术性,正如@CharlesBailey指出的那样......如果使用B b = a;语法("复制初始化")而不是B b (a);语法("直接初始化"),可能需要创建类型B的临时值.此时B的拷贝构造函数最终会被调用.

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

复制初始化和直接初始化之间的C++有区别吗?

  • 从技术上讲,"B b = a;"相当于"B b(B(a))",因此也会调用"B"隐式创建的复制构造函数.:) (3认同)
  • @GManNickG我不明白为什么,看看B如何直接从A转换构造函数... (2认同)
  • 如果构造函数是`explicit`,则不能在初始化中使用`=`. (2认同)
  • @HostileFork:复制初始化其中作为对象被初始化和类型被初始化的初始化是相同类型的不不是引用类型需要初始化转换为一个临时正确的类型,然后将其用于指示按的初始化正在构造的对象.如果可能的话,允许编译器消除临时和复制(或移动)并将其简化为简单的直接初始化,但它不必. (2认同)