引用(C++)

    • 1.6 引用

1.6 引用

C++出现了新的概念:引用。引用是某个变量的别名。

语法格式如下:

​ 类型 &引用名 = 变量名;

#include <iostream>
using namespace std;int main (void) {int num = 8;int &nr = num;cout << "num = " << num << endl;//num = 8cout << "nr = " << nr << endl;//nr = 8cout << "num的地址: " << &num << endl; //num的地址: 0xbfcdf738cout << "nr的地址: " << &nr << endl;//nr的地址: 0xbfcdf738return 0;
}

例子当中可以看出来 num 和 nr 其实是同一块内存。

用途:

​ 1)简化编程,用指针的场景可以用引用替换(尽量减少指针的使用)

#include <iostream>
using namespace std;void swap(int *p1, int *p2) { //交换函数int temp = *p1;*p1 = *p2;*p2 = temp;
}struct stu { //结构体char name[20];int age;int score;
};namespace func1{ //名字空间 void func(struct stu s1) {cout << "fun1 : " << &s1 << endl;}
}namespace func2 { //名字空间void func(struct stu &s1) {cout << "fun2 : " << &s1 << endl;}
}int main (void) {int x = 100;int y = 200;swap(&x, &y);cout << "x : " << x << "\t" << "y : " << y << endl;stu s1;cout << "struct stu : " << &s1 << endl;func1::func(s1);//这样调用会导致创建两个结构体的内存func2::func(s1);//调用这个用到引用的函数,系统开销会小一些,不会有新的结构体形参变量出现。return 0;
}

在使用引用时需要注意一下几个问题:

  • &的位置是灵活的,一下几种定义完全相同

    int& nr = num;
    int &nr = num;
    int & nr = num;
    
  • 在变量声明时出现&才是引用运算符(包括函数参数声明和函数返回类型的声明)

    int &nr = num;
    int &f(int &nr, int &n);
    
  • 引用必须定义时初始化

    float f;
    float &r1 = f;
    float &r2;
    r2 = f; //错误
    
  • const引用(常引用)。在定义引用时一般为左值(变量)。

    左值,是指变量对应的那块内存区域,是可以放在赋值号左边的值;

    右值,是指变量对应的内存区域中存储的数据值,是可以 放在赋值号右边的值;

    常量、表达式都是右值,例如:

    int i = 1;
    i = i+10;
    i+10 = i; //错误
    i = 10;
    10 = i; //错误
    

    可以使用const进行限制,使他成为不允许修改的常量引用。

    int x = 10;
    //	int &ri = 100;  //error
    const int &r1 = 100; //ok 常引用 万能引用
    const int &r2 = x; //ok
    //	r1++;	//error
    int a = 100;
    char &c = a; //错误,将c转换char类型,转换结果保存到临时变量中 实际引用临时变量,而临时变量是右值
    
  • 引用的本质

    引用的本质就是指针常量。

    #include <iostream>
    using namespace std;void swap(int &x, int &y) { //交换函数int temp = x;	//temp = *y;x = y;		//*x = *y;y = temp;	//*y = temp;
    }int main (void) {int x = 10, y = 20;swap(x, y);return 0;
    }