effective4 条款二 慎用预编译器#define

来源:互联网 发布:simulink怎么增加端口 编辑:程序博客网 时间:2024/06/08 17:41

一    #define ASPECT_RATIO   1.653

通常用如下代替:(定义一个常量替代宏)

const   double    AspectRatio=1.653(通常用大写字母写宏)

以常量替代#defines,有两种特殊情况:

1 定义常量指针

         ........→(常量定义式通常被放在头文件中,以便不同的代码含入,所以指针定义为const)常量字符串 const  char*  const   authorName = "  ABC"

                  →(string 对象比 char *更好,所以更适宜学成) const std::string   authorName =" ABC"  

2  class专属常量

          ........→class GamePlayer {

                               private:

                                      static (静态变量) const int NumTurns= 5;  //常量声明

                                      int    scores[NumTurns];                                 //使用该常量

                                      ......

                                   };

                注意:上面是NumTurns的声名式而非定义式(通常c++要求提供定义式,但有一种情况特殊:它是1 class专属常量; 2 static; 3 整数型常量;4 不取它的地址

                          如果要求找NumTurns的地址,则需提供定义式如下:

                                       const  int  GamePlayer::NumTurns

二    #defines不能用来定义class的专属常量,也不能够提供任何封装性

三     旧式编译器可能不支持一 2 的语法(不允许static在声明式里定义常量),这时可以这样实现:

           class GamePlayer{

                    private:

                              static const int NumTurns;

                              ....

             };

         const int  GamePlayer::NumTurns =5;

    或:

         class GamePlayer {

                               private:

                                      enum{ NumTurns= 5}  ;//常量声明

                                      int    scores[NumTurns];                                 //使用该常量

                                      ......

                                   };

四   注意不能用#define来实现宏。宏看起来像函数,但不会招致函数调用带来的额外开销,如以下错误示例:#define CALL_WITH_MAX(a,b) f((a)>(b)?(a):(b))

               而应该用以下template inline函数代替:
                          template <typename T>

                            inline void  CallWithMax(const T&a,const T&b)

                            {

                                f(a>b?a:b)

                             }


    

0 0
原创粉丝点击