为什么不在这里调用赋值运算符?

EXP*_*XP0 0 c++ constructor

编辑:抱歉,我在原帖中使用了"赋值构造函数"而不是"赋值运算符".现在修复了.

事实证明,在以下代码中调用了复制构造函数而不是赋值运算符.谁能告诉我这背后的原因?谢谢.

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;
}
Run Code Online (Sandbox Code Playgroud)

Naw*_*waz 7

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

它们都不是作业1.两者都是初始化.

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

它们之间的区别在于,即使复制构造函数不可访问(即其中的一个private或者protected),第一个也可以工作,如果复制构造函数不可访问,则第二个工作将不起作用.

尽管第二个要求可以访问复制构造函数,但这并不意味着必须调用复制构造函数.允许编译器优化它,因此可以完全忽略对复制构造函数的调用.语义验证需要可访问的复制构造函数.

请参阅以下主题:

而且没有任何东西叫做"赋值构造函数".