【问题标题】:Overloading the assignment operator or use the default one?重载赋值运算符还是使用默认运算符?
【发布时间】:2016-01-03 18:13:45
【问题描述】:

如果我有

Class A {
    int x;
};

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

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

编辑:说我想自己实现类似的东西,如果 b 和 k 都是 B 类型,那么 b = k 将起作用。我是否需要显式调用向量析构函数来释放b 的 y 成员,在实现内部?

它会是什么样子?

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

原来的向量this-&gt;y会在这里被破坏吗?为什么?

【问题讨论】:

  • 不知道默认值的情况下为什么要重载它?

标签: c++ class operator-overloading


【解决方案1】:

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

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

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

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


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

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

是的,它将被“破坏”,因为vector&lt;A&gt;operator=() 定义暗示要这样做。

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

【讨论】:

  • 说我想自己实现类似的东西,这样如果bk 都是B 类型,b = k 就可以工作。我是否需要在实现内部显式调用vector 析构函数来释放by 成员?
  • @Stabilo “我是否需要在实现内部显式调用向量析构函数来释放 b 的 y 成员?” 不,你从不调用任何析构函数 明确地。当包含的实例被破坏时,这些将被自动调用。还是我从你的解释中误会了什么?
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2013-08-09
    • 2011-05-02
    • 2012-11-26
    • 1970-01-01
    • 2015-02-25
    • 1970-01-01
    • 2019-07-30
    • 1970-01-01
    • 2013-12-08
    相关资源
    最近更新 更多