我试图更新我的 C++ 知识,但发现了一个奇怪的行为。当我声明一个类并在其中重载一个运算符时,我忘记了该运算符有一个返回值。这导致了一些我无法解释的行为。
这是代码:
class myClass{
double i;
myClass(double value): i(value){}
myClass operator+ (const double ¶m)
{
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
语句,因此您可以尝试调高警告级别。