Chinaunix首页 | 论坛 | 博客
  • 博客访问: 544739
  • 博文数量: 92
  • 博客积分: 2511
  • 博客等级: 少校
  • 技术积分: 932
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-19 10:10
文章分类
文章存档

2011年(6)

2010年(27)

2009年(37)

2008年(22)

我的朋友

分类: C/C++

2008-10-29 00:08:22

    前缀和后缀运算是很基本的运算,我相信所有学过c语言和c++的人都能很好得理解他们的含义,他们的区别也是很细微的,在运行效率上有一个很小的不同。当然如果在一个很大的程序里,你的数据结构和算法不优良的时候,这样的效率改变往往是不能对大局有所改变的,就像80-20规则告诉我们的那样,但是既然他们有差异,我们为什么在必要的时候不用更有效率的呢?

   这要从i++和++i的实现上来说了,我们都知道,i++是先取回操作数,然后增加操作数,而++i是先对操作数增值,然后取回,所以对这两个的操作符的实现也是给予这样的现实的。但是我们会发现遇到了一个麻烦,对于这样的两个一样的运算,我们没有办法区别他们的重载版本。为了解决这样的问题,在后缀运算符的重载版本里,编译器会默认添加一个int值以区分两个版本。

  实现如下

//prefix

template<T>class EXM{....}
EXM& EXM::operator++()
{
   *this += 1;
   return pre;
}
//postfix

template<T>class EXM {...}
const EXM EXM::operator++(int)
{
    T temp = *this;
    *this += 1;
    return temp;
}

为了不让编译器发出有一个没有用到的参数这样的警告,我们在postfix函数的形参只声明了类型。

也许你觉得奇怪,为什么两个函数的返回值类型不一样,先考虑这样的代码

EXM i;

i++++;

第一内建的类型不允许对操作数做连续的这样的行为。而且

你认为这样的代码为i增值了几次呢?2次?错了,实际上是一次。这是因为等效于一下的代码

i.operator++(0).operator++(0)而这样的调用第一个返回了一个const引用,而operator++(int)不是一个const函数,于是不能得到正确的调用,所以自增了一次,这个行为具有迷惑性,所以还是不写这样的代码为好

回到我们的论题,可以发现,在后缀的实现里,需要开辟临时对象,这样在结束的时候的就需要删除临时对象,这样在大的程序里,也许会有效率的损失,所以在可以的情况下,尽量使用前缀++吧~

阅读(1245) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~