Effective C++ 第一章——让自己习惯C++

介绍了条款01~04

Posted on May 12, 2017 in Effective_Cpp, ReadBook



条款01:视C++为一个语言联邦

条款02:尽量以const,enum,inline替换#define(以编译器替换预处理器)
条款03:尽可能使用const
条款04:确认对象被使用前已先被初始化


条款01:视C++为一个语言联邦

P11 多重范型编程语言:支持过程,面向对象,函数形式,泛型形式,元编程形式。 
P12 C++等于四个次语言相加:C、Object-Oriented C++、Template C++泛型编程、STL 
P12 不同的次语言有不同的编程策略,例如对pass-by-what而言,类C与STL的迭代器、函数对象合适pass-by-value;Object-Oriented C++、Template C++用pass-by-reference-to-const往往更好。

条款02:尽量以const,enum,inline替换#define(以编译器替换预处理器)

#define是预处理阶段使用的 
P14 定义常量的指针代替#define必须是指向常量的常量指针 
P14 类的专属常量(带有作用域限制的常量) 
class GamePlayer {
   private:
       static const int NumTurns = 5;
       int scores[NumTurns];
       ……
};
 
注意第5行仅仅是声明式而言,因为没有开辟内存的,所以谈不上定义,更谈不上初始化。 
若一定需要定义,就必须在非头文件上写上 
const int GamePlayer::NumTurns;  //这是定义式,不需要给予值,因为在声明式上已经给了

P15 若旧式编译器不支持上面的语法,可以这样写: 
class GamePlayer {
   private:
       static const int NumTurns;
       int scores[NumTurns];
       ……
};
const int GamePlayer::NumTurns = 5;  // 在源文件上写

P15 the enum hack使用方法 
enum{
   NumTurns = 5,
   NumTurnss = 10
};
 
无论在类里面,或者文件里面都可以这样使用,然后下次就可以使用NumTurns了,参见24、枚举类型的使用,这样使用的enum与#define一样不会导致内存的分配 
P16 使用内联inline替代宏 
例如下面以a和b的较大值调用f函数为例 
#define MAX_VAL_CALL(a, b) f((a) > (b) ? (a) : (b))

若要使用宏,无论怎么样都要在每一个实参上加上小括号,但即使如此也是有麻烦的,可以用inline替代
template<typename T>
inline void MaxValCall(T a, T b)
{
 f(a > b ? a : b);
}

条款03:尽可能使用const

P17 指针与const,注意指向常量的指针 与 常量指针的区别(我会读作指针常量来方便区分) 
P18 STL迭代器与congst:由于迭代器就是指针故常量的迭代器就是常量指针 
P18 值得使用:函数与指针:返回值是const常量、 传参是const常量、 const成员函数(好处一:指明哪些函数是不会修改成员变量的,好处二:可以操作该类的const对象(哪里的const对象最多?!pass-by-pointer(reference)-to-const的时候)) 
P21 const成员函数的两个流行概念:bitwise constness与logical constness 
P22 mutable,使得const成员函数可以改变的成员变量 
P23 一个奇妙的const与non-const成员函数的避免重复操作

条款04:确认对象被使用前已先被初始化

P27 对内置non-member变量的初始化相对简单易懂,而自定义变量member变量的初始化任务落在构造函数上,于是乎,需要保证:确保每一个构造函数都将对象的每一个成员初始化。但别混淆赋值与初始化,在构造函数内对每一个成员变量用=号是赋值,这不推荐;推荐使用初始化列表对每一个成员变量进行初始化。 
P29 确保在初始化列表上列出每一个成员变量,而且是按声明的顺序,还有按base classes比derived classes更早初始化的原则。 
P29 若构造函数很多,还是可以将”赋值表现得与初始化一样好的内置变量“从初始化列表中提取出来,放在一个private的成员函数中,供其他构造函数调用。 
P30 探讨“不同编译单元内定义之non-local static 对象”的初始化次序。 
何为non-local static与local static 
何为编译单元 
如何解决上述问题:单例模式,reference-returning函数(懒汉模式),为解决多线程下的问题,可以采用类似饿汉模式的方法。


titlebar_background1.png