认识引用
Declares a named variable as a reference, that is, an alias to an already-existing object or function. 来自: C++参考手册
先从一个简单的例子开始: 交换函数 swap() 。
// 代码片段01void swap01(int a, int b) { int temp = a; a = b; b = temp;}// 代码片段02void swap02(int *a, int *b) { int temp = *a; *a = *b; *b = temp;}int main(int argc, const char * argv[]) { int a= 10, b = 20; swap01(a, b); // 不会交换 swap02(&a, &b); // 会交换 return 0;}
上述代码似乎不用解释都知道它所要说明的问题。似乎与今天的主题无关,但是不着急,看下 代码片段02 。内部充斥着 *a
、*b
这样的操作,代码似乎不够简洁。有没有什么方式可以使其更简洁一些呢?有! 引用!!
。
有了引用以后,代码是这样的:
void swap03(int &a, int &b) { int temp = a; a = b; b = temp;}int main(int argc, const char * argv[]) { int a= 10, b = 20; swap03(a, b); // 会交换 return 0;}
代码看起来和上面没有什么大的差别。&a
、&b
似乎是!在取地址。实际上不是的。它表示的 a
是某个 int
类型变量的引用(或者说某个 int
类型变量的别名)。
那么如何创建一个 引用
呢?
int main(int argc, const char * argv[]) { int num = 10; int & ref = num; // 创建一个引用。 int & refref = ref; // 创建一个引用 return 0;}
如上,创建的是 num
的引用,名字叫 ret
。既然是引用,就是说,使用 num
和 ret
没有任何区别。
没有任何区别是什么意思?意思就是说:num
和 ret
都是同一个内存地址的名称。举个小例子,如图:
num: 周樟寿ref: 周树人refref: 鲁迅
只是名字变了,但它都是同一个内存!!
说到这里,有没有发现其实引用是什么?像不像下面这样:
int &ref = num;// 等价于int *ref = #
另外有一个需要注意的地方是: 引用一旦创建,便不能更改(只读)!!既然不能修改,那就说明必须在创建时就要给引用初始化!!!。
int one = 10;int two = 20;// 错误01(ref创建时就要被初始化)int &ref;ref = one;// 正确写法:int &ref = one;// 异常 02(引用一旦创建,便不能修改)int &ref = one;ref = two; // 这句话不会报错,但是它表达的意思不是让ref变成two的引用。而是将 two 的值,赋值给 ref。即,ref = 20;
至此,对引用有了一个基本的认识。总结一下:
- 引用是某个变量的别名。
- 引用一旦创建,便不可以修改。
- 引用创建时,必须要初始化。
基于以上的观点。我们可以对引用有一个本质上的认识,即指针常量:
int & ref = num;// 等价于int * const ref = #
引用的作用
引用难道只是为了简化 *a
这样的代码,使代码更简洁么? 不是的。引用来源于指针,但不同于指针。
引用最主要的用途是:用作函数的参数(尤其是结构体或对象参数)!!