重载赋值运算符或使用默认运算符

Overloading the assignment operator or use the default one?

本文关键字:默认 运算符 赋值运算符 重载      更新时间:2023-10-16

如果我有

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

我想重载B中的赋值运算符=。使用默认的=运算符就足够了吗?它会在y成员上只使用vector=运算符吗?

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

它会是什么样子?

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

原始向量this->y会在这里被破坏吗?为什么?

使用默认的=运算符就足够了吗?

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

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

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


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

原始向量会在这里被破坏吗?为什么?

是的,它将被"销毁",因为vector<A>operator=()定义意味着这样做。

实际上并不是调用了析构函数,但赋值运算符的实现确实暗示了与构建新实例相同的行为,并且当向量被清除时,所有包含的成员析构函数都将被调用。

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