Chinaunix首页 | 论坛 | 博客
  • 博客访问: 242259
  • 博文数量: 69
  • 博客积分: 1415
  • 博客等级: 上尉
  • 技术积分: 570
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-13 16:57
文章分类

全部博文(69)

文章存档

2011年(1)

2010年(5)

2009年(63)

我的朋友

分类: C/C++

2009-08-03 18:16:41

条款1:尽量用constinline而不用#define
::指针常量字符串
  const char * const authorName = \"Scott Meyers\";


二:类中常量

class GamePlayer {
private:
    static const int NUM_TURNS = 5; // constant eclaration
    int scores[NUM_TURNS];        // use of constant
    ...
};
还有一点,正如你看到的,上面的语句是NUM_TURNS的声明,而不是定义,所以你还必须在类的实现代码文件中定义类的静态成员:


const int GamePlayer::NUM_TURNS;    // mandatory definition;
        // goes in class impl.file

为了弥补那些(不正确地)禁止类内进行整型类常量初始化的编译器的不足,可以采用称之为借用enum”的方法来解决。这种技术很好地利用了当需要int类型时可以使用枚举类型的原则,所以GamePlayer也可以象这样来定义:

class GamePlayer {
private:
        enum { NUM_TURNS = 5 } // "the enum hack" — makes
        // NUM_TURNS a symbolic name 
        // for 5
        int scores[NUM_TURNS];// fine
};

除非你正在用老的编译器(即写于1995年之前),你不必借用enum

三:#define max(a,b) ((a) > (b) ? (a) : (b))
int a = 5, b = 0;
max(++a, b);// a 的值增加了2
max(++a, b+10); // a 的值只增加了1

这种情况下,max内部发生些什么取决于它比较的是什么值!

inline int max(int a, int b) { return a > b ? a : b; }


不过这和上面的宏不大一样,因为这个版本的max只能处理int类型。但模板可以很轻巧地解决这个问题:

template
inline const T& max(const T& a, const T& b)
{ return a > b ? a : b; }

有了constinline,你对预处理的需要减少了,但也不能完全没有它。抛弃#include的日子还很远,#ifdef/#ifndef在控制编译的过程中还扮演重要角色。预处理还不能退休,但你一定要计划给它经常放长假。

阅读(1107) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~