1.引用
引用的概念
引用不是新定义一个变量,引用实质上是给已存在变量取一个别名,引用不会开辟新的地址空间,他和他引用的变量共用一块地址空间
引用的特性
引用的变量必须初始化
引用' = '左右必须是同种类型的
一个变量可以有多个引用,但一个引用只能对应一个实体
常引用
常引用就是const类型的引用
int main()
{
//const int b = 10;
//int& rb = b;
return 0;
}
当我们使用这样的代码时,编译器不可能通过编译,那是因为const将b看作一个常量,而常量无法修改,如果可以取别名的话,那么常量就可能被修改,这不符合常量不能被修改的特性。
所以必须在引用前也加上const。
根据引用的特性,引用和被引用单元必须具有相同的类型,但是如果在引用前加上const
int main()
{
double a = 10;
const int& ra = a;
return 0;
}
这是编译器会警告我们
而且当我们更改a的值时,按引用的概念来说,ra的值也会被改变,但当我们实际操作时发现,ra的值并没有被改变,这时我们取a 和 ra 的地址来看,我们就会发现它两并不是同一个地址空间
所以说,当我们编译器为了保证const修饰成常量的这种特性,他会给ra创建一个临时变量,所以修改a的值不会修改ra的值。
所以说临时变量具有常属性。
当我们使用引用时,我们可以将他作为参数,这样参数就可以同时具有传值和传址的优点。
同时,我们也可以将引用作为函数的返回值,但是必须注意的是,函数返回值的生命周期必须不受函数的控制即生命周期比函数长。
在深入研究引用时,我们会发现,引用的语法概念是别名,没有独立空间,和其实体引用同用一块地址空间,但是在其底层实现上实际是有空间的,因为引用是用指针的方式来实现的。
用这样一段代码
int main()
{
int a = 10;
int& ra = a;
ra = 20;
int *p = &a;
*p = 20;
return 0;
}
查看其反汇编
将其对比,很容易就可以发现两个的实现原理是一样的。
对比引用和指针最后总结一下