一.引用的概念:
变量名:
变量名实质上是一段连续存储空间的别名,程序通过变量来申请并命名内存空间,通过变量的名字可以使用存储空间
引用:
C++中新增加的概念,引用可以看作一个已定义变量的别名
定义引用的方式:
Type& name = var;
引用的作用:
引用作为其它变量的别,在一些场合可以代替指针,引用相对于指针来说具有更好的可读性和实用性
二.引用的本质:
引用在C++中的内部实现是一个常指针
//下面两个定义实质上是相同的
Type& name
Type* const name
C++编译器在编译过程中使用常指针作为引用的内部实现,因此引用所占用的空间大小与指针相同。
C/C++中的间接赋值:
//一个简单的间接赋值的例子
int i = 10; //定义一个int型变量i
int * name = &i; //定义一个int类型的指针,指向i
name = 11; //间接赋值:通过指针修改i的值
间接赋值成立的三个要素:
1)定义两个变量 (一个实参,一个形参)
2)建立关联,实参取地址传给形参
3)使用指针形参去的修改实参的值
引用的底层实现:
引用在实现上,只不过是把间接赋值的三个要素的后两步和而为一,当实参传给形参引用的时候,C++编译器帮我们取了一个实参地址,传给了形参即一个引用类型的变量(常量指针)
二.引用与const修饰符:
2.1 普通引用
下面是定义一个普通引用的方式:
int a = 10;
int &b = a;
2.2 常量引用
使用const关键字定义引用,则这个引用为常量引用
常量引用的本质:
//以下两式等价
const & int e
const int * const e
常量引用的定义:
//c为一个常引用
const int &c = a;
不能使用常量引用修改该引用对应的数据,例如:不能给上例定义的常量引用赋值,c = 12是错误的。但是常量引用对应的数据是可以变化的,如:a=11,给a赋值是可以的
常量引用的初始化
1)用变量初始化常量引用
int x = 20;
const int& y = x;
不能使用y修改变量x的值,但x的值是可以更改的
2)用常量初始化常量引用
普通引用是不能用常量初始化的
引用是内存空间的别名,字面量10没有内存空间,没有方法做引用
int &m = 10; //不正确的初始化方法
常量引用是可以用常量初始化
当使用常量(字面量)对const引用进行初始化时,C++编译器会为常量值分配空间,并将引用名作为这段空间的别名
const int &m = 10;