《Effective C++》读书笔记 1 让自己熟悉C++
条款 01:视 C++为一个语言联邦¶
守则随状况而变化。 次语言: - C - Object-Oriented C++ - TemplateC++ - STL
条款 02:尽量以 Const,enum,inline 替换#define(编译器替代预处理器)¶
define 的坏处:¶
- 编译错误可能只会追溯到 1.653,AESPECT_RATIO 不会记录到符号表中。
- 缺乏访问级
- 要打很多括号->inline 设计
const:
#define AESPECT_RATIO 1.653
const double AspectRadio = 1.653; const char* const authorName = "Scott Meyers" const std::string authorName("Scott Meyers");
类的 cosnt 声明: - 确保次常量至多只有一份,必须成为static - 类中只是声明式子,有些编译器可能需要写一个定义式
//头文件
class GamePlayer{
private:
static const int NumTurns = 5;//只是一个声明式子,而非定义式。
int scores[NumTurns];
}
//实现文件
const int GamePlay::NumTurns;//定义式,不可以再设置初值
//头文件
class GamePlayer{
private:
static const int NumTurns;//只是一个声明式子,而非定义式。
int scores[NumTurns];
}
//实现文件
const int GamePlay::NumTurns=1.35;//定义式
class GamePlayer{
private:
enum{ NumTurns = 5};
int scores[NumTurns];
}
条款 03:尽可能使用 const¶
- 星号左边,被指数为常量
- 星号右边,指针本身是常量
- 最具威力的用法:函数声明
- const/non-const 成员函数声明()
- 防止暴力赋值...暴行...给乘积赋值
c++ (a * b) = c;
条款 04:尽可能让对象被使用前初始化¶
- 某些条件下不会赋值 0,而是随机数,这会导致错误
- 注意初始化和赋值的区别:
- 初始化发生的更早,发生于 default 构造函数被自动调用之前
- 通常使用初值列copy 会高效一些、
- 内置型对象如 int,成本相同,但尽量保持一致性。
- 且一些内置型如 const,References 必须使用初值,不能被赋值
- 初值列按照严格的成员声明次序进行,注意不是初值列次序
non-local static 对象的初始化¶
- 指 global、namespace、class、file 中的 static
- non_local static 使用其他的 non_local static 初始化,可能未定义
- extern 声明的变量,如何确定初始化? *
- 方法:将 non-local static 的对象搬到自己的专属函数内,即转化为 local static,返回一个 reference 指向它所含的对象,这便是这单例模式
- 线程安全:在多线程系统中带有不确定性。
- 解决方法:单线程启动阶段调用所有与 reference-returning 函数,