跳至主要內容

拷贝赋值运算符

AkashiNeko原创C++运算符重载

与拷贝构造的区别

拷贝赋值运算符和拷贝构造非常相似,都是对对象的拷贝。不同的是在赋值时,对象中可能已经存在被管理的数据,所以在拷贝工作之前,需要清除这些数据。下面是二者的对比:

拷贝构造

std::string s1 = "Hello, world";
std::string s2 = s1; // 调用拷贝构造,使用s1的内容初始化s2

拷贝赋值运算符

std::string s1 = "Hello, world";
std::string s2 = "Hello, AkashiNeko";
s1 = s2; // 调用赋值运算符,将s2赋值给s1,同时需要清除s1原有的内容

赋值运算符函数

拷贝赋值运算符的函数声明如下

class A {
public:
    A& operator=(const A& a);
};

需要注意的是,它返回一个自身的引用,以应对连续赋值的情况

A a1, a2, a3;
...
a1 = a2 = a3; // 连续赋值

拷贝赋值的实现

相比拷贝构造,拷贝赋值运算符相当于在拷贝构造的工作之前,释放掉当前管理的资源。

Stack类的拷贝赋值运算符

拷贝赋值运算符主要完成以下两个工作

  • 清除当前管理的资源
  • 拷贝资源
Stack& operator=(const Stack& s) {
    // 清除当前管理的资源
    free(_data);
    _data = nullptr;

    // 申请新的空间
    _data = (int*)malloc(_capacity * sizeof(int));
    assert(_data != nullptr);

    // 对空间进行拷贝
    memcpy(_data, s._data, _capacity * sizeof(int));
    _capacity = s._capacity;
    _top = s._top;
}