第5课-引用的本质分析
1. 引用的意义
-
引用作为变量别名而存在,因此在一些场合可以代替指针
-
引用相对指针来说具有更好的可读性和实用性
swap函数的实现对比:
void swap(int& a, int& b) { int t = a; a = b; b = t; } void swap(int* pa, int* pb) { int t = *pa; *pa = *pb; *pb = t }
注意:函数中的引用形参不需要初始化!
2. 特殊的引用
- const引用
- 在C++中可以声明const引用
- const Type& name = var;
- const引用让变量拥有只读属性
int a = 4; const int& b = a; int* p = (int*)&b; b = 5; // Error,只读变量 *p = 5; // OK,修改变量a的值
- 当使用常量对const引用初始化时,编译器会为这个常量分配空间,并将引用名作为这段空间的别名
const int& b = 1; // OK int* p = (int*)b; b = 5; // Error,只读变量 *p = 5; // OK,修改变量a的值
结论:使用常量对const引用初始化后将生成一个只读变量
3. 思考
引用有自己的存储空间吗?
struct TRef { char& rc; } printf("sizeof(TRef) = %d\n", sizeof(TRef));
4. 引用的本质
引用在C++中的内部实现是一个指针常量
Type& name; <==> Type* const name; void f(int& a) void f(int* const a) { { a = 5; <==> *a = 5; } }
注意:
1. C++编译器在编译过程中用指针常量作为引用的内部实现,因此引用所占用的空间大小与指针相同
2. 从使用的角度,引用只是一个别名,C++为了实用性而隐藏了引用的存储空间这一细节
5. 引用的意义
- C++的引用旨在大多数情况下代替指针
- 功能性:可以满足多数需要使用指针的场合
- 安全性:可以避免由于指针使用不当而带来的内存错误
- 操作性:简单易用,又不失功能强大
6. 小结
-
引用作为变量别名而存在旨在代替指针
-
const引用使得变量拥有只读属性
-
引用在编译器内部使用指针常量实现
-
引用的最终本质为指针
-
引用可以尽可能的避开内存错误
本文出处:狄泰软件学院
浙公网安备 33010602011771号