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

c++ class member operator definition with no return value

本文关键字:成员 运算符 定义 c++ 返回值      更新时间:2023-10-16

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

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

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

myClass A(10.5);
A+10.0;

结果是A.i=20.5。但是如果我把代码改成

A = A + 10.0;

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

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

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

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

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

举个例子:

int negate(int i) {
if (i >= -INT_MAX)
return i;
/* i cannot be negated */
abort();
}

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

有些编译器确实提供了一个选项来警告丢失的return语句,因此您可以尝试提高警告级别。

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

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