在说引用之前,我们现在先复习学习一下,关于变量的常引用。
在c++中,变量的引用就是给变量起别名,因此引用又称为别名,建立“引用”就是为一个变量再起另一个名字,以便在需要的时候可以方便,间接地引用该变量,这就是引用名称的由来。
如下:int a; int &b = a;这就声明了b是a的引用,即是a的别名,&是引用声明符,此时它并不代表地址,对变量声明一个引用,并不另外开辟内存单元,b和a都代表同一个内存单元。在声明一个引用时,必须同时使之初始化,即声明它代表哪一个变量。
- 声明一个变量的引用之后,在函数执行期间,该引用一直与其代表的变量相关联,不能再作为别的变量的引用,
int a1,a2;
int &b = a1;//使b成为变量a1的引用
int &b = a2;//又企图使b成为a2的引用是不行的。
引用并不是一种独立的数据类型, 它必须和某一种类型的数据相联系,声明引用必须指定它代表的是哪一个变量,即对它初始化。
int &b =a;//正确,指定b是整型变量a的别名。
int &b;//错误,设有指定b代表那个变量
float a; int &b =a;//错误,声明b是一个整型变量的别名,而a不是整型变量
引用与其所代表的变量共享同一内存单元,系统并不另外分配存储空间,编译系统使引用和其代表的变量具有相同的地址。
int a= 3;//定义整型变量a
int &b = a;//声明b是整型变量的别名
cout<<&a<<" "<<&b<<endl;//输出a和b的地址
引用的进一步说明:
- 不能建立void 类型的引用
- 不能建立引用的数组
- 可以将变量的引用的地址付给一个指针,此时指针指向的是原来的变量。
- 可以建立指针变量的引用
- 可以用const对引用加以限定,不允许改变该引用的值
- 可以用常量表达式对引用进行初始化,但此时必须用const做声明:如:int i =5; const &a = i+3;//合法 。此时编译系统是这样处理的:生成一个临时变量,用来存放该表达式的值,引用是该临时变量的别名,系统将"const &a = i+3";转换为:
int temp = i+3;const int &a = temp;该临时变量是在内部实现的,用户不能访问临时变量。还可以用于不同数据类型的变量进行初始化(要求赋值能兼容的类型)如:double d = 3.1415;const int &a =d;,原理同上,不过数据会丢失精度。如果在上面声明引用时不用const,则会发生错误。
为什么会发生错误呢,因为如果修改了引用的值,则临时变量的temp的值也会变为6.28,而变量d的值并未改变,这并不是用户所希望的,会产生二义性,与其修改引用的值而不能实现用户的目的,还不如不允许修改引用的值,这就是c++规定对这类引用必须加const的原因。