重载预增量运算符未显示正确的结果

时间:2017-02-16 14:22:35

标签: c++ operator-overloading friend-function unary-operator

我使用友元函数重载了预增量运算符。在重载的friend函数中,变量的值显示正确。但是这个值没有显示在显示功能中,为什么?

ls.log

1 个答案:

答案 0 :(得分:8)

您的operator ++按值获取Rectangle对象,这意味着它会收到其操作数的副本。然后它尽职地增加副本的breadth成员,将其打印出来,然后在副本结束时丢弃该副本。

您需要通过引用获取参数:

friend void operator ++(Rectangle &r1)
{
  ++r1.breadth;
}

另请注意,使用成员函数而不是自由函数来重载一元运算符是很常见的。像这样使用,你就不会遇到这个问题:

class Rectangle
{
  // ...

public:
  void operator++ ()
  {
    ++breadth;
  }

  // ...
};

一些评论:

  • operator++通常会返回对其操作数的引用,以模仿内置运算符的作用。就像为++ ++ i执行int i一样,也应该可以为用户定义的类型++ ++ r执行r

  • 实际上,只有当a)你正在编写一个类似于内置类型的类型,或b)你正在编写一个特定于域的语言时,才应该使用运算符重载。增加矩形不是我可以直观地解释的,并且最好作为命名成员函数完成。如何判断++r是增加宽度,高度还是两者,或者将矩形向右移动,还是......?