一、引用
类型名 & 引用名 = 变量名
例1:
int n = 4; int & r = n; // r引用了n,r的类型是int &
某个变量的引用,等价于这个变量,相当于这个变量的一个别名,所以例1中 r 和 n 就是一个东西了,无论给哪个变量赋值,另一个也会随之改变。
例2:
int n = 7; //定义n的初值为7 int & r = n; // 变量r 引用了 n r = 4; //将变量r赋值为4 cout << r; //输出 r,这时输出的是 4 cout << n; //输出 n,这时输出的也是 4,因为r引用了n,现如今r和n是一个东西,给r赋值为4,n的值也随之改变 n = 5; //将变量n赋值为5 cout << r; //输出r,这是输出的就是数字5,同理,r即是n,n即是r,改变一个的值,另一个的值也会随之改变
注意:
- 定义引用时一定要将其初始化成引用某个变量(只能是引用某个变量,不能引用别的东西)
- 初始化之后,它就一直引用该变量,不会再引用别的变量了,(引用是从一而终,从引用之时起,一直到程序结束,引用的变量都不会改变)
- 引用只能是引用变量,不能引用常量和表达式
例3:
double a = 4,b = 5; //分别给变量a和b赋初值 double & r1 = a; //r1引用了a double & r2 = r1; //r2引用了r1 r2 = 10; //改变r2的值,则r1、a的值就会同时发生一系列改变 cout << a <<endl; //输出a,这时a的值已经变为10,输出的数字是10 r1 = b; //r1一经引用a之后,从一而终,此时不是r1引用了b,而是将b的值赋给r1,此时r1 = 5 cout << a <<endl; //输出a,a的值也变为5
引用应用的简单示例(体会引用的好处)
1.编写交换两个整型变量值的函数:
- 如果不用“引用”的话,程序如下编写
void swap(int* a,int* b) { int tmp; tmp = *a;*a = *b;*b = tmp; } int n1,n2; swap(& n1,&n2); //通过指针,n1,n2的值被交换
- 有了C++的引用之后
void swap(int& a,int& b) //相当于是int& a = n1;int& b = n2;两个引用让a和n1,b和n2分别成为一体,无论是哪个改变,另一个对应改变 { int tmp; tmp = a;a = b;b = tmp; } int n1,n2; swap(n1,n2); //通过引用,n1,n2的值被交换
2.引用作为函数的返回值
int n = 4; int & SetValue(){ return n;} //Setvalue这个函数的返回值是一个引用,引用变量n int main() { Setvalue() = 40; cout << n;//输出n,这个时候n的值已经改变为40 return 0; }//输出40
常引用
不能通过常引用去修改其引用的内容(const int &)
int n = 100; const int & r = n; r = 200; //编译出错 n = 300; //没问题,不能通过常引用去修改其引用的内容,即不能通过const int & r去修改n的值,但是可以通过别的方式修改n
常引用和非常引用的转换
const T &和T &是不同的类型!!!
T &类型的引用或T类型的变量可以用来初始化const T &类型的引用;
const T 类型的常变量和const T &类型的引用则不能用来初始化T &类型的引用,除非进行强制类型转换