最近在看Effective C++ ,同时将总结一下里边的重要知识点:
########################## module 1 ##########################
让自己习惯C++
1.条款01:视C++为一个语言联邦
为了了解C++,必须了解C++的4个主要次语言:
(1)C ;
C++ 说到底仍是以C为基础(区块,语句,预处理器,内置数据类型,数组,指针等),同时还有C语言的局限:没有模板,没有异常,没有重载……
(2)Object-Oriented C++; <面向对象的C++>
在这比分实现了C++的类(包括构造和析构),封装,继承,多态,虚函数等;
(3)Template C++;
C++泛型编程,它的功能强大,给我们带来了新的编程范式;
(4)STL;
STL是template的程序库。它对容器,迭代器,算法和函数对象进行协调和封装;
2.条款02:尽量以const, enum, inline 替代 #define
这个条款我们可以这样理解:宁可使用编译器替代预处理器。我们无法利用#define创建一个class专属常量,因为define并不重视作用域;这就意味着#define不仅不能用来定义class专属常量,也不能提供任何封装性;
3.条款03:尽可能使用const
(1)const成员函数
将const实施于成员函数的目的是为了确认该成员函数可以作用于const对象身上。这一类函数很重要:其一,它们使class接口比较容易被理解。第二,它们使“操作const对象”成为可能,使提高效率。
在const阵营中有两种说法:一是成员函数只有在不更改对象之任何成员变量(static除外)才可以说是const,也就是说它不更改对象内的任何一个bit。但这种说法却不准确,可以有方法在不改变每一个bit的情况下定义为非const函数。
(2)const和非const的成员函数中避免重复
这时可以领non-const版本调用const版本可以避免代码重复。
4.条款04:确定对象被使用前已经先被初始化
(1)因为读取未初始化的值会导致不明确的行为(为0),有时候不会。因此我们最佳的解决办法就是:永远在使用对象之前先将它初始化。对于无任何成员的内置类型,我们必须手工完成此事;
(2)C++规定,对象的成员变量的初始化动作发生在进入构造函数本体之前。这就是说初始化的发生时间更早,发生于这些成员的默认构造函数自动调用之时,这就是说较佳的写法是用初始化列表,这样效率高;
而初始化的顺序和列表中的顺序无关,和声明的次序有关;
(3)请立下这样一个规则:总是在初始化列表中列出所有的成员变量,以免遗漏一些成员变量没有初始化,如果内置类型被遗漏了,它就没有被赋初值,会引发意外的情况;
(4)在C++程序中有这样一种对象:static。记住一点:程序结束时static对象会被自动销毁,也即是它们的析构函数会在main()之后被自动调用;
(5)C++对于“定义在不同编译单元的non-local static对象”的初始化相对次序无明确的定义,这时需要手动介入。