我试图刷新我的c ++知识并发现了一个奇怪的行为。当我声明一个类并重载了一个操作符时,我忘记了操作符有一个返回值。这引起了一些我无法解释的行为。 这是代码:
class myClass{
double i;
myClass(double value): i(value){}
myClass operator+ (const double ¶m)
{
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类型的值,为什么编译器不强制将返回添加到运算符定义?
答案 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)
只是一个垃圾值,你告诉我们期望一个返回值,但实际上并没有告诉它返回任何东西。