编辑:对不起,我在原始帖子中使用了“赋值构造函数”而不是“赋值运算符”。立即修复。

事实证明,在以下代码中将调用复制构造函数而不是赋值运算符。有人可以告诉我这背后的原因吗?谢谢。

class A

{
int i;
public:
A(int ii) { i = ii; }
A(const A& a) { i = a.i; i++; }
A& operator=(const A& a) { i = a.i; i--; }
};
int main(void)
{
A a(4);
A b = a;
return 0;
}

最佳答案

A a(4);
A b = a;


它们都不是Assignment1。两者都是初始化。

第一个称为直接初始化,第二个称为复制初始化。

它们之间的区别在于,即使无法访问复制构造函数(即privateprotected),第一个也可以工作;如果无法访问复制构造函数,则第二个将不起作用。

尽管第二个要求复制构造函数是可访问的,但这并不意味着必须调用复制构造函数。允许编译器对此进行优化,因此可以完全取消对copy-constructor的调用。需要一个可访问的复制构造函数进行语义验证。

请参阅以下主题:


Is there a difference in C++ between copy initialization and direct initialization?
When should you use direct initialization and when copy initialization?
c++ copy initialization & direct initialization, the weird case


1.没有这样的东西叫做“赋值构造函数”。

07-26 03:10