【问题标题】:Copy assignment operator= is not called不调用复制赋值运算符=
【发布时间】: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


【解决方案1】:

主要规则是:

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

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

difference between copy constructor and assignment operator

【讨论】:

  • 谢谢。我明白你的意思了。但我想更深入地研究编译器如何处理这种情况。当它在 main 中看到 = 时,首先要做的是寻找一个 operator= 函数来调用。对吗?
  • 编译器首先检查 var 声明,如 int i;并为该对象分配所需的内存,然后调用适当的构造函数。但是当它看到 var i=k;然后不是调用构造函数,然后是赋值运算符,而是直接调用复制构造函数
猜你喜欢
  • 2017-11-21
  • 2015-05-23
  • 1970-01-01
  • 1970-01-01
  • 2011-11-16
  • 2013-12-04
  • 2020-02-28
  • 2020-04-09
  • 1970-01-01
相关资源
最近更新 更多