C++学习笔记4——引用的本质分析
2018-03-05 19:34
330 查看
引用的概念
在C++中新增加了引用的概念引用可以看作一个已定义变量的别名
引用的语法: Type& name = var;
/* 测试代码 */ #include <stdio.h> int main() { int a = 2; int& b = a; // b 为 a 的别名 b = 5; // 操作 b 就是操作 a printf("a = %d\n", a); printf("b = %d\n", b); printf("&a = %p\n", &a); printf("&b = %p\n", &a); return 0; }
运行结果
a = 5 b = 5 &a = 0022FF38 &b = 0022FF38
引用的意义
引用作为变量别名而存在, 因此在一些场合可以代替指针功能性:可以满足多数需要使用指针的场合
安全性:可以避开由于指针操作不当而带来的内存错误
操作性:简单易用, 又不失功能强大
引用相对于指针来说具有更好的可读性和实用性
注意:
普通引用在定义时必须用同类型的变量进行初始化
函数中的引用形参不需要进行初始化
不能返回局部变量和数组的引用
/* 测试代码 swap函数的实现对比 */ #include <stdio.h> void swap1(int* a, int* b) { int t = *a; *a = *b; *b = t; } void swap2(int& a, int& b) { int t = a; a = b; b = t; } int main() { int a = 1; int b = 2; printf("a = %d, b = %d\n", a, b); // a = 1, b = 2 swap1(&a, &b); printf("a = %d, b = %d\n", a, b); // 交换 a = 2, b = 1 swap2(a, b); printf("a = %d, b = %d\n", a, b); // 再交换 a = 1, b = 2 return 0; }
特殊的引用
const引用在C++中可以声明const引用
const Type& name = var;
const引用让变量拥有只读属性
/* 测试代码 */ #include <stdio.h> int main() { int a = 1; const int& b = a; int* p = (int*)&b; // b = 2; error *p = 2; printf("a= %d\n", a); // a = 2 return 0; }
运行结果
a = 2
当使用常量对 const 引用进行初始化时, C++编译器会为常量值分配空间, 并将引用名作为这段空间的别名
使用常量对const引用初始化后将生成一个只读变量
/* 测试代码 */ #include <stdio.h> int main() { const int& a = 1; int* p = (int*)&a; // a = 2; error *p = 2; printf("a= %d\n", a); return 0; }
运行结果
a = 2
引用的本质
引用在C++中的内部实现是一个指针常量Type& name; <==> Type* const name;
注意:
C++编译器在编译过程中 用 指针常量 作为引用的内部实现, 因此引用所占用的空间大小与指针相同
从使用的角度, 引用只是一个别名, C++为了实用性而隐藏了引用的存储空间这一细节
/* 测试代码 */ #include <stdio.h> struct TRef { char* before; char& ref; char* after; }; int main() { char a = 'a'; char& b = a; char c = 'c'; TRef r = {&a, b, &c}; printf("sizeof(r) = %d\n", sizeof(r)); // 12 printf("sizeof(r.before) = %d\n", sizeof(r.before)); // 4 printf("sizeof(r.after) = %d\n", sizeof(r.after)); // 4 printf("&r.before = %p\n", &r.before); printf("&r.after = %p\n", &r.after); return 0; }
运行结果
sizeof(r) = 12 sizeof(r.before) = 4 sizeof(r.after) = 4 &r.before = 0022FF1C &r.after = 0022FF24
相关文章推荐
- C++学习笔记二:引用的本质
- 狄泰C++课程学习笔记:第五课:引用的本质分析
- c++学习笔记-------const限定修饰符和引用
- C/C++中关于地址、指针和引用变量的学习笔记(二) : 数组
- C/C++中关于地址、指针和引用变量的学习笔记(一)
- C/C++中关于地址、指针和引用变量的学习笔记(八) : 命令行参数
- C++学习笔记-指针和引用的注意事项
- C++学习笔记(13)——利用对象、引用、指针调用虚函数
- C++学习笔记1-const引用
- 【菜鸟C++学习笔记】21.引用
- C/C++中关于地址、指针和引用变量的学习笔记(六) : const和void
- C++ Data Structure 学习笔记 (2011.5.3)——传值,指针,引用的区别及Vector与String的详细用法
- C/C++中关于地址、指针和引用变量的学习笔记(五) : 指针
- 【菜鸟C++学习笔记】24. 常见的引用注意问题
- C/C++中关于地址、指针和引用变量的学习笔记(九) : 内存结构
- C/C++学习笔记2 - cin深入分析(上) - cin输入操作处理(原创)
- Effective C++学习笔记:必须返回一个对象时不要试图返回一个引用
- C/C++中关于地址、指针和引用变量的学习笔记(十) : 引用型变量
- 关于C++引用运算符&的若干学习笔记
- c++学习笔记--引用&