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

why isn't assignment operator called here?

本文关键字:赋值运算符 调用 这里 为什么      更新时间:2023-10-16

编辑:对不起,我在原始帖子中使用了"赋值构造函数"而不是"赋值操作符"。现在固定。

在下面的代码中调用复制构造函数而不是赋值操作符。有人能告诉我这背后的原因吗?谢谢你。

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;

它们都不是赋值1。两者都是初始化。

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

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

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

查看以下主题:

    在c++中拷贝初始化和直接初始化有区别吗?什么时候应该使用直接初始化,什么时候应该使用复制初始化?
  • c++拷贝初始化&直接初始化,奇怪的情况

<一口> 1。也没有这样的东西叫做赋值构造函数。

operator=不是"赋值构造函数",而是"赋值操作符"。

当您在定义中初始化变量时(如A b = a中),根据定义,它相当于调用复制构造函数。例如,A b(a);A b = a;是完全相等的。