全部博文(92)
分类: C/C++
2008-10-29 00:08:22
前缀和后缀运算是很基本的运算,我相信所有学过c语言和c++的人都能很好得理解他们的含义,他们的区别也是很细微的,在运行效率上有一个很小的不同。当然如果在一个很大的程序里,你的数据结构和算法不优良的时候,这样的效率改变往往是不能对大局有所改变的,就像80-20规则告诉我们的那样,但是既然他们有差异,我们为什么在必要的时候不用更有效率的呢?
这要从i++和++i的实现上来说了,我们都知道,i++是先取回操作数,然后增加操作数,而++i是先对操作数增值,然后取回,所以对这两个的操作符的实现也是给予这样的现实的。但是我们会发现遇到了一个麻烦,对于这样的两个一样的运算,我们没有办法区别他们的重载版本。为了解决这样的问题,在后缀运算符的重载版本里,编译器会默认添加一个int值以区分两个版本。
实现如下
|
为了不让编译器发出有一个没有用到的参数这样的警告,我们在postfix函数的形参只声明了类型。
也许你觉得奇怪,为什么两个函数的返回值类型不一样,先考虑这样的代码
EXM i;
i++++;
第一内建的类型不允许对操作数做连续的这样的行为。而且
你认为这样的代码为i增值了几次呢?2次?错了,实际上是一次。这是因为等效于一下的代码
i.operator++(0).operator++(0)而这样的调用第一个返回了一个const引用,而operator++(int)不是一个const函数,于是不能得到正确的调用,所以自增了一次,这个行为具有迷惑性,所以还是不写这样的代码为好
回到我们的论题,可以发现,在后缀的实现里,需要开辟临时对象,这样在结束的时候的就需要删除临时对象,这样在大的程序里,也许会有效率的损失,所以在可以的情况下,尽量使用前缀++吧~