条款1:尽量用const和inline 而不用#define (第一章 从C转向C++)

来源:互联网 发布:2017淘宝上传宝贝视频 编辑:程序博客网 时间:2024/05/16 06:24

本条款最好称为:“尽量用编译器而不用预处理”,因为#define 经常被认为好像不是语言本省的一部分。这是问题之一。

#define ASPECT_RATIO 1.653 编译器会永远看不到ASPECT_RATIO这个符号名,因为再源码进入编译器之前,它会被预处理程序去掉,于是ASPECT_RATIO不会加入到符号列表中。

解决这个问题的方案很简单:不用预处理宏,定义一个变量:

const double ASPECT_RATIO = 1.653;

此方法有两个特殊情况要注意。

1.定义指针常量时会有点不同。

  如定义一个基于char*的字符串常量,要写成如下:

     const char* const authorName = "Scott Meyers";

2.定义某个类(class)的常量一般也很方便,只有一点点不同。首先要使它成为类的成员;为了保证常量最多只有一份拷贝,还要把它定义为静态成员:

  class GamePlayer

   {

    private:

       static const int NUM_TURNS = 5;

       int scores[NUM_TURNS];

   };

 如果没有加static,那么编译器会提醒的。

在G++编译器下:报错为:error: ISO C++ forbids initialization of member ‘NUM_TURNS’

                                           error: making ‘NUM_TURNS’ static

 

宏定义:

#define max(a,b)  ((a) > (b) ? (a) :(b))

  如果碰到下面这样的情况,会有奇怪的事发生

  int a = 5 , b =0 ;

      max(++a, b);  //a的值增加了2次

   max(++a, b+10); //a 的值只增加了1次

解决的方案就使用定义函数

template<class T>

inline const T & max (const T& a, const T& b)

{ return a > b? a: b;}

max是C++标准库的一部分。