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

时间:2012-06-27 07:22:12

标签: c++

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

A a;
B b=a;

从技术上讲,是否在创建b

时应用了复制构造函数

4 个答案:

答案 0 :(得分:14)

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

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

答案 1 :(得分:7)

  

从技术上讲,这是在创建b?

时应用的复制构造函数

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

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


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

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

Is there a difference in C++ between copy initialization and direct initialization?

答案 2 :(得分:3)

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

C ++ 03 12.1构造函数

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

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

EDIT2:为了更公平,根本没有必要对它进行调用:

A a;
B b = a;   //called
B c = A(); //probably not called due to copy elision

答案 3 :(得分:0)

没有。它是不是复制构造函数。

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

A a;
A b=a;

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