引用是什么?
什么时候使用引用
做函数的参数
做函数的返回值
引用与指针的不同
引用是什么?
引用是变量的别名,理论上不开辟新的空间。
&符号,是类型标识符的一部分
被引用的数据类型 + & 变量名称
![](https://img-blog.csdnimg.cn/eab9726c71cc409db0818b0c294db3d4.png)
如下图中,变量a 与变量ra 指向同一块内存空间。
![](https://img-blog.csdnimg.cn/256a67e0b25540df96d6d7d53f3e6516.png)
由此可知,改变ra 的值,就相当于改变a 的值
![](https://img-blog.csdnimg.cn/62759fdd0a9046258fa40aac407caec7.png)
#include<iostream>
using namespace std;
int main() {
int a = 10;
int& ra = a;
cout << "a = " << a << endl;
cout << "ra= " << ra << endl;
ra = 20;
cout << "a = " << a << endl;
cout << "ra= " << ra << endl;
return 0;
}
注意事项:
引用必须在声明时就赋值。
//错误示例
int a = 10;
int& ra;
ra = a;
![](https://img-blog.csdnimg.cn/f38308d98f4649ed992cf741c9555d5e.png)
什么时候使用引用
做函数的参数
同指针一样,改变形参即可改变实参
void Swap(int& num1, int& num2) {
int tmp = num1;
num1 = num2;
num2 = tmp;
}
做函数的返回值
传值返回:计算return 后面表达式的结果,将结果返回给调用函数。该结果被复制到一个临时位置,而程序将使用这个值。当需要返回一个较大的数据时,将会消耗较多空间或时间。
函数计算的结果在函数的栈帧中,当函数结束调用后栈帧会销毁。内存空间被销毁后,空间还在,也可以访问,但是数据不被保护,读写数据都不稳定。(易出现随机值)
引用返回:返回一个临时变量。减少拷贝,提高效率。并且可以修改返回值。
但是使用引用返回会出现一些问题:返回的是数据的别名,但是数据的真实存储已经被销毁了。
#include<iostream>
using namespace std;
int& test() {
int c = 30;
int& rc = c;
return rc;
}
int main() {
int& ret = test();
cout << ret << endl;
cout << ret << endl;
cout << ret << endl;
return 0;
}
![](https://img-blog.csdnimg.cn/1a673902f0d047349210e5fc787472c3.png)
第一次打印出正确结果是偶然,后面就是随机值了(cout也是函数)
使用引用返回时要注意:
出了作用域,返回变量不存在,就不能用引用返回。因为引用返回的结果是未定义的
![](https://img-blog.csdnimg.cn/73d5f327bd6d4081bcff566f78023f74.png)
出了函数作用域,返回变量存在才可以用引用返回
![](https://img-blog.csdnimg.cn/e14eef689d3f4518b931090ad9e8dda8.png)
const 与引用
在哪些地方使用const + 引用?
引用做参数时参数受限制。
void fnc(const int& x);
在指针和引用赋值中,权限可以缩小,不可以放大。
权限放大的错误示范
![](https://img-blog.csdnimg.cn/ead878c424504e0eac17370b00ab7a0a.png)
修改:
![](https://img-blog.csdnimg.cn/b793aa7c881f4c29a170d6699d2b585e.png)
引用与指针的不同
1. 引用概念上定义一个变量的别名,指针存储一个变量地址。
2. 引用在定义时必须初始化,指针没有要求
3. 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何 一个同类型实体
4. 没有NULL引用,但有NULL指针
5. 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32 位平台下占4个字节,64 位平台下占8个字节)
6. 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小 int main() { int a = 10; int& ra = a; cout<<"&a = "<<&a<
7. 有多级指针,但是没有多级引用