引用是某个对象(即变量)的别名,即某个对象的替代名称(相当于一个人的第二名称),引用由符号&引导定义
类型 &引用名=变量名
例如:
int i = 9
int &ir = i
简单的例子:
#include <iostream.h>
int main(){
int i = 9;
int& ir = i;
cout<<"i= "<<i<<" "<<"ir= "<<ir<<endl;
ir = 20;
cout<<"i= "<<i<<" "<<"ir= "<<ir<<endl;
i = 12;
cout<<"i= "<<i<<" "<<"ir= "<<ir<<endl;
cout<<"i的地址是: "<<&i<<endl;
cout<<"ir的地址是: "<<&ir<<endl;
return 0;
}
输出:
i= 9 ir= 9 i= 20 ir= 20 i= 12 ir= 12 i的地址是: 0xffae1b58 ir的地址是: 0xffae1b58
从结果可以看出,ir和i其实是统一内存变量,对ir的实际操作就是对i的操作。
使用引用时需要注意以下几个问题:
1、在定义引用时,引用符&与指针运算符一样,在类型和引用名之间的位置是灵活的
int& ir=i; int & ir = i; int &ir=i;
这几种定义完全一样。
2、在变量声明时出现的&才是用用运算符(包括函数参数声明和函数返回类型的声明),其他地方出现的&都是地址操作符
3、引用必须在定义时初始化,不能在定义完成后再给它赋值,为引用提供的初始化之,可以是一个变量,也可以是另一个引用名:同一个变量可以定义多个引用。
4、引用实际是一种隐式指针,但它与指针的用法存在区别
引用实质上也是一种指针,但它与指针至少存在两点区别:
a、指针必须通过解引用运算符“*”才能访问它所指向的内存单元,而引用不需要通过“*”就能够访问它所代表的内存单元,与普通变量的访问方法差不多;
b、指针是一个变量,可以对它重新赋值,让它指向另外的地址,但引用必须在定义时进行初始化,并且一经定义就再也不能作为其他变量的引用了
5、当用&运算符获取一个引用的地址时,实际去除的是引用对应的变量的地址
例如:int i = 9;
int &ir = i;
int *pi = &ir;
6、建立引用时,需要注意以下3个限制,不能建立引用的引用;不能建立引用数组,也不能建立数组的引用;可以建立指针的一弄,但不能创建指向引用的指针
例如:
int i = 0,a[10];
int &aa = a; //错误,aa是数组的引用
int &ia[5]; //错误,ia是引用数组
7、引用与左值。对于每个变量,都有两个与它相关联的值:左值和右值。左值是指变量对于的那块内存区域的地址,是可以“放在赋值符号左边的值”;右值是指变量对应的内存区域中存储的数据值,是可以“放在赋值符号右边的值”。引用是一个左值。
参考书籍《C++面向对象程序设计》第2版 杜茂康等