没有返回值的c++类成员运算符定义
c++ class member operator definition with no return value
我试图刷新我的c++知识,但发现了一个奇怪的行为。当我声明一个类并重载其中的一个运算符时,我忘记了该运算符有一个返回值。这导致了一些我无法解释的行为。这是代码:
class myClass{
double i;
myClass(double value): i(value){}
myClass operator+ (const double ¶m)
{
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
语句,因此您可以尝试提高警告级别。
程序有未定义的行为。因此,它可以返回堆栈中存在的任何内容。
只是一个垃圾值,你告诉它期望一个返回值,但实际上并没有告诉它返回任何东西。
- 在运算符重载定义中使用成员函数(const错误)
- 三向比较运算符成员与非成员实现
- 重载运算符的范围是什么?它是否会影响作为类成员的集合的插入函数?
- 消除好友和成员二进制运算符的歧义
- 不允许运算符 const 参数调用 const 成员函数
- 有人可以用"显式运算符 const GUID_t&() const"来解释成员函数的函数吗?
- 为什么重载运算符<<打印特征类成员会导致段错误?
- 运算符重载作为成员函数
- 如何测试成员相等运算符?
- 如何处理运算符=中的常量成员?
- 好友与成员运算符重载的优先级
- 静态与成员运算符重载:标准::运算符<< 和 std::ostream::运算符<<
- 没有返回值的c++类成员运算符定义
- 使用指向成员运算符的指针
- 在正确的全局运算符上推导出错误的成员运算符
- 内联成员运算符与内联运算符 C++
- 使用继承的成员运算符而不是自由成员运算符
- 无法访问QXmlStreamReader的专用成员(运算符=)
- 关于shared_ptr和指向成员运算符 '->*' 和 'std::bind ' 的指针
- 类成员运算符new,调用构造函数两次