Effective C++ --- 让自己习惯C++
1、视C++为一个语言联邦
C++已经是个多重范型编程语言,一个同时支持过程形式、面向对象形式、函数形式、泛型形式、元编程形式的语言
2、尽量以const、enum、inline 替换 #define
宏一般来说不能进行调试,看不到符号体系,给调试带来困难
class GamePlayer {
private:
static const int NumTurns = 5; // 常量声明式
int scores[NumTurns]; // 使用该常量
};
const int GamePalyer::NumTurns; // NumTurns的定义
还可以使用“enum hack”
class GamePlayer {
private:
enum {NumTurns = 5}; // 这样让NumTurns 成为了5的一个记号名称
int scores[NumTurns]; // 使用该常量
};
利用inline函数或者inline的模板函数替换宏函数
template<typename T>
inline T callMax(const T& a, const T& b)
{
return a > b ? a : b;
}
对于单纯常量,最好以const对象或enums替换#defines
对于形式函数的宏,最好改用inline函数替换#defines
3、尽可能使用const
const语法虽然变化多端,但并不莫测高深,如果关键字出现在*左侧,表示被指物是常量;如果出现在*右边,表示指针自身是常量;如果出现在*两边,表示被指物和指针两者都是常量
将const实施于成员函数的目的,是为了确认该成员函数可作用于const对象身上。这一类成员函数之所以重要,基于两个理由。第一,它们是class接口比较容易被理解。这是因为,得知哪个函数可以改动对象内容而哪个函数不行。第二,它们是操作const对象成为可能。成员函数的const性可以用来表示重载,因为操作对象不同。
有些情况下可以结合mutable来改变 bitwise constness
----将某些东西声明为const可帮助编译器侦测出错误用法。const可被施加于任何作用域内的对象、函数参数、函数返回类型、成员函数本地
---- 编译器强制实施 bitwise constness,但你编写程序时应该使用“概念上的常量性”
---- 当const 和 non-const成员函数有着实质等价的实现时,令non-const版本调用const版本可避免代码重复
4、确定对象用前已经先被初始化
----为内置类型对象进行手工初始化,因为C++不保证初始化它们
----构造函数最好用成员初始化列表,而不要在构造函数本体内使用赋值操作。初值列出的成员变量,其排序次序应该和它们在class的声明次序相同
---- 为免除“夸编译单元之初始化次序”问题,请以local static对象替换non-local static对象
推荐阅读
-
还不知道自己为什么胖吗? 6个习惯让你胖到没商量
-
《Effective C++》读书笔记 资源管理
-
让你的C++代码变的更加健壮
-
Effective C++ Item 14-在资源管理中小心的copying行为
-
《Effective C++》读书笔记 被你忽略的关于构造析构赋值
-
Effective C++ 笔记:条款 31 将编译关系降至最低
-
C++四大准则|无二义、高效性、合乎日常习惯、相似相同原则
-
More Effective C++在leveldb中的体现
-
c++中使用类定义自己的数据类型
-
Effective Modern C++ 条款32 对于lambda,使用初始化捕获来把对象移动到闭包