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