c ++类成员运算符定义,没有返回值

时间:2014-02-19 10:42:24

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

我试图刷新我的c ++知识并发现了一个奇怪的行为。当我声明一个类并重载了一个操作符时,我忘记了操作符有一个返回值。这引起了一些我无法解释的行为。 这是代码:

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

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

myClass A(10.5);
A+10.0;

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

A = A + 10.0;

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

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

  

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

最有可能。正式地说,正如已经指出的那样,行为是未定义的,所以任何事情都是允许的,但是大多数实现都会返回一些垃圾值。

  

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

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

一个例子:

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

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

您可以编写这样的函数来防止在传递INT_MIN时静默进行,以便更轻松地进行调试。在这种情况下,return之后没有abort();语句的事实不是问题。不可否认,这个函数确实有一个return语句,但就编译器所知,这个函数可以通过到达结束}来返回。

有些编译器可以选择警告缺少return语句,因此您可以尝试调高警告级别。

答案 2 :(得分:0)

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