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 对象”的初始化相对次序并无明确定义)