c++ - 重载后缀运算符如何工作?

标签 c++ operator-overloading postfix-operator prefix-operator

我有以下代码:

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》一书中,作者只解释了“为了与内置运算符保持一致”。

  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

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

最佳答案

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

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

关于c++ - 重载后缀运算符如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10442904/

相关文章:

c++ - 折叠表达式中的短路

c++ - 这里重载了什么 C++ 运算符?

c++ - 派生类的重载解析失败

python - 是否可以在 Python 中重载/导入?

c++ - 即使后缀和赋值都重载,运算符重载也不起作用

c - 如何在循环内增加 while 循环的计数器?

c++ - wcout 是如何工作的?

c++ - 动态链接 - Linux 与 Linux Windows

c++ - 为什么这个 sizeof 运算符会出错?

c - 当在其条件中使用赋值和后缀运算符时,while 循环如何工作