Effective C++

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

  1.  C。以C为基础,但是C语言有局限(没有模板,没有异常,没有重载);
  2. Object-Oriented C++。C with Classes,类、封装、继承、多态、虚函数......等等;
  3. Template C++。C++的泛型编程部分;
  4. STL。 容器、迭代器、算法 以及 函数对象。
        pass-by-reference-to-const

条款02:尽量以const,enum,inline替换#define

    宁可以编译器替换预处理器。

    #define不被视为语言的一部分,记号名称也许从未被编译器看见,于是记号名称有可能没进入记号表内。这对于查找追踪错误信息很困难。

解决方法是以常量代替#define,有两个特殊情况:

  1. 定义常量指针。常量定义式通常放在头文件,有必要将指针声明为const:const char*const authorName="c++";  最好用标准库中的string对象:const std::string authorName("C++");
  2. class专属常量。为了将常量作用域限制在class内,必须让常量成为class的一个成员;而为确保常量至多只有一份实体,必须让它成为static成员。


对于单纯常量,最好以const对象或enums替换#defin

对于形似函数的宏,最好改用inline函数替换#define

条款03:尽可能使用const

声明迭代器为const,表示这个迭代器不能指向不同的东西,但它所指的东西的值可以改动。

如果希望迭代器所指的东西不可被改动,需要const_iterator。


当const和non-const成员函数有着实质等价的实现时,令non-const版本调用const版本可避免代码重复。

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

对于无任何成员的内置类型,必须手工完成此事;至于内置类型以外的任何其他东西,初始化在构造函数内:确保每一个构造函数都将对象的每一个成员初始化。

C++规定,对象的成员变量的初始化动作发生在进入构造函数本体之前。总是使用成员初值列的做法,而不是在函数体内使用赋值操作。这样效率较高。

不同编译单元内定义之non-local static对象  的初始化次序:以local static 对象替代 non-local static 对象。

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