漫谈C++里的“引用”

来源:互联网 发布:京瓷扫描软件 编辑:程序博客网 时间:2024/04/30 16:02

 引用“&”是C++新增的概念,注意这里的“&”并不是“取地址”的含义。引用(reference)简单的说就是一个对象的别名。用对象来初始化引用后,那么对象的名字或引用的名字都指向(refer to)该对象,如:
int a=10;
int& ra=a; //ra是a的别名
人们常常会将引用和指针混淆,原因大概是因为C++编译器通常是采用指针的方式去实现引用的。但引用并不是指针。引用与指针的比较如下:
1.不存在空引用,而指针却可以是NULL。
2.所有引用在创建时必须初始化,而指针在定义时不必初始化。
3.一个引用永远指向用来对它进行初始化的那个对象,而指针却可以改变为指向另一个对象。
另外,需要提醒的是,一个指向非常量的引用是不可以用字面值常量进行初始化的。如:
double& d=11.3; //错误!
然而,一个指向常量的引用就可以:
const double& cd=11.3; //OK!
看到上面这个语句你也不必奇怪。当一个指向常量的引用采用一个字面值来初始化时,该引用实际上指向的是一个临时变量,而这个临时变量采用这个字面值初始化。因此,cd并非真的指向字面值11.3,而是指向一个采用11.3初始化的、类型为double的临时变量,并且这个临时变量将一直保留到cd被销毁的时候。
乍一看,引用没有体现其价值,完全没存在的必要。关于这个问题,我们可以看一下C++之父Bjarne Stroustrup的名著《The Design and Evolution of C++》里有关C++语言里引入引用的历史,这会对我们理解引用的作用是很有帮助的。

“引入引用机制主要也是为了支持运算符的重载。”
“C语言对所有函数参数都采用值传递,如果用值传递对象的效率太低或者不合适,用户就可以传递一个指针。在有了运算符重载后,采用这种策略就不行了,因为在这种情况下写法上的方便是最关键的东西,对于大的对象也不能指望使用者去加进所需要的取址运算符。例如:
a = b – c;
是可以接受的写法,但
 a = &b - &c;
就不行了。”

引用的主要用途是修饰函数的形参和返回值。在C++中,函数的参数和返回值的传递方式有三种:值传递、指针传递和引用传递。引用具有指针的效率,又具有变量使用的方便性和直观性,而这种方便和直观性是使用指针所欠缺的。当然,就如Bjarne Stroustrup所说的,“如果希望在C++里做更复杂的指针操作,那么就可以用指针”。但是,如果确实只需要使用一下某个对象的“别名”而已,那么引用就是不二的选择了。

原创粉丝点击