《effective c++》读书笔记(上)

最近在读《Effective C++》,确实是经典之作,但是有的条款也需要一些细节补充,所以都列在这篇文章里,希望能不断更新,个人阅读的是第三版,不包括C++ 11的内容。

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

主要可分为4个次语言(sublanguage),C的部分,OOP的部分,template部分以及标准库STL。都有各自不同的习惯,用哪块就用哪块的规范。

目前比较熟悉的是c的那部分和oop的那部分,tSTL, emplete的那部分正在学习,确实感觉到了风格和规范有所不同,所以之后可能需要分开进行对比。

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

这点也没什么好说的,#define只是做单纯的文本展开,其中如果有++x这样的指令会有严重的副作用,所以尽量用其他三者作为其原有功能的替 代,另外c99也认可了#inline,不过还是要明确const定义的常量和#define定义的常量的区别,前者编译时是一个symbol,后者就是 一个字面值。

条款3:尽可能使用const。

条款4:确定对象被使用前已被初始化。

注意构造函数的初始化列表和赋值的区别,不同编译单元之间的non-local static变量的定义顺序是未定义的,所以最好用local static对象来替代类似的访问呢。

条款5:了解C++默默编写并调用哪些函数。

合成的构造函数,copy构造函数,析构函数和copy assignment函数。

条款6:若不想使用编译器自动生成的函数,就该明确拒绝。

将相应的合成的成员函数声明为private并且不定义,另外继承一个把copy assignment函数和copy构造函数声明为私有的类可以让编译器在用户欲拷贝派生类时报错。因为基类的copying函数不允许继承类调用,而调 用基类的copying函数是合成的派生类copying函数的默认行为。

条款7:为多态基类声明virtual析构函数。

含有virtual成员函数的基类应该也将析构函数声明为virtual的。

条款8:别让异常逃离析构函数。

条款9:绝不在构造和析构过程中调用virtual函数。

因为在构造和析构函数中,base class构造期间virtual函数绝对不会下降到derived classes阶层。在derived class对象的base class构造期间,对象的类型是base class而不是derived class。一旦derived class析构函数开始执行,对象内的derived class成员便呈现未定义值,所以C++视它们仿佛不再存在,进入base class析构函数后对象就成为一个base class对象。

条款10:令operator=返回一个reference to *this。

因为这样方便了链式赋值的处理(a = b = c = d,优先级相同,结合性从右往左,所以 a = (b = (c = d)),标准库),而operator=是单目操作符重载,其左值隐式参数为*this,即自身,所以return *this收尾,哦这个标准是习惯,非强制,只是觉得还是保持同一个习惯比较好。

posted @ 2018-05-31 16:58  黄志鹏Zeb  阅读(180)  评论(0编辑  收藏  举报