【发布时间】:2020-11-01 19:14:14
【问题描述】:
为什么在这种情况下不调用重载运算符(具体来说是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?
}
【问题讨论】:
-
并非所有包含
=的都是作业。mc j = i;不是赋值,而是初始化。它使用复制构造函数。 -
@IgorTandetnik 谢谢。我明白你的意思了。但是我仍然对编译器如何处理这种情况感到困惑。当它在
main中看到=时,首先要做的是查找要调用的operator=函数。这不正确吗? -
这是不正确的。
type var=init;声明了一个名为var类型为type的变量,并用表达式init对其进行初始化;这不是一个任务,并且从不使用operator=。var = value;将value赋值给变量。它不像“寻找等号”那么简单。 C++ 语法中的其他地方等号并不意味着赋值 - 例如默认参数:void f(int x = 42);
标签: c++ copy-constructor copy-assignment