Skip to content

Instantly share code, notes, and snippets.

@superlayone
Last active August 29, 2015 14:03
Show Gist options
  • Select an option

  • Save superlayone/42391b23e91d4549bd79 to your computer and use it in GitHub Desktop.

Select an option

Save superlayone/42391b23e91d4549bd79 to your computer and use it in GitHub Desktop.
++ operator

##++前置和++后置

在对操作符++进行重载的时候有两个

    //前置
    Object operator ++();
    //后置
    Object operator ++(int);

其实,前置和后置是有着效率上的差别的,STL中类类型迭代中有很多的前置操作

    Object& operator++()
    {  
        ++this->count;  
        return *this;  
    }  
  
    const Object operator++(int)
    {  
        Object ret(*this);  
        ++this->count;
        return ret;  
    }

其中,前置和后置的++有以下不同点:

  • 返回值类型不同
  • 形参不同
  • 代码不同
  • 效率不同

前置的++返回的是对象的引用,后置的++返回的是常量对象,也就是说不可修改。即前置的++返回左值,后置的++返回的是右值。

    Object a;  
    (a++)++;  //Compile error C2105: “++”需要左值
    ++(a++);  //Compile error C2105: “++”需要左值  
    a++ = 1;  //Compile error C2106: “=”: 左操作数必须为左值 
    (++a)++;  //OK  
    ++(++a);  //OK  
    ++a = 1;  //OK 

后置++的返回类型为什么要是const对象呢?

有两个原因:

  • 如果不是const对象,a(++)++这样的表达式就可以通过编译。但是,其效果却违反了我们的直觉。a其实只增加了1,因为第二次自增作用在一个临时对象上
  • 另外,对于内置类型,(i++)++这样的表达式是不能通过编译的。自定义类型的操作符重载,应该与内置类型保持行为一致

效率的区别

前置++的效率更高,理由是后置++会生成临时对象。 很明显,ret会造成一次拷贝构造函数和一次析构函数的额外开销。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment