一、引用

类型名 & 引用名 = 变量名

例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 &类型的引用,除非进行强制类型转换