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

标签 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 的值,但它只是将参数添加到成员 i。 当我通过

在我的程序中尝试这个运算符时
myClass A(10.5);
A+10.0;

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

A = A + 10.0;

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

最佳答案

Some random garbage value from memory?

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

Why does the compiler not enforce to add a return to the operator definition if it is expected to return a value with myClass type?

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

一个例子:

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

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

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

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

关于没有返回值的c++类成员运算符定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21878065/

相关文章:

javascript - 函数返回 'undefined' 值

c++ - PostgreSQL 独立应用程序

c++ - for循环openmp中的局部变量

c++ - `operator delete` 带大小参数和不带大小参数 : which one is chosen when both are available?

c++ - 关于转换构造函数和赋值运算符

javascript - 如何从同一个类中获取每个值 onclick JAVASCRIPT

c++ - C++ 方法和类的正则表达式

c++ - 获取固定大小整数形式的时间

c++为写/设置重载[]运算符

PHP 返回长字符串不能用作字符串