Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1693698
  • 博文数量: 311
  • 博客积分: 7778
  • 博客等级: 少将
  • 技术积分: 4186
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-09 19:59
个人简介

蓝点工坊(http://www.bluedrum.cn) 创始人,App和嵌入式产品开发。同时也做相应培训和外包工作。 详细介绍 http://pan.baidu.com/s/1y2g88

文章存档

2012年(3)

2011年(115)

2010年(170)

2009年(23)

分类: C/C++

2010-04-01 14:42:23

Andrew Huang

 
1.为什么要引用
C++中大量使用引用,为什么会出现引用这一语法现象?
 
这要先从C的两种参数传递说起。一种是传值。假设要做一个交换函数,大家都知道如下代码是没办法实现这一目的的。因为这里用了传值,值只能做单向传递来用。
 

int swap01(int a,int b)
{
  int tmp =a;
  a = b;
  b = tmp;
}


在C语言里面一般用传地址来处理。下面代码可以实现交换功能。

 

#define PRINT_INT(e) printf("%s=%d\n",#e,e)

int swap02(int * a,int * b)
{
  int tmp =*a;
  //char * c = (char *)a;
  //*c = 0x2f; 
  *a = *b;
  *b = tmp;
}

void test1()
{
   int a = 10,b = 30;
    //swap01(a,b);
    swap02(&a,&b);
    PRINT_INT(a);
    PRINT_INT(b);
}


用传地址的话,有几个缺点,一是书写上多了很多*,二个是指针可以任意移动,象把注释里的char * c = (char *)a ;*c=0x2f;被打开a的值会被部分破坏。三,可能引入非法地址。

因此C++引入一种新的语法-----------引用.

2.引用格式

   C++引用格式是  类型 & 引用变量名 ,如 int & a;这种写法不会与取变量地址 int *b =&a; 和位与 a & b混淆.

  引用是什么?相当于一个安全指针,有指针双向传递功能,传递高效率的优点。又象普通变量一样书写。并且在语法上能有效防止指针常见被误用的几个错误。因此C++大量使用引用。以下就是一个引用版的交换函数,可以看到书写几乎跟swap01一致,但是值能交换过来

#define PRINT_INT(e) printf("%s=%d\n",#e,e)

int swap03(int &a ,int &b)
{
 int tmp =a;
  a = b;
  b = tmp;
}
void test1()
{
   int a = 10,b = 30;
    swap03(a,b);
    PRINT_INT(a);
    PRINT_INT(b);
}


3.引用为什么防止误用?

  3.1 引用初始化只能通过赋给一个现成变量进行
     int & a = b; 
     这样防止空指针和非法地址。因为在引用定义里,以下两种是
     被禁止的。
     int &d ;
     int &e = 100;

 3.2 定义后,对引用的只能进行赋值。不能移动地址,或换成新的变量引用。
    不能移动地址,这样防住在指针内部移动。
    int &a = b;  a++;//这样相当于给b的空间值+1
    也能在运算中改变引用的对象的地址。
   
    int &f = a;
   
    f = b; //这样仍然是赋值。
    //用指针就会有如下风险。
    int *f = &a;
    f = &b;

 

因此引用在很多面向对象的开发语言使用,象JAVA的传参默认全部采用引用。

 


 

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