const与#define
const | #define |
---|---|
在编译运行阶段使用 | 在预处理阶段展开 |
有数据类型 | 无数据类型 |
编译器会进行类型安全检查 | 只进行字符替换,并可能产生错误 |
可以进行调试(有集成化的调试工具) | 不能调试 |
在内存中分配 | 仅仅是展开 |
可以创建class专属常量。提供封装性 | 无法创建class专属常量,一旦宏被定义,就在其后得编译过程中有效(除非被#undef。即不能提供封装性) |
指针与引用
指针 | 引用 |
---|---|
是一个存储着地址的变量 | 指向对象的一个别名 |
可以在任何时候被初始化 | 创建时必须被初始化 |
可以为NULL | 不能有NULL引用 |
可以随时改变所指的对象 | 不能改变引用的关系 |
需要分配内存空间 | 不需要分配内存空间 |
malloc/free与new/delete
malloc/free | new/delete |
---|---|
标准库函数 | 运算符 |
malloc申请空间不会初始化 | new申请空间会初始化 |
malloc返回值为void*类型 | new返回值为空间的类型 |
malloc申请失败后返回NULL | new申请失败会捕获异常 |
申请自定义对象不会调用构造和析构函数 | 会调用构造和析构函数 |
效率高 | 效率略低(底层封装了malloc/free) |
malloc、calloc、realloc
- malloc:申请的内存位于堆中,没有初始化其中的内容
- 原来没有使用过的话每一位都可能是0,否则可以是任意的数据。
- 返回值是void*类型(可以强制转换为任意类型)。
- calloc:申请到内存即将其初始化为0.。
- 字符型或整形会初始化为0,指针类型的初始化为空指针
- realloc:对申请到的空间进行调整(数据可能移动)。
- 当扩大空间时,会尝试从现存的数据后追加字节;不满足的话会重新开辟内存块,将现有的数据拷贝至新内存处。
static关键字:
- 修饰局部变量
- 在程序运行时初始化并默认初始化为0
- 存储在静态区,具有全局属性
- 修饰全局函数和全局变量
- 只能在此源文件中使用
- 修饰类的成员变量
- 不依赖类对象的存在而存在
- 必须在类外进行初始化(否则会链接错误)
- 修饰类的成员函数
- 无this指针
- 只能访问自身类的静态函数和静态变量
- 总的来说就三个作用:
- 隐藏
- 保持持久性
- 默认初始化为0
返回值、全局变量、异常
优点 | 缺点 | |
---|---|---|
返回值 | 和系统API一致 | 不能方便的使用计算结果 |
全局变量 | 能方便地使用计算结果 | 可能会忘记检查全局变量 |
异常 | 可以为不同的出错原因定义不同异常类型,逻辑清晰 | 有些语言不支持异常,抛异常对性能有负面影响 |