一、引用介绍
1、定义: int a ; int &b = a;
2、引用定义和识别的关键:&符号。注意这里和取地址没有任何关系。
3、引用符号在定义时必须同时初始化,以后不能再另外赋值,只能使用。
二、引用和指针的对比
1、指针在C和C++中都有,且使用方法和实现本质完全相同,引用只有C++可用。
2、引用可以理解为功能弱化、安全性增强的低配版指针。
3、引用能做的事情,指针都能做。但指针能做的事情,引用不一定能做。
4、引用是它指向变量的“别名”,这个是从引用的使用效果角度讲的,对熟悉指针的人反而不好理解“别名”这个词。
5、引用比指针弱的地方就是一个引用定义时绑定了一个变量,后面没法改了。
6、引用比指针强的地方也是没法改,所以不存在“野指针”的问题,更安全。
7、引用主要用在函数传参和返回值。
三、引用的本质剖析
1、引用可以加 const 修饰
- const int &b = a; 表示b是a的const别名,无法通过b修改a了
- 主要用在函数形参中,告诉大家该函数内部不会修改实参的值。用在某些时候我们有一个非const类型的变量,但是我们在某个函数调用的过程中,不希望变量的值在函数内部被修改,这时候就可以用const引用来传参。
2、引用的本质是 const 指针
- sizeof 引用,得到的不是引用本身的大小,而是引用指向的目标变量的大小。(sizeof 指针 得到的是指针本身的大小)。
- 在 struct 或class 中定义一个引用,再 sizeof 整个struct或class就会不一样
3、引用的本质是 const 指针
- int &b = a; 类似于 int * const b = &a ;
- C++ 标准并没有规定引用是否占用内存空间,但是大多数编译器都把引用实现为 const 指针,所以大部分编译器中引用也是要占内存空间的
- 引用是天然 const 的,所以定义时必须初始化指向变量,否则就没意义了
- 引用本质是指针,是地址,所以才能实现传址调用的效果
4、总结:引用就是指针在定义时把指针变量本身 const 化
demo:实现swap函数
需求:实现2个变量的数值交换
// 不成功,形参交换成功,实参交换失败
void swap1(int a, int b)
{
int tmp;
tmp = a;
a = b;
b = tmp;
}
// 成功,用指针,实参交换成功
void swap2(int *pa, int *pb)
{
int tmp;
tmp = *pa;
*pa = *pb;
*pb = tmp;
}
// 成功,用引用,实参交换成功
void swap3(int &pa, int &pb) // &在这里是引用标识符
{
int tmp;
tmp = pa;
pa = pb;
pb = tmp;
}
int main()
{
int x = 1, y = 2;
int &ra = x;
int &rb = y;
swap1(x,y); //x=1,y=2
swap2(&x, &y); //这里的&是取地址 //x=2,y=1
swap3(ra , rb); //x=2,y=1
}