在C ++中重载`=`运算符

时间:2017-12-11 11:53:56

标签: c++ operator-overloading

我试图理解c ++中的重载运算符。我在下面写了一些代码试图重载=运算符。但是,它无法正常工作,我想知道为什么现在。

我已经按照此处为+运算符提供的示例进行了操作。

Operators Overloading in C++

#include <iostream>
using namespace std;

class Test {
private:
    int id;
    string name;

public:
    Test(): id(0), name(""){

    }

    Test(int id, string name): id(id), name(name) {

    }

    void print() {
        cout << id << ":" << name << endl;

    }
    Test operator=( Test &other) {

        Test test;
        cout << "Assignment running" << endl;

        test.id =other.id;
        test.name =other.name;

        return test;

    }
};

int main() {

    Test test1(10, "Mike");
    cout << "Print Test1" << endl;
    test1.print();

    Test test2;

    test2.operator=(test1);
    cout << "Print Test2" << endl;
    test2.print();


    cout << endl;

}

3 个答案:

答案 0 :(得分:4)

标准的

operator=应该修改 this,并返回对*this的引用(为了允许复合分配):

Test& operator=(const Test& other) {
    cout << "Assignment running" << endl;

    this->id = other.id;
    this->name = other.name;

    return *this;
}

请注意,我也将other作为const传递。您的版本不会修改this,这会产生令人惊讶的效果。

答案 1 :(得分:3)

因为与+不同,=需要修改有问题的对象,而不是您随后返回的临时变量。

Test& operator=(const Test &other) {

    cout << "Assignment running" << endl;

    id =other.id;
    name =other.name;

    return *this;
}

答案 2 :(得分:1)

首先考虑一下您期望的语义。由于重载运算符的重点在于您可以使用与内置运算符相同的语法,因此替换

test2.operator=(test1);

test2 = test1;
  • 首先,您对此表达式中test1的期望是什么?它应该改变吗?

    提示:答案是,因此右侧参数应该通过const引用传递。

  • 其次,您对此表达式中test2的期望是什么?它应该改变吗?

    是的,当然它应该改变,你要分配给它。因此,左侧参数应该由您的代码修改。请注意,在成员运算符中,左侧是this

所以,我们知道我们至少应该更改你的代码以通过const引用获取右侧参数,并且它应该修改this而不是在分配给临时时保持不变。< / p>

此外,所有这些运营商的规范形式是众所周知的并且有文件证明。例如,here

Test& operator=(const Test &other) {
    cout << "Assignment running" << endl;

    this->id =other.id;
    this->name =other.name;

    return *this;
}