Max*_*xpm 2 c++ class operator-overloading operators assignment-operator
我做了以下运算符重载测试:
#include <iostream>
#include <string>
using namespace std;
class TestClass
{
string ClassName;
public:
TestClass(string Name)
{
ClassName = Name;
cout << ClassName << " constructed." << endl;
}
~TestClass()
{
cout << ClassName << " destructed." << endl;
}
void operator=(TestClass Other)
{
cout << ClassName << " in operator=" << endl;
cout << "The address of the other class is " << &Other << "." << endl;
}
};
int main()
{
TestClass FirstInstance("FirstInstance");
TestClass SecondInstance("SecondInstance");
FirstInstance = SecondInstance;
SecondInstance = FirstInstance;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
赋值运算符的行为与预期一致,输出另一个实例的地址.
现在,我将如何实际分配来自其他实例的内容?例如,像这样:
void operator=(TestClass Other)
{
ClassName = Other.ClassName;
}
Run Code Online (Sandbox Code Playgroud)
赋值运算符的传统规范形式如下所示:
TestClass& operator=(const TestClass& Other);
Run Code Online (Sandbox Code Playgroud)
(您也不想调用复制构造函数进行赋值)并返回对它的引用*this.
一个简单的实现将分别为每个数据成员分配:
TestClass& operator=(const TestClass& Other)
{
ClassName = Other.ClassName;
return *this;
}
Run Code Online (Sandbox Code Playgroud)
(请注意,这正是编译器生成的赋值运算符所要做的,因此重载它是没有用的.不过我认为这是用于练习.)
更好的方法是采用Copy-And-Swap习语.(如果你发现GMan的答案过于庞大,请尝试我的,这不是那么详尽.:))请注意,C&S使用复制构造函数和析构函数来进行赋值,因此需要按照副本传递对象,就像在问题中一样:
TestClass& operator=(TestClass Other)
Run Code Online (Sandbox Code Playgroud)
你展示的代码就是这样做的.但是,没有人会认为这是一个特别好的实施.
这符合赋值运算符的预期:
TestClass& operator=(TestClass other)
{
using std::swap;
swap(ClassName, other.ClassName);
// repeat for other member variables;
return *this;
}
Run Code Online (Sandbox Code Playgroud)
顺便说一句,你谈的是"其他类",但你只有一个类,以及该类的多个实例.