- 引用的是什么
- 引用的本质
- 引用的由来及其存在意义
- 引用和指针的区别
- 引用的基础用法
- 引用的进阶用法
- 左值引用与右值引用
思考
思考这几段函数的区别,看不懂没关系,后面会一一讲解
#include <iostream> using namespace std; void swap1(int a , int b ) { int t =a; a=b; b=t; } void swap2(int *a, int *b) { int t = *a; *a = *b; *b = t; } void swap3(int &a, int &b) { int t = a; a = b; b = t; } void swap4(int &a , int &b) { int t = a; a=b; b=t; }
引用是什么
【1】引用就是给某一个变量的别名,小名
声明一个引用,不是重新定义一个变量,而是给这个变量多取了名字(外号)
它不是一个数据类型,因此引用也不占储存单元,系统也不用给引用分配存储单元;
引用大小和指针大小一致 4 ; int a = 9; int &b = a; // a 就是这个int型变量的大名 // b 就是这个int型变量的小名 // 两个都是一个东西,因此修改b也就是修改了a,同样修改了a的值也就是修改了b; b = 90; cout<<a<<endl; cout<<b<<endl; // 结果 a=90 b=90 a = 80; cout<<a<<endl; cout<<b<<endl; // 结果 a=80 b=80
cout<<sizeof(b)<<endl;
// 结果 sizeof(b)=4
【2】引用功效
引用仅仅作为一个别名好像是没有什么实际功效,它主要的作用就是作为函数参数,和返回值类型;
【3】引用注意
1.声明引用时候 必须同时初始化,因为没有空引用
2.不能建立数组的引用。因为数组是一个由若干个元素所组成的集合,所以无法建立一个数组的别名
3.引用声明完毕后,相当于目标变量名有两个名称,即该目标原名称和引用名,且不能再把该引用名作为其他变量名的别名。
4.引用初始化后不能被改变。
引用的本质
引用本质是指针常量;引用自己就是一个地址单元;
(int & a) == (int * const a)
void func(int &a)
{
int b = 10;
int &a = b;
}
void func(const &a)
{
int b = 10;
const &a = b;
}
指针常量: 指针指向的地址不可以改变,指向的内容可变;
引用的由来及存在意义
可能有人会问,c没有引用这个概念,既然指针和引用本质差不多,为什么c++还要引入引用的概念,这不多此一举吗?
引用是指针的优化版,也是c++对c的扩充;
1:若是操作大型数据时,用指针还需要压栈,效率低,引用就不需要临时申请栈内存来存储局部变量;
- 引用的由来及其存在意义
- 引用和指针的区别
- 引用的基础用法
- 引用的进阶用法
- 左值引用与右值引用