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

时间:2011-08-28 20:50:43

标签: 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;
}

2 个答案:

答案 0 :(得分:7)

A a(4);
A b = a;

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

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

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

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

请参阅以下主题:

1。而且没有任何东西叫做“赋值构造函数”。功能

答案 1 :(得分:4)

operator=不是“赋值构造函数”,它是“赋值运算符”。

在其定义中初始化变量时(如在A b = a中),根据定义,它等同于调用复制构造函数。即,A b(a);A b = a;完全等效。