引用是C++基础中比较重要的一部分,像引用的意义和作用。接下来我会逐步介绍。
(1)引用概念
引用不是一个新的变量,引用是一个变量的别名,别名的意思就是另一个名字,打个比方就是你的名字和你的小名都是你,别名改变,其本身也会改变,本身改变也会让别名改变。 因此在编译器中,它是不会给引用开辟一个新的空间,它与它引用的变量公用同一块空间,但这也只是限制在语法中,在底层实现时还是不同的空间,如下图所示:
补充: 引用的类型必须和实体的类型相同
引用格式: 类型 + & + 引用变量名(对象名) = 引用的实体
(2)引用特性
①引用在定义时必须初始化,下面不初始化时,在VS下会报出这个错误:
int& ra;
②一个变量可以有多个引用
//就像一个人,可以同时拥有多个名字
int a = 10;
int& ra = a;
int& rra = ra;
int& rrra = rra;
③引用一旦引用了一个实体,就不能再去引用其他实体
这句话的意思就是: 有两个变量a, b,如果其中一个变量a被引用,引用的变量名字是: ra, 那么这个ra就不能再去作为b的引用。
(3)引用的两个价值
第一个价值: 作为参数
如下代码所示 (引用和指针):
//引用
void Swap(int& num1, int& num2)
{
int tmp = num1;
num1 = num2;
num2 = tmp;
}
//应用了引用的特性。num1 和 num2 是我们要交换的两个值
//对别名的改变也会改变其本身
//指针
void Swap(int* num1, int* num2)
{
int tmp = *num1;
*num1 = *num2;
*num2 = tmp;
}
我们发现:引用时, 其中a 和 num1 地址是一样的, b 和 num2地址是一样,指针时, 其中形参也会各自开辟一块空间, 因此在使用传引用时:可以减少拷贝,提高效率
结论: 当引用作为参数时,可以不用去开辟新的空间,可以提高效率。
第二价值:作为返回值
①static 修饰的静态变量返回
有如下代码:
int& Count()
{
static int n = 0;
n++;
return n;
}
int main()
{
int& ret = Count();
cout << ret << endl;
return 0;
}
其中引用返回值类型时, 我们返回的其实相当于是 n 的一个别名,我们知道,在函数开辟空间时,出了函数时函数所占用的空间也随之销毁,但是由于我们定义的变量 n 为静态的,它是在我们的静态区,出了函数也不会随之销毁,去访问n时也能访问。
补充:空间销毁意义
(1)空间销毁,其空间还在,只是使用权并非是我们
(2)我们依然能访问这块空间,只是空间的内容是不确定的,可能未被覆盖,也可能被覆盖
②非static 修饰的额变量
int& Count()
{
int n = 0;
n++;
return n;
}
int main()
{
int& ret = Count();
cout << ret << endl;
return 0;
}
出了函数的作用域,函数空间就销毁了,其中的变量空间也随之销毁 ,此时再用引用去访问这个空间时,此时空间上的内容就已经是不确定的了
结论:
返回值不存在,则不能用引用返回
返回值存在,则可以用引用返回
引用返回的优点:
1.减小拷贝,提高效率
2.修改返回值
笔记补充:
指针和引用赋值中,权限可以缩小,但不能放大。
类型转换中会有临时变量产生(临时变量具有常性)。
船只返回也不能用引用接收,传值返回本质也是临时拷贝。