类分配运算符

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)

sbi*_*sbi 5

赋值运算符的传统规范形式如下所示:

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)


Ben*_*igt 5

你展示的代码就是这样做的.但是,没有人会认为这是一个特别好的实施.

这符合赋值运算符的预期:

TestClass& operator=(TestClass other)
{
    using std::swap;
    swap(ClassName, other.ClassName);
    // repeat for other member variables;
    return *this;
}
Run Code Online (Sandbox Code Playgroud)

顺便说一句,你谈的是"其他类",但你只有一个类,以及该类的多个实例.