C++中的引用(reference) |
1.简介 引用是C++引入的新语言特性。从语意上来说,引用就是一个变量的别名,就好象古代人的“字”和“号”,东坡居士和苏轼只是一个人的不同称呼。对引用的操作对变量产生的影响与对变量直接操作完全一样。例如:int i = 0; int & iRef = i; iRef++; // i = iRef = 1 尽管引用不使用指针的操作符(*, ->)但是,它看上去跟指针好象并没有区别,而且就上面的例子而言,这个引用所产生的作用完全可以由指针完成。那么为什么C++中还要增加这样一个特性呢?引用显然应该具备指针不能完成的功能,否则它就失去了价值。这方面的探讨我们留到第3节。2.引用的语法 在这里我们只讨论一些语法相关的问题。·引用必须在定义的同时初始化int i; int & j; // 错误,没有初始化。 int & k=i; // 正确 这个例子有个很好的比喻,小时候小朋友间会互相起“外号”,这些外号在产生的时候总是有所指的,即针对一个具体的小朋友的。引用也一样,定义的时候,必须指明它是谁的别名。·外部(extern)引用定义不必给出初值extern int & i; // 正确,不必给出初值·引用初始化后不能再使其成为其它变量的引用int j, k; int & i = j; i = k; // 错误,不能更改! 引用类似一个常量指针(int * const p),不能修改引用的指向。·引用的地址 假设有如下定义:int j; int & i = j; 那么,&i应该是什么呢?是一个“引用的地址”么?答案是:no。&i = &j,就是j这个变量的地址。3.引用使用技巧 3.1 引用和多态引用是除指针外另一个可以产生多态效果的手段。这意味着,一个基类的引用可以指向它的派生类实例。例如:class A;class B: public A { ... }; B b; A & aRef = b; // 基类引用指向派生类 假如A类中定义有虚函数,并且在B类中重写了这个虚函数,就可以通过aRef产生多态效果。 3.2 作为参数引用的一个重要作用就是作为函数的参数类型。C/C++的函数参数是传值的,假如有大对象(例如一个大的结构)需要作为参数传递的时候,以前的(C语言中)方案往往是指针,因为这样可以避免将整个对象全部压栈,可以提高程序的效率。但是现在(C++中)又增加了一种同样有效率的选择,就是引用。 与指针类型的参数一样,引用不论指向什么类型的对象,作为参数传递的时候都是只压栈4个字节(在32位机上)。引用所占用的4字节大小是根据编译器产生的代码判定的,因为sizeof(a_reference)只能得到它所指向对象的大小。 引用型参数应该在能被定义为const的情况下,尽量定义为const,这不光是让代码更健壮,也有些其它方面的需要,例如,假设有如下函数声明:string foo();void bar(string & s); 那么下面的表达式将是非法的:bar(foo()); bar("hello world"); 原因在于foo()和"hello world"串都会产生一个临时对象,而在C++中,这些临时对象都是const类型的。因此上面的表达式就是试图将一个const类型的对象转换为非const类型,这是非法的。 3.3 作为返回值引用作为返回值的时候,有一些规则必须遵守。这些规则包括:
3.4 什么时候使用引用现在可以总结一下什么时候使用引用这个问题了。首先我们要看看什么时候必须使用引用:
|
新闻热点
疑难解答