【发布时间】:2013-03-07 18:31:50
【问题描述】:
考虑以下语句:-
Class A a = b;//Where is b is existing object of class A.
A 类同时具有复制构造函数和赋值运算符重载(实现)。所以在这种情况下,将调用上述语句、复制构造函数或赋值运算符或两者?
【问题讨论】:
标签: c++
考虑以下语句:-
Class A a = b;//Where is b is existing object of class A.
A 类同时具有复制构造函数和赋值运算符重载(实现)。所以在这种情况下,将调用上述语句、复制构造函数或赋值运算符或两者?
【问题讨论】:
标签: c++
这称为 Copy initialization。
复制初始化定义为:
T t2 = t1;
根据t1 的类型,可能有两种情况:
如果
t1不属于类型T:
t1 转换为类型 T 和t2。如果
t1属于类型T:
t1 复制到t2。请注意,复制构造函数调用可能通过 copy elision省略。
这里不涉及分配。仅当您将已构造的对象分配给另一个时,才会发生分配。您的代码语句在一个语句中涉及构造和赋值,因此本身没有赋值。
【讨论】:
b 已经是 class A 的对象。如果 b 不是class A 的对象,AFAIK 将创建临时对象。在我看来,我们有“直接初始化”的情况......
b 是 A 类型,因此在这种情况下,效果被定义为与直接初始化完全相同。
A a=b;和这里的A a(b);是一样的,不过还是叫拷贝初始化。
在这种情况下,复制构造函数被调用。因为“A 类”类对象“a”是复制已构造的“A 类”对象 b 的值而构造的。
不可能调用作用于两个已创建对象的赋值运算符。
【讨论】: