代码之家  ›  专栏  ›  技术社区  ›  Cam

前缀/后缀增量运算符

  •  20
  • Cam  · 技术社区  · 14 年前

    我想确保我正确理解传递值和传递引用。特别是,我正在研究增量的前缀/后缀版本 ++ 对象的运算符。

    假设我们有下面的课 X

    class X{
    private:
        int i;
    public:
     X(){i=0;}
     X& operator ++ (){ ++i; return *this; } //prefix increment
    
     X operator ++ (int unused){ //postfix increment
      X ret(*this);
      i++;
      return ret;
     }
    
     operator int(){ return i; } //int cast
    };
    

    首先,我是否正确地实现了前缀/后缀增量操作符?

    使用每个版本的操作符时是否创建对象副本?

    解释一下引用返回和值返回到底发生了什么,可能有助于我理解。


    编辑:例如,使用以下代码。。。

    X a;
    X b=a++;
    

    …a和b现在是化名了吗?

    3 回复  |  直到 14 年前
        1
  •  17
  •   Shirik    14 年前

    这是一个正确的实现。后缀运算符的性能通常会更差,因为在执行增量之前必须创建另一个副本(这就是为什么我养成了总是使用前缀的习惯,除非我需要其他东西)。

    您的实现的效率看起来与典型的实现相当。

    编辑:

    但是,在下面的代码中,a和b 别名:

     int a = 0;
     int& b = ++a;
    

    b是指a的地址。

        2
  •  21
  •   fredoverflow    9 年前

    对象本身的 在后缀增量中:

    X operator++(int)
    {
        X copy(*this);
        ++*this;         // call the prefix increment
        return copy;
    }
    

    X 因此,对象仅包含在前缀版本中。

        3
  •  2
  •   Peter Alexander    14 年前

    您的运算符实现正确。

    在prefix操作符中,不复制X。

    在postfix操作符中,为ret创建一个副本,并且 可能 从函数返回时会生成另一个副本,但所有编译器都将删除此副本。

    推荐文章