上次写了一些关于形参实参传值的理解
函数要是不传地址的话,一些涉及到地址的函数比如交换函数就无法实现它的功能
那么要是想通过想通过形参修改实参呢,这样就可以引入 引用这个概念了
首先来看看引用的声明和定义:
int a = 10;
int& ra = a;
上面的代码就是 ra 引用了 a,就像给 a 起了一个外号叫做 ra
这个 ra 的特点就是,内存不会给引用变量 ra 开辟新的内存空间,也就是说 ra 和 a 的地址是一样的,这里就不放截图了,可以自己在IDE取地址看看.
引用的特性如下
特性:
1. 引用在定义时必须初始化
2. 一个变量可以有多个引用
3. 引用一旦引用一个实体,再不能引用其他实体
接下来就是常引用了
首先我们知道const
定义的常量是不允许被修改的,用const
定义的常量是不能被普通的引用的
比如
const int a = 10;
int& ra = a;
上面的代码不会通过编译,因为 a 是一个常量,不能被修改,那么如何定义呢
const int& ra = a;
这样就行
辣么,引用的应用场景有哪些呢?
首先,在一些方面会方便一些
比如
struct A {
int b;
};
int main() {
A aa;
int& rb = aa.b;
return 0;
}
比如在调用结构体里面的变量的时候,把 aa.b 替换成 rb ,可能会方便一些
然后就是做参数了
看下面的代码
void Swap(int& left, int& right) {
int temp = left;
left = right;
right = temp;
}
int main() {
int a = 10;
int b = 20;
Swap(a, b);
return 0;
}
引用变量作为参数,可以不用取地址就修改实参的值
但是有一个缺陷,随意修改实参的值可能会导致错误, 解决的方法就是:
//保护实参安全,加上const使得形参不会改变实参
void Print(const int& ra) {
cout << ra << endl;
}
int main() {
int a = 10;
Print(a);
return 0;
}
可以保护实参,不被修改
接下来还可以做函数的返回值
//返回结果的生命周期不受函数控制(实体的生命周期要比函数长)
int& Add(int left,int right) {//int & ret=main函数里Add函数返回的值
int ret = left + right;
return ret;
}
int main() {
int& ret = Add(1, 2);//这个ret相当于Add中ret的别名
Add(3, 4);
return 0;
}
Add 的返回值是 int& ,主函数中的 ret 就是 Add 函数里 ret 的引用