C++ 引用
1、引用
引用本质是给变量起别名,引用必须初始化,且在初始化后不可以改变。
语法:数据类型 &别名 = 原名;
#include<iostream>
using namespace std;
int main()
{
//引用:给变量起别名
int a = 5;
//创建引用,引用必须要初始化
int& b = a;
cout << "a = " << a << endl;
cout << "b = " << b << endl;
//通过别名修改值
b = 20;
cout << "a = " << a << endl;
cout << "b = " << b << endl;
//引用初始化后不可改变
//&b = 20; //报错:表达式必须是可修改的左值
cout << "引用初始化后不可改变; &b = 20; //报错:表达式必须是可修改的左值" << endl;
system("pause");
return 0;
}
输出结果
a = 5
b = 5
a = 20
b = 20引用初始化后不可改变; &b = 20; //报错:表达式必须是可修改的左值
2、引用作函数参数
引用作函数参数时,形参修饰实参,可以简化指针修改实参。
#include<iostream>
using namespace std;
void swap(int& p1, int& p2)
{
int tmp = p1;
p1 = p2;
p2 = tmp;
}
int main()
{
//引用:作为参数传递 - 形参修饰实参
int a = 5;
int b = 3;
cout << "交换前 a = " << a << ", b = " << b << endl;
swap(a, b);
cout << "交换后 a = " << a << ", b = " << b << endl;
system("pause");
return 0;
}
输出结果
交换前 a = 5, b = 3
交换后 a = 3, b = 5
3、引用作函数返回值
引用作函数返回值时,不要返回局部变量引用,函数调用可以作为左值。
#include<iostream>
using namespace std;
//函数返回值为引用,返回局部变量出现的问题
int& f1()
{
int a = 5;
return a;
}
//返回静态变量引用
int& f2()
{
static int a = 5;
return a;
}
int main()
{
//引用:作函数返回值时,不要返回局部变量引用,函数调用可以作为左值。
//测试调用函数 - 返回局部变量的引用
int& result = f1();
cout << "返回局部变量引用 result = " << result << endl;
cout << "返回局部变量引用 result = " << result << endl;
cout << "返回局部变量引用 result 值异常" << endl;
//测试返回静态变量引用
int& result2 = f2();
cout << "返回静态变量引用 result2 = " << result2 << endl;
cout << "返回静态变量引用 result2 = " << result2 << endl;
cout << "返回静态变量引用 result2 值正常" << endl;
//返回引用作为左值
f2() = 27;
cout << "返回引用的函数作为左值 result2 = " << result2 << endl;
cout << "返回引用的函数作为左值,修改了引用变量 result2 值" << endl;
system("pause");
return 0;
}
输出结果
返回局部变量引用 result = -858993460
返回局部变量引用 result = -858993460
返回局部变量引用 result 值异常
返回静态变量引用 result2 = 5
返回静态变量引用 result2 = 5
返回静态变量引用 result2 值正常
返回引用的函数作为左值 result2 = 27
返回引用的函数作为左值,修改了引用变量 result2 值
4、引用的本质(指针常量)
在C++中,引用的本质内部实现是一个指针常量。指针常量可参见:C++ 学习(七)指针、const修饰指针、指针与数组、指针与函数_瘦身小蚂蚁的博客-CSDN博客
int a = 5;
int& b = a; //自动转换为 int* const b = &a; 即为指针常量,指针常量指针指向不可修改,即引用初始化后不可修改,但是指针指向的值可以修改,即引用的值可以修改。b = 17; // 自动转换为 *b = 17; 修改指针指向的值,即修改引用的值。
5、常量引用
常量引用主要用来修饰形参,防止误操作。
语法: const 数据类型& 变量名 = 值;
const int& a = 5;
//编译器优化代码:int tmp = 5; const int& a = tmp; int& a = tmp;本质是一个指针常量,因此const int& a = tmp; 是const修饰指针又修饰常量,因此指针指向不可修改,指针指向的值也不可修改。
//a = 10; //常量引用不可修改
//&a = 10; //常量引用的值不可修改
#include<iostream>
using namespace std;
//常量引用使用场景:通常用来修饰形参,防止修改了引用形参修饰的实参
void print(const int& x)
{
//x = 30; //防止修改引用形参
cout << "常量引用 x = " << x << endl;
}
int main()
{
//引用:常量引用
//引用本身需要一个合法内存空间,以下写法会报错
//int& a = 5; // 报错:非常量引用的初始值必须为左值
//常量引用
const int& a = 5; //编译器优化代码:int tmp = 5; const int& a = tmp;
cout << "常量引用 a = " << a << endl;
//a = 10; //常量引用不可修改
//&a = 10; //常量引用的值不可修改
//防止修改引用形参
cout << "防止修改引用形参" << endl;
print(a);
system("pause");
return 0;
}
输出结果
常量引用 a = 5
防止修改引用形参
常量引用 x = 5