0

我有以下代码:

class  Array
{  
   public: 
       int aaa;
       Array():aaa(1){}
      void print()
      {
          cout << aaa << endl;
      }

      Array& operator++()
      {
          aaa++;
          return *this;
      }
      Array operator++(int)
      {
          Array a(*this);
          aaa++;
          return a;
      }
};

我有一些问题如下:

  1. 为什么前缀返回引用而后缀返回对象?在 C++ Primer 一书中,作者只解释了“ For consistency with the built-in operators”。

  2. 然后,我测试了代码:

    数组 ar;

        (ar++).print(); // print 1
    
        ar.print(); // print 2
    

输出正是我所期望的。现在我将重载后缀函数中的代码更改为:

Array operator++(int)
{
     Array a(*this);
     a.aaa++; // changed this
     return a;
}

我调用了测试代码:

Array ar;
(ar++).print(); // this prints 2
ar.print(); // this prints 1

为什么我会得到这样的结果?

4

2 回答 2

3
  1. 后缀运算符返回一个对象,而不是引用,因为它必须返回当前对象的未更改版本;它必须在增量完成之前返回值。因此必须分配一个新对象。如果你返回一个引用,它会引用什么?

  2. 在您的第二个示例中,您正在创建一个新对象,将其递增并返回它,但您并没有更改运算符应用于的原始对象——这显然是错误的,因此会给出错误的结果。

于 2012-05-04T04:59:28.780 回答
0

虽然前缀和后缀运算符在直觉上似乎会改变调用它们的对象,但它们实际上具有不同的语义含义。前缀运算符接受一个对象,对其应用增量操作,并返回相同的对象。后缀运算符获取一个对象,对其进行复制,将增量运算符应用于原始对象,然后返回副本。

It's for this reason that you may have seen various sources discouraging the use of the postfix operator when possible -- because the postfix copy creates a temporary object, it may be less efficient than the prefix operator. For an object that has to maintain a lot of state information, using the postfix operator can be expensive.

于 2012-05-04T05:03:42.103 回答