引用是某个对象/变量的别名,相当于一个人的第二名称,C++中引入。例如:
int i = 1;
int &ir = i;
这里声明了ir为i的别名,所以对ir的操作就是对i的操作。不过需要注意几个问题:
1、在定义引用时,引用符&与指针运算符一样,在类型和引用名之间的位置是灵活的,即可以int &ir = i;int & ir = i;int& ir = i;
2、在变量声明时出现的&才是引用运算符(包括函数参数声明和函数返回类型的生命),其他地方出现的&都是地址操作符。例如:
int i = 1;
int &ir = i; //引用
int& f(int &i1, int &i2); //引用参数,函数返回引用
int *p = &i; //取地址
3、引用必须在定义时初始化,不能在定义完成后再给它赋值,为引用提供的初始值,可以是一个变量,也可以是另一个引用明。同一个变量名可以定义多个引用。
4、引用实际是一种隐式指针,但它与指针的用法存在区别。例如:
int i = 1;
int *pi = &i;
int &ir = i;
*pi = 2;
ir = 3;
虽然引用实质上也是一种指针,但它与指针至少存在两点区别:
(1)、指针必须通过解引用运算符”*”才能访问它所指向的内存单元,而引用和普通变量的访问方法差不多。
(2)、指针是一个变量,可以对它重新赋值,让它指向另外的地址,但引用必须在定义时进行初始化,并且一经定义就再也不能作为其他变量的引用了。
5、当用&运算符获取一个引用的地址时,实际取出的是引用对应的变量的地址。例如:
int i = 1;
int &ir = i;
int *pi = &ir;
pi实际指向的是i,因为ir是i的别名,所以&ir将获得i的内存地址。
6、建立引用时,需要注意:不能建立引用的引用;不能建立引用数组,也不能建立数组的引用;可以建立指针的引用,但不能创建指向引用的指针。例如:
int i = 1;
int a[10];
int &ar = a; // x
int &ia[5]; // x
int &*ip = i; //x 指向引用的指针
int &&ii = i; //x
int *pi = &i;
int *&pi = pi; //right 指针的引用
7、引用与左值。每个变量都有与它相关联的两个值:左值和右值。
左值是指变量对应的内存区域地址,可以放在赋值符号左边;右值指变量对应的内存区域中存储的数据值,可以放在赋值符号的右边。当一个变量放在赋值语句左边时,是对它的左值进行操作,即修改它对应的内存区域中的值;当变量发在赋值语句右边时,操作的是它的右值,即读取变量对应的内存单元中的值进行运算。
常量、表达式都是右值,不能放在赋值句的左边。
引用是一个左值。因为引用一定与某块内存区域相对应,能够放在赋值符号的左边。C++中,引用主要用来定义函数的参数和函数返回类型,因为引用只需要传递一个对象的地址,因为引用只需要传递一个对象的地址,在传递大型对象的函数参数或从函数返回大型对象时,可以提高效率。