引用的语言层特点
引用的作用是为变量起一个别名。
int a; int &b = a; int 牛二; int & 二蛋 = 牛二;
上例中,定义了一个变量a,而b是a的别名。牛阿姨生了一个Baby叫牛二,牛二有个小名叫二蛋。张大爷叫二蛋的时候,牛二知道叫的就是他。类似的,程序员在读写b的时候,也就是再读写a。
引用的主要用途
example 1:
#include <iostream> using namespace std; void swap(int a ,int b) { int tmp; tmp = a; a= b; b = tmp; } void main() { int i = 1, j =2; ...... swap(i,j); ...... }
虽然编程看着挺直观,但是不能交换i,j的值,因为形参和实参是不同的内存单元。
example 2:
#include <iostream> using namespace std; void swap(int *a ,int *b) { int tmp; tmp = *a; *a= *b; *b = tmp; } void main() { int i = 1, j =2; ...... swap(i,j); ...... }
用指针肯定能交换i,j的值,通过形参中的地址可以访问到原始的实参变量,可以修改实参的内容。但是,这种方式,编程不直观,总是要在变量前边加一个"*"号。
example 3:
#include <iostream> using namespace std; void swap(int &a ,int &b) { int tmp; tmp = a; a= b; b = tmp; } void main() { int i = 1, j =2; ...... swap(i,j); ...... }
使用引用方式,既可以从形参那里修改实参的值,同时编程直观。
小结
引用规避了直接传递和指针传递两种方式的缺点,而集中它们的优点,衍生出来的一种更优秀的传递方式。
==============================================================
引用的实现机制上
引用的实现机制上,是一个“常量指针”。在最开始的例程中,定义了一个引用型变量b,编译器会将其按照指针的操作方式,将a的地址赋给b。
引用用在函数调用上,本质上与指针传递参数没有差别。只不过指针传递参数有两个缺点,其一是操作不直观;其二指针指向可能会被修改,这样的编程不安全。而引用相当于是对指针传递参数这种方式进行了封装,规避了这两种缺点。对于程序员编程来说,他不再为指针传递参数的缺点而苦恼,因为编译器已经帮助他完成了这部分工作,而事实上他进行的操作就是指针传递参数。
引用和指针传递参数无论是在效率上还是在空间上都是完全一样的,如果妄想不传入地址就修改实参的值,简直就是天方夜谭,这就说明引用的本质就是指针。毕竟它们的行为都太相似了,如果不是这样,你还有什么方法去实现引用吗?记住,引用只不过是编译器为你提供的一个有用且安全的工具,对于机器代码可无法表示它,它把指针一对多的缺点去除,禁止了你的不安全的操作。但回到问题的本源,他们没有任何区别。
摘自:引用的本质是什么?
参考博客:
原文:http://www.cnblogs.com/amanlikethis/p/4894276.html