c++ 自加(自减)运算符
(1)a++++; /* a++返回的是一个const; */
(2)++++a;
(3)++a++; /* a++返回的是一个const; */
(4)a++=b; /* a++返回的是一个const; */
(5)++a=b;
1,对于a,b为整数等简单类型,则(1,3,4)错误,(2 ,5)正确。所有错误的原因都是因为a++返回的是一个常量而不是变量,在进行(左++)或者(右++)或者(=)操作都是不对的。
2,若a,b为对象时,重载operator++运算符。若想和整数等简单类型一致的话,需要实现
OBJ & operator++(); 与const OBJ operator++(int a);两个重载函数,则和上述的错误正确结果一致。
3 ,若a,b为对象时,重载operator++运算符。若实现 OBJ & operator++(); 与 OBJ operator++(int a);两个重载函数(去掉 const),则上述的所有题目结果都正确。
4,后置式为什么要返回一个const对象?首先返回值必须是一个对象,这是显然的,因为要返回累加前的对象;其次为什么是const对象呢?如果不是const对象会出现什么情况:
违反了后置++的运算语法规则:C语言中不允许两次使用后置++操作符,即下面的操作是非法的:
int i;
i++++; //error! (但++++i是合法的)
如果我们返回不是const对象,意味着下面的操作编译器不会报错:
OBJ c;
c++++; //不会报错,调用的动作如下 c.operator++(0).operator++(0);
5,尽量使用前置式的自增运算符,因为后置式运算符需要申请一个临时对象保存原值,有拷贝构造和析构的代价(对于简单类型,保存一个常量并返回),而前置式没有。
6,前置式自增运算符是先对对象进行修改,然后返回原对象的引用;后置式自增运算符是先申请临时对象保存原对象的值,再在原对象身上进行值修改,返回临时对象。
参考: