《Effective C++》学习笔记
本文是学习《Effective C++(中文第三版)》的笔记,纯属个人研究之用。
最终版本会包含该书所有的条目。
Item 2:Prefer consts, enums, and inlines to #defines
本质上是多使用编译器而不是预处理器。
宏的作用:
- 定义一个常数
会出现的问题:
1. 宏名可能不会进入符号表,使得调试时常量含义不明
2. 宏的替换会导致多份常量,使得代码变大
3. 无法定义某个class的常量,即宏定义没有作用域
解决方案:使用const定义常量 - 定义一个过程(类似函数)
会出现的问题:
1. 难以理解
2. 展开带有 自增/自减/函数调用 等形式的宏、结果可能会有变化
解决方案:使用inline函数(可以加上模板)
enum hack
enum hack可以实现某些类似宏的功能,比如禁止取一个常量的地址(const常量允许该情况,而#define不允许)。此外,当编译器不够好时,可能为const常量分配额外的存储空间(即使没有使用引用或者指针),而enum hack则可以防止这一点。
第二,某些(错误的)编译器不允许static成员在声明时获得初值,此时可以将初值放在定义时。而如果需要在编译时就需要一个class常量(例如作为数组的长度),则可以使用enum hack。
enum hack的实现如下:
class GamePlayer {privete:enum { NumTurns = 5 } ;int scores[NumTurns];......};