【问题标题】:reassign value not work in operator = overloading重新分配值在运算符 = 重载中不起作用
【发布时间】:2016-05-26 18:18:17
【问题描述】:

MWE 是

#include <iostream>

using namespace std;

class N {
public:
    float x;
    N() { x = 0.0; }
    N(float a) { x = a; }
    //N(N &n) { x = n.x; }
    N &operator=(float f) { cout << "########";return *new N(f); }
};



int main() {
    N a;
    a = 3.0;
    cout << a.x;
    return 0;
}

我的预期是:它打印出 3,但实际上打印出 0。似乎值没有改变。

那我改成

x = f; return *this;

成功了,为什么?

【问题讨论】:

  • 无论您在哪里读到operator= 应该返回对newed 对象的引用,请阅读其他内容
  • *new N(f) 作为分配的评估返回。 cout &lt;&lt; (a = 0.3).x 在访问赋值返回的表达式时返回 3.0。

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


【解决方案1】:

当然不会改变。您不会在赋值运算符中更改它。相反,您返回一个指向在堆上分配的新值的指针......并忽略该结果。

【讨论】:

  • 内存泄漏是一个奖励,我想。
  • 是的,我返回一个指向堆上分配的新值的指针。但为什么结果被忽略了? a 得到一个新的指针。当然,a.x 会改变,对吧?
  • 没有。 a not 得到一个新的指针。 a 没有改变。堆上有一个具有新值的全新结构。提示:C++ 不是 Java 或 C#
  • 我认为 C++ 和 Java 都不会像 OP 所期望的那样运行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-16
  • 1970-01-01
  • 2021-05-22
  • 1970-01-01
相关资源
最近更新 更多