代码改变世界

C++基础笔记(一)

2008-10-16 16:20  ClarkZhou  阅读(335)  评论(0编辑  收藏  举报

总结:C++左右自增符的区别,如下:

int i=0,j,m;

j=i++;

所得结果:j=0,原因:右自增符是先赋值后再计算(i+1)。即:此时,j=0;i=1.

i=0;

m=++i;

所得结果:j=1,原因:左自增符是先计算(i+1)再赋值。即:此时,j=1;i=1;

使用左自增符会比使用右自增符的效率高!

为什么使用左自增操作符的原因:

  
  for   (   int   i   =   0;   i   <   100;   i++   )    
  {    
          /*   …………   */    
  }  
   
   
  但是很少有人想过代码背后隐藏的问题。读过STL源代码的人,都会对下面的代码一定很熟悉。    
   
   
  template<class   _II,   class   _OI>   inline    
  _OI   copy(   _II   _F,   _II   _L,   _OI   _X   )    
  {    
          for   (   ;   _F   !=   _L;   ++_X,   ++_F   )    
                  *_X   =   *_F;    
          return   (_X);    
  }    
  //   摘自Visual   C++   6.0   STL实现,文件:xutility。    
   
     
   
  为什么它不写成    
   
   
  template<class   _II,   class   _OI>   inline    
  _OI   copy(   _II   _F,   _II   _L,   _OI   _X   )    
  {for   (   ;   _F   !=   _L;   _X++,   _F++   )    
          *_X   =   *_F;    
          return   (_X);    
  }  
   
   
  看完这篇文章,你就可以知道这样写的理由。    
   
  C++是一种非常强大的语言,它赋予了它的使用者和他的创建者相同的权力。每一个内在的数据类型所支持的操作,你几乎都可以为自己定义的类型实现。运算符重载是其中的重要组成部分。    
   
  对于一个类CInt的运算符(这里只讨论加法),我们一般会这样实现:    
   
   
  class   CInt    
  {    
  public:    
          CInt&   operator   ++();    
          CInt   operator   ++(   int   );    
          CInt&   operator   +=(   const   CInt&   that   );    
  };    
   
  CInt   operator   +(   const   CInt&   this,   const   CInt&   that   );  
   
   
  其中,CInt&   operator   ++();对应于++i;(如果i是CInt的一个实例,下同)返回引用的原因是因为在C++里,++i的结果应该是一个左值。对这个函数的调用,除了运算本身以外,并没有什么开销。(除了隐含的this以外,无传递参数,只有一个引用返回值,所以没有新的实例被创建)    
  CInt   operator   ++(   int   );   对应于i++;那个int是无意义的,只是为了把前缀运算和后缀运算区分开。返回变量(而不是引用)的原因是因为在C++里,i++的结果应该是一个右值,并且是i在没有加之前的值(所以不能返回它的const引用)。在这个函数中,会创建一个临时变量,并把它作为返回值拷贝给调用者。    
  CInt&   operator   +=(   const   CInt&   that   );对应于i   =   i   +   j;传递一个参数,从理论上来说,它的开销和++I的开销是一样的,但是,如果你只是要对类的实例加一的话,应该用++I,因为那个函数可能为加一而特别优化过。(具体可以参见实例)    
  CInt   operator   +(   const   CInt&   this,   const   CInt&   that   );对应于k   =   i   +   j;这个函数的开销与i++相同,但是要注意的是,i++可能为加一而优化的。    
   
  为了能够显著的测出各个函数的具体效率,我使用了一个非常"大"的类,CVector,一个65536维的整型向量。测试结果为:    
   
  Another   +=   One   :   4326    
  Another++   :   9274    
  Another   =   Another   +   One   :   9223    
  ++Another   :   2153    
   
  可以看出,同样是加一,++i可以比i++快很多。    
   
  当然,编译器的优化也很重要,在某些情况下,编译器可以将i++的速度优化到和++i一样。但是,为什么不直接写出++i呢?这样可以保证在任何情况下都能获得较快的执行速度,而不是去依赖于编译器的优化。(至少,Visual   C++   6.0是不支持的)

 

  虽然还没怎么看懂,但是留此后用,以便查阅。