重载赋值运算符还是使用默认运算符?

时间:2016-01-03 18:13:45

标签: c++ class operator-overloading

如果我有

Class A {
    int x;
};

Class B {
    vector<A> y;
    //...
};

我想在B中重载赋值运算符=。使用默认的=运算符是否足够?它会仅使用=成员vector的{​​{1}}运算符吗?

编辑:说我想自己实现类似的东西,这样如果b和k都是B类,b = k就可以工作。我需要显式调用向量析构函数来释放b的y成员,在实现中?

它看起来如何?

y

原始载体B& B::operator=(const B& b) { if (this == &b) { return *this; } y = b.y; return *this; } 会在这里被破坏吗?为什么呢?

2 个答案:

答案 0 :(得分:4)

  

使用默认的=运算符是否足够?

是的,这是足够的,除非您有任何需要特殊处理或参数的资源。

  

它会在y成员上使用向量的=运算符吗?

是的,生成的默认赋值运算符/复制构造函数将自动调用任何可用于成员变量的赋值运算符/复制构造函数。

 B& B::operator=(const B& b) {
     if (this == &b) {
           return *this;
       }
       y = b.y;
       return *this;
 }
     

此处的原始矢量是否会在此处被破坏?为什么呢?

是的,它将“destructed”,因为operator=()的{​​{1}}定义意味着这样做。

调用析构函数并不是真的,但是赋值运算符的实现确实意味着与构造新实例的行为相同,并且在清除向量时将调用所有包含的成员析构函数。 / p>

答案 1 :(得分:1)

如果您没有特殊情况(例如拥有指针或unique_ptr),您可以不定义它并使用默认情况。在你的情况下它应该没问题。
如果拥有指针,你会突然有两个对象指向内存中的相同数据,这可能不是你想要的行为(同样适用于shared_ptr
无法复制unique_ptr,因此默认赋值运算符在这种情况下不起作用,您必须编写重载。