Effective C++ 笔记(1)让自己习惯c++

01、视C++为一个语言邦;

  (1)、C++仍是以C为基础;

  (2)、面向对象的C++,包括构造、析构函数,封装,继承,多态,虚函数等;

  (3)、泛型编程C++,关于Template

  (4)、STL

02、尽量以const,enum,inline替换#define

  (1)、以const 替换#define

GamePlayer.h

class GamePlayer
{
public:
    GamePlayer();
    ~GamePlayer();
    static const int NumTurns = 5;//常量表达式
  //或enum {NumTurns = 5}; int scores[NumTurns]; //使用该常量 static const double FudgeFactor; //static class 常量声明,位于头文件内(double,float不支持在声明时直接初始化) }; GamePlayer.c const double GamePlayer::FudgeFactor //static class 常量定义,位于实现文件内

  (2)、以inline函数替换“宏函数”

#define CALL_WITH_MAX(a, b) f((a)>(b)?(a):(b))
int a = 5;
int b = 0;
CALL_WITH_MAX(++a, b);      //a被累加二次
CALL_WITH_MAX(++a, b+10);   //a被累加一次!!

template<typename T>
inline void callWithMax(const T& a, const T& b)
{
    f(a > b ? a : b);
}

 

03、尽可能使用const

  (1)、修饰普通变量 const int VAL = 20;  //使变量只读  

  (2)、修饰形参(以引用、指针传参时) char *strcpy(const char *srcStr, char *destStr);//该函数不会修改修改srcStr内容

  (3)、修饰返回值(返回值类型为引用、指针时), const Vec2& getPosition(); //该返回值不允许被修改

  (4)、修饰成员函数,该成员函数内部不会修改成员变量(非mutable修饰)

04、确定对象被使用之前已先被初始化

  (1)、为内置类型进行手动初始化

  (2)、构造函数最好使用成员初值列表(效率高),而不要在构造函数本体内使用赋值操作。初值列表列出的成员变量,其排列次序应该和它们在class中的声明次序相同

  (3)、用local static(函数内定义) 对象替换non_local static(全局,class内)对象(问题:对于“定义于不同的编译单元内的non-local static 对象”的初始化相对次序并无明确定义)

posted @ 2018-06-14 18:04  -南  阅读(126)  评论(0编辑  收藏  举报