我试图理解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;
}
答案 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;
}