首先为什么重载操作符=

Why overload operator= in the first place?

本文关键字:操作符 重载 为什么      更新时间:2023-10-16

在C语言中,我们可以将一个结构体赋值给另一个结构体:

struct vector {
    int x, y;
};
int main (void) {
    struct vector v1 = {1, 1}, v2;
    v2 = v1;
    return 0;
}

同样适用于c++对象:

class vector {
public:
    int x, y;
    vector (int a = 0, int b = 0) : x(a) , y(b){};
};
int main (void) {
    vector v1(1, 1), v2;
    v2 = v1;
    return 0;
}

除了将指针作为成员变量的类,并且我们不想分配内存地址而是值,或者可能从不同的类分配对象之外,为什么我们首先要重载=操作符?在这个至关重要的时代,有什么例子呢?(而不是上面的例子?)

在许多情况下,定义自定义赋值操作符可能会派上用场。这些是我能马上想到的:

  • 对象的深度复制而不是浅复制(这就是你提到的)
  • 传递资源的所有权和/或在此之前执行簿记操作
  • 定义从一种类型到另一种类型的对象转换(如果强制转换操作符不适合)
  • 防止赋值(例如,如果您正在处理临时)
  • 在c++ 11中,这也允许你移动r值引用与非琐碎的逻辑
  • 执行额外检查(例如自我赋值)

一个重要的原因是初始化和赋值的重载允许您从不同类型的值初始化和赋值。例如,您可以将"abc"类型为const char *(甚至不是类类型)的字符串字面值分配给std::string

另一个原因是,即使被分配的类型与目标类型相同,您也不一定需要默认语义(成员拷贝的成员)。例如,当一个智能指针对象被赋值时,它可能想要执行引用计数管理,并检查自我赋值,在这种情况下什么也不做。