《Effective C++》知识点(1)--让自己习惯C++

多年前看过的这本书(侯捷翻译的),忘得差不多了,重温复习一下。
1. 视C++为一个语言联邦

        C++并不只是一个带有一组守则的一体语言;它是从四个次语言组成的联邦(federation)政府,每个次语言都有自己的规约。

次语言 说明
C C是C++的基础,C++对问题的解法其实是较高级的C解法
Object-Oriented C++ C with classes,面向对象设计的实施
Template C++ C++范型编程,模板元编程TMP
STL template程序库
2. 尽量以 const, enum, inline替换 #define

       #define的变量是由预处理器处理的,编译器不知道它的存在。

   2.1 对于单纯常量,最好以const对象或enum替换#define。enum比较像#define,取enum地址是不合法的,建议优先使用。

   2.2 对于形似函数的宏,最好改用inline函数替换#define。inline函数遵守作用域和访问规则。

3. 尽可能使用const

       将某些东西声明为const可帮助编译器侦测出错误用法。const可被施加于任何作用域内的对象、函数参数、函数返回类型、成员函数本体。

   3.1 如果关键字const出现在星号左边,表示被指物是常量;如果出现在星号右边,表示指针本身是常量。

   3.2 令函数返回一个常量值(常量对象),可以降低因客户错误而造成的意外,而又保持安全性和高效性。

   3.3 编译器强制实施物理常量性(bitwise constness),但编写程序时应该使用"概念上的常量性"即逻辑常量性。const成员函数承诺绝不改变其对象的逻辑状态。如果成员变量在const成员函数内总是可被更改的,可以用mutable修饰。

   3.4 当const和non-const成员函数有着实质等价的实现时,另non-const版本调用const版本可以避免代码重复。先用static_cast将*this转为const对象调用const成员函数,再用const_cast移除调用返回的const修饰。

4. 确定对象在使用前已被初始化

       永远在使用对象之前先将它初始化。确保每一个构造函数都将对象的每一个成员初始化。

   4.1 为内置型对象进行手工初始化,因为C++不保证初始化它们。这点和Java很不一样。

   4.2 构造函数最好使用成员初始化列表,而不要在构造函数体内使用赋值操作。class的成员变量总是以其声明的次序被初始化的。初始化列表列出的成员变量,其顺序应该与它们在class中声明的次序相同,避免使人迷惑。

   4.3 为避免"跨编译单元之初始化次序"问题,请用local static对象替换non-local static对象。

       所谓编译单元是指产出单一目标文件的源码,基本上是一个cpp文件加上其所包含的头文件。C++对"定义于不同编译单元内的non-local static对象"的初始化顺序没有明确的定义。但是C++保证,函数内的local static对象会在"该对象被调用期间"首次遇上该对象定义式时被初始化。所以请优先使用局部静态对象函数,而不是全局静态对象,可以避免依赖的静态对象未被初始化的情况。

你可能感兴趣的:(C++,c++)