未调用复制赋值 operator=

Copy assignment operator= is not called

提问人:o_yeah 提问时间:11/2/2020 更新时间:11/2/2020 访问量:394

问:

为什么在这种情况下不调用重载运算符(operator=)?

#include<iostream>
using namespace std;

class mc{
    public:
        mc()=default;
        mc(mc& that){cout<<1;} //simplified copy constructor
        mc& operator=(mc& that){cout<<2; return that;} // simplified copy assignment operator
        mc operator=(mc that){cout<<2; return that;}   // another simplified copy assignment operator
};

int main(){
    mc i;       //call default constructor
    mc j = i;   //Why this line calls j's copy constructor? 
                //It used "=" symbol, how come copy assignment operator (operator=) is not called? 
}
C++ 构造函数 复制 赋值

评论

2赞 Igor Tandetnik 11/2/2020
并非所有内容都包含作业。 不是赋值,而是初始化。它使用 copy 构造函数。=mc j = i;
0赞 o_yeah 11/2/2020
@IgorTandetnik 谢谢。我明白你的意思。但我仍然对编译器如何处理这种情况感到困惑。当它看到 时,首先要做的是查找要调用的函数。这不对吗?=mainoperator=
1赞 Igor Tandetnik 11/2/2020
这是不正确的。 声明一个名为 type 的变量,并用表达式 初始化它;这不是赋值,并且从不使用 . 对变量执行赋值。这并不像“寻找等号”那么简单。在C++语法中,还有其他地方,等号并不意味着赋值 - 例如默认参数:type var=init;vartypeinitoperator=var = value;valuevoid f(int x = 42);

答:

3赞 Ahmed Anter 11/2/2020 #1

主要规则是:

创建新对象时使用复制构造函数。

如果要更改现有对象的值,则使用赋值运算符。

复制构造函数和赋值运算符之间的区别

评论

0赞 o_yeah 11/2/2020
谢谢。我明白你的意思。但我想更深入地研究编译器如何处理这种情况。当它在 main 中看到 = 时,首先要做的是查找要调用的 operator= 函数。这是对的吗?
1赞 Ahmed Anter 11/2/2020
编译器检查 var 声明的第一件事,如 int i;并为该对象分配所需的内存,然后调用相应的构造函数。但是当它看到 var i=k;然后,它不是调用构造函数,而是直接调用复制构造函数,而不是调用赋值运算符