前言
本文记录本渣渣依据黑马程序员C++课程视频学习C++笔记本节记录C++中的引用
2.引用
2.1.引用的基本使用
- 作用:给变量起别名
- 语法:数据类型 &别名 = 原名
使用引用后,别名将具备原数据的一般属性
简易代码演示:
#include <iostream>
using namespace std;
int main() {
int Reference_variable = 10; //变量原名 = Reference_variable,原值 = 10
int& ref = Reference_variable; //引用
cout << "输出原值 " << Reference_variable << endl;
cout << "使用引用输出" << ref << endl; //2者输出相同
ref += 1; //修改引用的变量值
cout << "输出修改后值" << Reference_variable << endl; //修改引用的变量值,即修改原值
cout << "使用引用输出" << ref << endl; //2者输出相同
cout << "输出原变量地址" << int(&Reference_variable) << endl;
cout << "输出引用地址 " << int(&ref) << endl; //可以观察到2者地址相同
system("pause");
return 0;
}
运行结果:
2.2.引用的注意事项
- 引用必须初始化,不存在空引用,引用必须连接到一块合法的内存。
- 引用在初始化后不可更改。
此处所说修改,是修改引用的值,引用的变量值是可修改的
2.3.引用的本质
引用的本质:引用在C++内部实现时一个指针常量
即
int &ref = a; //将转换为 int* const ref = &a;
ref = 20; //将转换为 *ref = 20;
这也是为何引用必须初始化,且初始化后不可改变
图示
报错信息
C++推荐使用引用技术,引用的语法更清楚简单,可读性高
2.4.引用做函数参数
- 作用:
使用引用传递函数的参数,在内存中并没有产生实参的副本,它是直接对实参操作;而使用一般变量传递函数的参数,当发生函数调用时,需要给形参分配存储单元,形参变量是实参变量的 副本;如果传递的是对象,还将调用拷贝构造函数。因此,当参数传递的数据较大时,用引用比 用一般变量传递参数的效率和所占空间都好。 - 通过引用传参产生的效果同地址传递是一样的,引用的语法更清楚简单,可读性高
- 使用:
数据类型 函数名(数据类类& 形参名){函数主体}
简单代码演示:
#include <iostream>
using namespace std;
void coutValue(int& ref) {
cout << "引用地址: " << int(&ref) << endl;
cout << "引用作函数参数输出值:" << ref<< endl;
}
int main() {
int Reference_variable = 10; //变量 Reference_variable
cout << "原变量地址:" << int(&Reference_variable) << endl;
coutValue(Reference_variable); //函数调用
system("pause");
return 0;
}
输出结果:
2.5.引用做函数返回值
引用是可以作为函数的返回值存在的,可以返回一些特定的值或类对象
- 引用作函数返回值,可以返回一些特殊值
#include <iostream>
using namespace std;
ostream& Func(ostream &cout ) {
return cout;
}
int main() {
int value = 20;
Func(cout) << value << endl; //引用作函数返回值,返回特殊值
system("pause");
return 0;
}
运行结果:
ostream 为标准输出流库
- 不应返回函数局部变量引用
#include <iostream>
using namespace std;
int& Func() {
int temp = 10;
return temp;
}
int main() {
cout << Func() << endl; //引用作函数返回值
int& value = Func();
cout << value << endl; //如果第一次值未变,说明此地址所指内存尚为被改变
cout << value << endl; //不应返回局部变量引用
system("pause");
return 0;
}
运行结果:
如果第一次值未变
说明此地址所指内存尚为被其他数据覆盖或编译器做了保留
我们不应返回局部变量引用,这是危险操作
- 引用做函数返回值时,函数调用可作左值
#include <iostream>
using namespace std;
int& Func() {
int temp = 10;
return temp;
}
int main() {
int value = 20;
cout << "引用作函数左值:" <<(Func() = value) << endl; //引用作函数返回值时,可以作左值
system("pause");
return 0;
}
运行结果:
2.6.常量引用
可以在定义引用时,加上const 修饰,防止引用的变量值改变
- 引用声明时加上const后,变为常量引用
- 作用:常量引用主要用在函数形参,防止函数中误操作,修改实参值
图示: