前段时间,阅读了《Effective C++》,深深地被作者深入浅出的介绍关于C++应该注意的地方所折服,在日常工作中,非常具有警示和指导意义。先将其中的几条条例摘抄下来,然后阐述下自己的理解,或者结合项目,聊聊自己的看法。
1 视C++为一个语言联邦
c++的编程高效编程守视状况而变化,取决于你用C++的哪一部分。
2 尽量以const、enum、inline、替换#define
对于单纯的变量,最好以const对象或enum替换#define
对于形似函数的宏(macros),最好改用inline函数替换#define
3 尽可能的使用const
3 尽可能的使用const
将某些东西声明为const可帮助编译器侦测出错误用法。const 可被施加于任何作用域内的对象、函数参数
函数的返回类型、成员函数本体。
编译器强制实施二进制位常量性,但你的程序应该概念上的常量性。
函数的返回类型、成员函数本体。
编译器强制实施二进制位常量性,但你的程序应该概念上的常量性。
当const和non-const成员函数有着实质等价的实现时,令non-const版本调用const版本可以避免代码重复。
4 对内置型对象进行手动初始化,因为C++不保证初始化它们。
4 对内置型对象进行手动初始化,因为C++不保证初始化它们。
构造函数最好使用成员初值列,而不要在构造函数本体内使用赋值操作。初值列列出的成员变量,其排列次序应该和
它们在class中的声明次序下你相同。
为免除“跨编译单元之初始化次序”问题,以local-static 对象代替non-local static对象(*****************)
5 编译器可以暗自为class创建默认构造函数、复制函数、复制执行函数、以及析构函数。
它们在class中的声明次序下你相同。
为免除“跨编译单元之初始化次序”问题,以local-static 对象代替non-local static对象(*****************)
5 编译器可以暗自为class创建默认构造函数、复制函数、复制执行函数、以及析构函数。
6 驳回编译器自动为你提供的功能,可以将对应的成员函数声明为private并且不予实现。也可以使用一个基类(在基类中不实现)
7 带有多态性质的基类应该声明一个virtual析构函数。如果class中带有任何的虚函数,应该拥有一个Virtual析构函数(*****************)
如果类在设计中,不是作为一个基类,或者不是为了具备多态性,就不应该声明Virtual析构函数。(*****************)
8 析构函数应该是一个没有异常的函数,如果在析构函数中调用的其他函数可能出现异常,就应该在析构函数中捕捉异常,然后结束程序。
如果类在设计中,不是作为一个基类,或者不是为了具备多态性,就不应该声明Virtual析构函数。(*****************)
8 析构函数应该是一个没有异常的函数,如果在析构函数中调用的其他函数可能出现异常,就应该在析构函数中捕捉异常,然后结束程序。
如果客户在操作中需要对于运行期间出现的异常做出反应,那么class应该提供一个普通函数(不是析构函数)来执行该操作。
9 构造函数和析构函数中不要调用virtual函数,因为调用的虚函数在执行时不是派生类的虚函数,依然是子类的虚函数。
9 构造函数和析构函数中不要调用virtual函数,因为调用的虚函数在执行时不是派生类的虚函数,依然是子类的虚函数。
10 让重载赋值操作符函数返回 *this。