编辑:抱歉,我在原帖中使用了"赋值构造函数"而不是"赋值运算符".现在修复了.
事实证明,在以下代码中调用了复制构造函数而不是赋值运算符.谁能告诉我这背后的原因?谢谢.
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)
A a(4);
A b = a;
Run Code Online (Sandbox Code Playgroud)
它们都不是作业1.两者都是初始化.
第一个称为直接初始化,第二个称为复制初始化.
它们之间的区别在于,即使复制构造函数不可访问(即其中的一个private
或者protected
),第一个也可以工作,如果复制构造函数不可访问,则第二个工作将不起作用.
尽管第二个要求可以访问复制构造函数,但这并不意味着必须调用复制构造函数.允许编译器优化它,因此可以完全忽略对复制构造函数的调用.语义验证需要可访问的复制构造函数.
请参阅以下主题:
而且没有任何东西叫做"赋值构造函数".