引用的本质:给变量起别名
语法
数据类型 &别名 = 原名
e.g.
int a = 10;
int &b = a;
如果此时,通过b修改了这块内存的值,a的值也改变了
b = 20;
cout << a << endl;
此时的输出为20
示例代码:
#include<iostream>
using namespace std;
int main(){
int a = 10;
int &b = a; // 创建引用,引用初始化
return 0;
}
引用的注意事项
引用必须要初始化,引用初始化之后,就不可以改变了
1. 引用必须要初始化
错误示范
int &b; //错误的
这是错误的,引用必须要初始化。
2. 引用一旦初始化后,就不可以更改
错误示范
int a = 10;
int &b = a;
int c = 20;
b = c; //这是赋值操作,而不是更改引用,这行代码把a和b的值更改为20了
引用作函数参数
函数传参时,可以使用引用让形参修饰实参
优点:简化指针修改实参
#include<iostream>
using namespace std;
// Exchange
// 1.值传递
void mySwap01(int a, int b)
{
int temp = a;
a = b;
b = temp;
}
// 2.地址传递
void mySwap02(int *a, int *b) //用指针接收地址
{
int temp = *a;
*a = *b;
*b = temp;
}
// 3.引用传递
void mySwap03(int &a, int &b) //通过引用的方式接收,相当于别名和原名一样
{
int temp = a;
a = b;
b = temp;
}
int main(){
int a = 10;
int b = 20;
mySwap01(a, b); // 实参a和b没有发生改变(形参改变了,但形参不会修饰实参)
mySwap02(&a, &b); // 传入a和b的地址,通过地址传递,形参是会修饰实参的
mySwap03(a, b); // 引用传递,形参修饰实参
return 0;
}
引用作函数返回值
引用是可以作为函数的返回值存在的
注意点:
1、不要返回局部变量的引用 - 返回的引用无意义
#include<iostream>
using namespace std;
// 错误示范
int& test01()
{
int a = 10; // 局部变量存放在栈区
return a;
}
int main(){
int &ref = test01();
return 0;
}
2、函数的调用可以作为左值
#include<iostream>
using namespace std;
int& test02()
{
static int a = 10; // 静态变量,存放在全局区,全局区上的数据在程序结束后系统释放
return a;
}
int main(){
int &ref = test02();
test02() = 1000; // ref的值会变为1000,如果函数的返回值是引用,这个函数调用可以作为左值
return 0;
}