1 离港总动员
- 指针 vs 引用
- define VS const
- 函数默认值 & 函数重载
- 内存管理类(出来混,总是要还的…)
2 c++ 语言引用
- 引用是变量的别名
- 引用不能单独存在,只能对存在的变量声明引用
2.1 基本使用
说明:对变量的引用的操作等价于对变量本身进行操作。
基本类型的引用
1 |
|
结构体类型的引用
1 |
|
指针类型的引用类型 *&指针引用名 = 指针;
1 |
|
2.2 引用作为函数实参
说明: 在处理诸如交换两个变量的值之类的问题时,引用
比指针
的实现更简单。
交换两个变量的值
方式一:应用指针
1 |
|
方式二:应用引用
1 |
|
3 c++ 语言 const 关键字
3.1 const
说明: 用来限制对值的写权限,常见用途包括
- 提高代码的可读性
- 防止函数对变量的修改
3.1.1 基本用法
const 与基本数据类型
说明:基本数据类型的变量使用 const ,使变量的值只读。
不使用 const 的内存模型
1 | int x = 3; // 变量 |
变量名|存储地址|存储内容
—|—|—
x|&x|3
使用 const 的内存模型
1 | const int x = 3;// 常量 |
变量名|存储地址|存储内容
—|—|—
x|&x|3(只读)
const 与指针类型
通过p指向内容只读
1 | int x = 3; |
变量名|存储地址|存储内容
—|—|—
x|&x|3
p|&p|&x
指针 p 只读
1 | int x = 3; |
变量名|存储地址|存储内容
—|—|—
x|&x|3
p|&p|&x(只读)
指针 p 和 通过 p 指向内容都只读
1 | const int x = 3; |
变量名|存储地址|存储内容
—|—|—
x|&x|3(只读)
p|&p|&x(只读)
const 与引用(别名)
说明: 声明别名时如果被 const 修饰,则通过别名对变量的值的访问是只读的,但不影响其它方式对该变量的访问。
1 | int x = 3; |
变量名|存储地址|存储内容
—|—|—
x|&x|3
3.1.2 注意点
- 针对已有变量,声明指针或引用时,读写权限不能高于原变量。
错误示例
1 | const int x = 3; |
正确示例1
2
3int x = 3;
const int *y = &x;
int *z = &y;
3.2 代码演示
1 |
|
4 c++ 函数新特性
4.1 函数特性
4.1.1 函数参数默认值
注意
- 默认值只能在函数声明中提供(函数定义中给默认值在有的编译器中会出问题)
- 默认值可以有一个或多个,但提供了默认值的参数,必须在参数列表的最右端
- 没实参时则用默认值,否则实参覆盖默认值
1 |
|
4.1.2 函数重载
条件
- 在相同作用域
- 用同一函数名定义的多个函数
- 参数个数或参数类型不同
1 |
|
4.1.3 内联函数
说明: 相比普通函数,內联函数没有真正的调用过程,因为编译时,函数调用语句就被函数体代码和实参代替了。
关键字: inline
理解內联函数
执行流:普通函数 vs 內联函数
- 普通函数: 1->2->3->4->5
- 內联函数:1->3->5(相比普通函数,內联函数没有调用的开销,因此性能更好)
举一个简单的例子
预编译前的代码释义
1 |
|
预编译之后的代码
1 |
|
注意点
- 內联编译是建议性的,由编译器决定。
- 逻辑简单(不要包含 for 循环,非递归),调用频繁的函数建议使用內联。
5 c++ 内存管理
内存管理就是指向操作系统申请或归还内存资源。
5.1 内存管理
5.1.1 内存的申请和释放
- 申请:
new
运算符
1 | /* 一个单位的内存 */ |
- 释放:
delete
运算符
1 | delete p; // 释放一个单位的内存 |
5.1.2 内存管理的其它方式
注意:配套使用不要混搭!
5.1.3 申请内存注意事项
- 使用 new 申请内存,使用 delete 释放内存。
- 申请内存需要判断是否成功,释放内存需要设置空指针。
- new 和 delete 配套使用,不要和 c 语言的方式混搭。
内存释放后,相关变量设置为 NULL(防止不小心使用了 p 或对同一块地址重复释放。如果不设置为 NULL, p 仍然指向那块释放了的内存地址,访问会出现无法预料的情况)。
1 | int *p = new int[1000]; |
1 | int *p = new int[1000]; |
5.2 代码演示
1 | #include <string.h> |