++和--操作符

来源:互联网 发布:网站sql注入漏洞修复 编辑:程序博客网 时间:2024/06/05 09:51

c/c++里有两个操作符++和--  ,它们分别有前置式和后置式:

int  a=0;

++a; 前置式

a++; 后置式

这两个操作都是把a的值+1,但是有什么区别呢?我们在C++的操作符重载里讨论这个问题。


重载函数是以其参数类型来区分彼此的,然后不论++或--操作符的前置式或后置式,都没有参数,为了填平这个语言学漏洞,只好让后置式有一个int自变量,并在它被调用时,

编译器默默地为该int指定一个0。

class UPInt{public:UPInt& operator++();const UPInt operator++(int);    ...};UPInt i;++i;  //调用i.operator++()i++; //调用i.operator++(0)

注意到,前置式返回一个引用,后置式返回一个const,下面说明为什么返回引用和const。

UPInt& UPInt::operator++(){*this += 1;return *this;}

可以看到,前置++会先进行累加,再取出。


UPInt& UPInt::operator++(){UPInt oldValue = *this;++(*this);return oldValue;}

可以看到,后置++会先产生一个临时对象,然后对累加,再返回没修改的临时对象。也就是,先取出,再累加。

为什么前置++返回引用,后置++返回const?

前置++返回引用的原因很清楚,但后置++为何返回const?

想像一下:

UPInt i;

i++++;

实施两次后置++,编写代码的人目的想必是对i进行两次递增,但是第二次++的确是返回的临时对象(假如不是const)

所以,我们应该禁止连续后置++,因此,后置++返回const就合情理了。但是连续两次前置++是合法的。


在效率方面考虑,我们应该尽量使用前置++,因为后置++需要产生临时对象,那么就需要调用构造和析构函数。





原创粉丝点击