class A {};
class B { public: B (A a) {} };
A a;
B b=a;
从技术上讲,是否在创建b
?
答案 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构造函数
- 类X的复制构造函数是一个构造函数,其第一个参数类型为
醇>X&
或const X&
。
编辑:好的,公平(并在阅读其他答案后),正在调用一个复制构造函数,但它是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;
上面的代码是复制构造函数。