##++前置和++后置
在对操作符++进行重载的时候有两个
//前置
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会造成一次拷贝构造函数和一次析构函数的额外开销。