星期日, 一月 18, 2009

《Effective C++》学习笔记


《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];

    ......

};

 

没有评论: