"利用const引用避免复制" (一)

2013-02-08 14:33:01 · 作者: · 浏览: 709

  之前两篇文章里的两个函数如下所示:

  [cpp]

  //重载操作符+

  Vector3 operator+(const Vector3 &a){

  return Vector3(x + a.x,y + a.y,z+a.z);

  }

  //比较两个数,如果相同返回0,如果v1大,返回1,如果v2大,返回-1

  int compare(const int &v1, const int &v2)

  {

  if(v1 < v2) return -1;

  if(v2 < v1) return 1;

  return 0;

  }

  因为之前是用C#Java比较多,就是无法理解这两个函数的参数定义,为什么要加上const和&.其实有时候看到&,*,T等符号就会头大。如果在java中第二个函数我肯定就会这样写:

  [java]

  //比较两个数,如果相同返回0,如果v1大,返回1,如果v2大,返回-1

  int compare( int v1,  int v2)

  {

  if(v1 < v2) return -1;

  if(v2 < v1) return 1;

  return 0;

  }

  先不管上面的东西,再来看一个出现无数次的交换例子:

  [cpp]

  //把形参定义为引用类型

  void swapOne(int& a, int& b)

  {

  int tmp = b;

  b = a;

  a = tmp;

  }

  //使用复制实参,只是改变局部副本,而传递函数的实参没有修改

  void swapTwo(int a,int b)

  {

  int tmp = b;

  b = a;

  a = tmp;

  }

  int main(int argc, char* argv[])

  {

  int a = 1, b = 2;

  printf("before swap,a:%d,b:%d\n",a,b);

  swapOne(a,b);

  printf("after swap,a:%d,b:%d\n",a,b);

  printf("before swap,a:%d,b:%d\n",a,b);

  swapTwo(a,b);

  printf("after swap,a:%d,b:%d\n",a,b);

  return 0;

  }