第一章见 Effective C++ 学习笔记 第一章:让自己习惯 C++
第二章见 Effective C++ 学习笔记 第二章:构造、析构、赋值运算
第三章见 Effective C++ 学习笔记 第三章:资源管理
第四章见 Effective C++ 学习笔记 第四章:设计与声明
第五章见 Effective C++ 学习笔记 第五章:实现
第六章见 Effective C++ 学习笔记 第六章:继承与面向对象设计
第七章见 Effective C++ 学习笔记 第七章:模板与泛型编程
第八章见 Effective C++ 学习笔记 第八章:定制 new 和 delete
第九章见 Effective C++ 学习笔记 第九章:杂项讨论
本来看这本书已经好几天了,没准备做笔记,但看了几个条款,发现这本书总结的太好了,不记一下,回头忘了不好,如果对其他人有帮助就更好了。每个条款的内容是我自己理解的内容,最后的总结是摘抄自书中原文。
条款 01:让自己习惯 C++
Accustoming Yourself to C++.
C++是语言联邦,它综合了多种编程语言的特点,是多重范型编程语言(注意是范型,不是泛型),支持过程形式(procedural),面向对象形式(object-oriented),函数形式(functionnal),泛型形式(generic),元编程形式(meta programming)。
将 C++认为是多种次语言的结合,次语言有四种:
- C 语言基础。C++最早出现时,从 C 中派生出来的那些特性。
- Object-Oriented C++。也就是 C with classes,类,继承,多态,虚函数这些概念。
- Template C++。C++的泛型编程,类和对象泛型化。
- STL:最重要的模板库,提供容器、迭代器、算法和函数对象等。
在次语言之间切换工程,需要认真遵守当前次语言的规范。
总结
C++高效编程守则视状况而变化,取决于你使用 C++的哪一部分。
条款 02:尽量以const, enum, inline 替换 #define
** Prefer consts, enums, and inlines to #defines.**
话题 1:用 const 和 enum 代替 #define 常量
#define 定义之下的标记不会经由编译器处理,记住这个道理,在编译器之前被预处理器处理了,所以 #define 引入的问题,编译器很难查出来。使用 const 代替 #define 来定义常量,编译器可以帮助检查如类型错误这一类问题。
const 作用于指针,分为作用到指针指向对象的不变性和指针本身的不变性。
以下代码定义了一个类内的类静态常量成员(类专属常量成员):
class Game {
private:
static const int NumTurns = 5; // 注意这是声明,因为是常量,必须这里赋值,有关于为什么声明时可赋值,接下来会介绍
int scores[NumTurns]; // 可直接使用该常量
}
如果是类静态整形常量成员,C++ 要求如果你要取 NumTurns
的地址,或者编译器要查看,那必须为其提供一个定义式,放到实现文件中:
const int Game::NumTurns; // 这是定义,因为声明时已指定常量值,这里不能再指定一次
现代编译器允许对类静态整形常量成员在声明时指定常量值。
对于非整数的其他类静态常量成员,无法在声明中指定常量值,这时可通过定义指定常量(前者在声明时指定常量,是为了能在后续的其他声明时用,比如 scores
数组长度)。
书中还给出了补偿做法。如果编译器不允许在声明时指定常量值,可采用 enum 方式:
class Game {
private:
enum {
NumTurns = 5 }; // 这个叫 enum hack
int scores[NumTurns];
enum 无法取地址,所