【问题标题】:c++ class member operator definition with no return value [duplicate]没有返回值的c ++类成员运算符定义[重复]
【发布时间】:2014-02-19 10:42:23
【问题描述】:

我试图刷新我的 c++ 知识并发现一个奇怪的行为。当我声明一个类并在其中重载一个运算符时,我忘记了该运算符有一个返回值。这导致了一些我无法解释的行为。 代码如下:

class myClass{
    double i;
    myClass(double value): i(value){}
    myClass operator+ (const double &param)
    {
        i = i + param;
    }
};

因此,operator+ 应该返回一个 myClass 类型的值,但它只是将参数添加到成员 i。 当我在我的程序中尝试这个运算符时,

myClass A(10.5);
A+10.0;

结果是 A.i = 20.5,如我所料。但是如果我将代码更改为

A = A + 10.0;

结果是 A.i = nan,或一些非常小的数字。我意识到,operator+ 应该根据定义返回一个值,但我没有在其定义中添加 return。 我的问题是,在这种情况下会返回什么?内存中的一些随机垃圾值?如果期望返回 myClass 类型的值,为什么编译器不强制在运算符定义中添加返回值?

【问题讨论】:

  • 简而言之:你写的东西有未定义的行为,编译器不需要捕捉它,任何事情都可能在运行时发生。
  • A+10.0; 不应该改变 A 的成员,这就是 operator += 的用途!这只是超级混乱
  • 是的,这令人困惑。首先我尝试了 A = A + 10.0,当我意识到它没有按预期工作时,我尝试了普通的 A+10.0。我不会使用这种方式我的运营商,只是尝试如果它有效。

标签: c++ operator-overloading return-value


【解决方案1】:

内存中的一些随机垃圾值?

很有可能。形式上,如前所述,行为是未定义的,所以任何事情都是允许的,但大多数实现都会返回一些垃圾值。

如果期望返回 myClass 类型的值,为什么编译器不强制在运算符定义中添加返回值?

因为具有返回类型的函数根本不需要返回。具有总是抛出异常的返回类型的函数可能有充分的理由,例如,在这种情况下,对缺少 return 语句的诊断只是一个障碍。这甚至可能以编译器无法看到的方式发生,例如,当函数的最后一条语句是对另一个无法正常返回的函数的调用时。

举个例子:

int negate(int i) {
  if (i >= -INT_MAX)
    return i;

  /* i cannot be negated */
  abort();
}

您可以编写这样的函数来防止在传递INT_MIN 时静默进行,从而使调试更容易。在这种情况下,abort(); 之后没有 return 语句的事实不是问题。诚然,这个函数确实有一个return 语句,但据编译器所知,这个函数有可能在到达结束} 时返回。

一些编译器确实有一个选项可以警告缺少return 语句,因此您可以尝试提高警告级别。

【讨论】:

    【解决方案2】:

    程序有未定义的行为。因此它可以返回堆栈中存在的任何内容。

    【讨论】:

      【解决方案3】:

      只是一个垃圾值,你告诉它期待一个返回值,但实际上并没有告诉它返回任何东西。

      【讨论】:

        猜你喜欢
        • 2020-01-21
        • 2012-04-26
        • 2013-07-31
        • 1970-01-01
        • 2013-11-08
        • 2021-07-30
        • 2010-11-18
        • 1970-01-01
        • 2011-05-27
        相关资源
        最近更新 更多