【问题标题】:Example applications of overloading the assignment operator重载赋值运算符的示例应用
【发布时间】:2017-03-16 06:21:13
【问题描述】:

我希望这不会被视为“主要基于意见”或“过于宽泛”。这是一个相当直截了当的问题:

重载赋值运算符可以解决哪些示例问题?

我认为我还没有看到它有用的情况,尤其是考虑到程序充满令人惊讶的隐性行为和“烟雾和镜子”的负面影响。

【问题讨论】:

  • 标准库中的类型算数吗?
  • 您是在问什么时候应该重载赋值运算符?如果是,请检查Rule of three
  • @imreal 当然,你能解释一个例子吗?
  • @Mahesh 我已经看到了三法则,但我不太明白定义复制构造函数和重载赋值运算符之间的(语义)区别。
  • 您可能对MyClass c = thing_to_copy; 感到困惑,它调用了复制构造函数而不是赋值运算符。如果您将其替换为 MyClass c; c = thing_to_copy;,您将获得赋值运算符。

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


【解决方案1】:

例子:

struct X
{
    int *p;
    X(): p{new int[42]}
    ~X() { delete p; }
};

如果你这样做会发生什么

X x, y;
x = y;

?默认赋值运算符将复制原始指针,您最终将被xy 的析构函数删除两次相同的指针。事实上,您最好也在这里声明一个复制构造函数(或者,更好的是,使用智能指针)。请注意,在

X x = some_obj;

复制构造函数被调用(或elided,如果 rhs 是纯右值)。赋值运算符仅在构造之后调用,当你说

x = some_other_obj; // x is already constructed here

如果您询问 operator= 是否应该存在(与例如 Java 相比),那么这可能是个人喜好问题。

【讨论】:

  • 我明白了。调用复制构造函数与调用赋值运算符之间的区别是什么让我明白了。
  • @AlexanderMomchliov 很高兴它有帮助!
猜你喜欢
  • 1970-01-01
  • 2013-03-30
  • 2013-02-14
  • 2016-08-30
  • 1970-01-01
  • 1970-01-01
  • 2019-07-30
  • 2013-12-08
  • 1970-01-01
相关资源
最近更新 更多