为什么首先重载operator =?

时间:2014-06-07 13:43:23

标签: c++ polymorphism operator-overloading variable-assignment

在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;
}

除了将指针作为成员变量的类,并且我们不想为内存地址分配值,或者可能从不同的类分配对象 - 为什么我们要在第一个中重载=运算符地点?什么时候这是至关重要的一个例子? (而不是上面的例子?)

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:3)

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

  • 深层复制对象而非浅层副本(这就是您提到的内容)
  • 传递资源所有权和/或在执行此操作之前执行簿记操作
  • 定义从一种类型到另一种类型的对象转换(如果转换运算符不适合)
  • 预防作业(例如,如果您正在处理临时工作)
  • 在C ++ 11中,这允许您使用非平凡逻辑移动 r值引用
  • 执行其他检查(例如自我分配