让自己习惯C++

条款1.C++是一个语言联邦

     过程形式(procedural)

     面向对象形式(object-oriented)

     函数形式(function)

     泛型形式(generic)

     元编程形式(metaprogramming)

    NOTE:

    C++有四个次语言:

  1.C  

     no templates ,no exceptions ,no overloading...

  2.object-oriented C++ 

     class, encapsulation ,inheritance ,polymorphism ,virtual function...

  3.template C++ 

    template metaprogramming(TMP  模板元编程)

           这块接触比较少!!!!

     4.STL

            containers, iterators,algorithms,function objects.

           这块接触也比较少!!!

      所以,C++高效编程守则视状况而定,取决于使用C++的那一部分。不过觉得,我暂时还考虑不到性能问题,先解决功能问题再说。

      条款2:尽量以const ,enum,inline 替换#define(prefer consts,enums,and inlines to #defines)

          其实也是,宁愿以编译器替换预处理器。#define 变量在preprocess时被替换掉了。最好让变量保留,编译器可以看到,为了让标识符进入

     sysmbol table( 记号表)。

            const double AspectRation = 1.653; //这样比#define AspectRation 1.653 更科学,易debugg问题。

        对于const 替代 #define有2点:

               1.常量指针:

                    const char* const authorName = "scott meyes";

                    cosnt std::string authorName ("scott meyes"); //貌似这个效果最好。暂时不知道原因???

                2.class的专属常量:

                   class GamePlayer{

                    private:

                         static const int NumTurns = 5;//常量声明式  ,这个不懂,以前以为这种写法就是对变量的definition.这里为何只是declaration ???

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

                         ....

                      };

                   const int GamePlayer::NumTruns;//NumTurns的定义

                   看到上面的code,有点闷了!!这个跟之前理解的变量的声明和定义完全反过来了。那到底如何区别变量的declaration/definition???

                  #define 是不可以控制作用域的,const可以。

                   也提到了enum hack 这个知识点。其实就是枚举一个标识符并赋值,当int 数据类型使用。

                   

                  以上提到的都是简单的宏,对于宏参模式(看起来很像函数),用inline函数代替。

                 直接上例子了:

                   #define call_max(a,b) f((a)>(b)?(a):(b))

                    int a = 5 , b = 0;

                    call_width_max(++a,b);//a 被累加了2次

                    call_width_max(++a,b+10);//a被累加了1次

                   good code:

                       template<typename T>

                       inline void callwithmax(const T& a, cosnt T& b)//pass by reference to const

                       {

                         f(a>b?a:b);

                        }

             consts , enums and inlines 使我们对预处理器的依赖性减低了。特别是#define,但#include,#ifdef/#ifndef仍然需要。

              NOTE:

                 对于单纯变量,最好const 对象或enums 代替#defines

                 对于带参数的宏,最好用inline函数 代替#define .

              一句话,尽量不要让预编译的code出现在你的代码中。想法替换掉。

                

原文地址:https://www.cnblogs.com/chip/p/4758669.html