C++ 操作溢出不工作c++;

C++ 操作溢出不工作c++;,c++,operator-overloading,C++,Operator Overloading,我构建了一个类映射有理数,我想通过标量运算溢出实现乘法,类似于: Rational &operator*(Rational const& a, double lambda) { Rational r(a._num * lambda, a._den); } 其中,\u num和\u den是有理数的分子和分母 当我运行cout时,您不会从该函数返回任何内容。 并且您不能返回对局部变量的引用,因此您可能应该将返回类型更改为Rational(删除&) 此外,它被称为“操作符重

我构建了一个类映射有理数,我想通过标量运算溢出实现乘法,类似于:

Rational &operator*(Rational const& a, double lambda)
{
    Rational r(a._num * lambda, a._den);
}
其中,
\u num
\u den
是有理数的分子和分母


当我运行
cout时,您不会从该函数返回任何内容。
并且您不能返回对局部变量的引用,因此您可能应该将返回类型更改为
Rational
(删除
&

此外,它被称为“操作符重载”

Rational&
——您返回对临时(未定义的行为)的引用,但未能返回它。你需要:

Rational operator*(Rational const& a, double lambda) {
    return Rational(a._num * lambda, a._den);
}
我还建议您注意编译器警告。您最初使用的代码应该在适当的编译器上调用多个。

运算符*()
需要返回一个值。你的不是

调用方试图使用不返回返回值的函数的返回值会导致未定义的行为

此外,函数还返回一个引用。这可能不是个好主意

你可能想做一些类似的事情

Rational operator*(Rational const& a, double lambda)
{
    Rational r(a._num * lambda, a._den);
    return r;
}
请注意,返回类型是一个
Rational
,而不是一个引用。它返回
r
的值


这假设您已经实现了用于创建
r
的构造函数,并且它可以按预期工作。您没有提供任何信息来证实或否认该假设。

您如何存储
Rational
?什么类型的代码是< > > NUM < /代码>和<代码>?在本例中,它是2和13,例如:(a)在启用增强警告的情况下编译(尽可能高),然后(b)修复标记的内容。至少有一个问题是显而易见的。好吧,似乎我没有完全理解这个概念,我现在明白了,没有引用,只有实际的变量。谢谢!当返回引用或指针时,您希望确保在退出该作用域时不会破坏您要返回的内容。因此,当您实现像
operator*=
这样的操作符时,这就是修改左侧并返回它,因此通常通过引用返回。干杯