C++ 指向类的指针

C++ 指向类的指针,c++,pointers,operator-overloading,C++,Pointers,Operator Overloading,我一直在尝试编写一个分数类并重载它的一些运算符(+、-、-、/…)。起初,我试着这样做: Fraction& operator+(Fraction& rightOp) { Fraction result; result.num = num * rightOp.den + den * rightOp.num; result.den = den * rightOp.den;; return result; } 这产生了一个尴尬的结果。测试时,如果我使

我一直在尝试编写一个分数类并重载它的一些运算符(+、-、-、/…)。起初,我试着这样做:

Fraction& operator+(Fraction& rightOp)
{
    Fraction result;
    result.num = num * rightOp.den + den * rightOp.num;
    result.den = den * rightOp.den;;
    return result;
}
这产生了一个尴尬的结果。测试时,如果我使用:

Fraction a(2,3);
Fraction b(4,5);
Fraction c = a + b;
cout << c << endl;
Fraction a(2,3);
Fraction b(4,5);
Fraction c;
c = a + b;
cout << c << endl;
这一切都会很好。这让我困惑于C++中的类,我真的不明白为什么第一个在特定的情况下失败。我希望你能解释一下

提前谢谢

注: 操作人员 问题是它返回了对局部变量的引用。局部变量在函数结束时被销毁,因此引用引用的对象无效

改为使用
new
解决了这个问题,因为它使
结果
对象动态分配。这样的对象不会在函数结束时销毁。然而,这肯定不是解决办法。
operator+
的用户完全不清楚返回的引用是指动态分配的对象,将来需要
delete
d。永远不要把这个负担强加给你的用户

相反,您只需更改函数,使其按值返回:

Fraction operator+(Fraction& rightOp)
{
  // ...
  return result;
}
现在,它将返回一个
result
的副本,因此在函数结束时是否销毁
result
并不重要

另外,您可能希望函数采用
常量分数&
参数。这允许在第二个操作数是右值(通常是临时对象)时调用它

问题是它返回了对局部变量的引用。局部变量在函数结束时被销毁,因此引用引用的对象无效

改为使用
new
解决了这个问题,因为它使
结果
对象动态分配。这样的对象不会在函数结束时销毁。然而,这肯定不是解决办法。
operator+
的用户完全不清楚返回的引用是指动态分配的对象,将来需要
delete
d。永远不要把这个负担强加给你的用户

相反,您只需更改函数,使其按值返回:

Fraction operator+(Fraction& rightOp)
{
  // ...
  return result;
}
现在,它将返回一个
result
的副本,因此在函数结束时是否销毁
result
并不重要


另外,您可能希望函数采用
常量分数&
参数。这允许在第二个操作数是右值(通常是临时对象)时调用它。

您的
+
重载通过引用返回
分数的实例。问题是
Fraction
的本地实例将在表达式
a+b
的末尾超出范围,但
c
仍将保留对内存中该空白点的引用

在这里,通过引用返回不是您想要的。在这种情况下,通过返回值来制作副本更合适:

此外,建议您的
>
重载通过
const
引用获取一个
分数
实例,因为它不会在主体内部修改它:

friend ostream& operator<<(ostream& out, Fraction const& f)
//                                                ^^^^^

friend ostream&operator您的
+
重载通过引用返回
分数的实例。问题是
Fraction
的本地实例将在表达式
a+b
的末尾超出范围,但
c
仍将保留对内存中该空白点的引用

在这里,通过引用返回不是您想要的。在这种情况下,通过返回值来制作副本更合适:

此外,建议您的
>
重载通过
const
引用获取一个
分数
实例,因为它不会在主体内部修改它:

friend ostream& operator<<(ostream& out, Fraction const& f)
//                                                ^^^^^

friend ostream&Operator请发布完整的类,特别是赋值运算符。另外,您的第二个示例会泄漏内存,并且两个示例都无法减少分数。另外,你没有遵循常量正确性。如果你做了一系列加法,你可能会发现分母溢出。您可能会考虑使用RESULT.DEN= GCD(DN,RealTop.DN);我并不是真的想写一个完全函数化的完美分数类,这是一个让我掌握重载操作符的任务,所以我不想麻烦gcd。请发布完整的类,特别是赋值操作符。另外,您的第二个示例会泄漏内存,并且两个示例都无法减少分数。另外,你没有遵循常量正确性。如果你做了一系列加法,你可能会发现分母溢出。您可能会考虑使用RESULT.DEN= GCD(DN,RealTop.DN);我并不是真的试图编写一个完全函数化的完美分数类,这是一个让我掌握重载运算符的任务,所以我不必为gcd操心。理想情况下,它应该是一个接受常量引用的自由函数。理想情况下,它应该是一个接受常量引用的自由函数。
Fraction operator +(Fraction& rightOp)
{
    Fraction result;
    result.num = num * rightOp.den + den * rightOp.num;
    result.den = den * rightOp.den;;
    return result;
}
friend ostream& operator<<(ostream& out, Fraction const& f)
//                                                ^^^^^