前面两章的内容主要是习惯使用c++,大部分都是《C++ primer》中的需要注意的一些东西,由于刚刚看完前面一本,所以有些还是有些印象的。这里大体总结一下。

L1:C++是一个语言联邦。

包含着最初的以c语言为基础的C,面向对象的C++,C++的泛型编程,以及STL。在我们使用的过程中,可能会穿插,但是我们需要根据不同的情况使用不同的策略。

L2:代替#define

#define是在编译之前,也就是预处理的阶段就会被替换,这样我们在调试程序的时候看到的就是被替换的数字,会给别人甚至是之后调试的我们自己带来理解上的困难。另外,预处理器的工作是,直接把define的内容进行替换,当我们在define中写的表达式,并且在接下来使用的时候,可能产生无法理解的结果。所以当我们使用不想改变的常量时,使用const代替#define
我们还可以使用enum来代替#define。这样显得会更接近一些,因为enum#define一样,同时也不会被pointer或reference指向。
使用inline函数。

L3:尽量使用const

这是一个很好理解的问题,就像你把东西给别人用,不想让别人动的地方就加一个const不让别人动一样。。。
具体的体现为:指针,不想被改变的变量,迭代器,成员函数等等。
我们可能还会为一个函数定义const非const版本。

L4:在使用对象前先初始化

嗯,记住。

L5:了解c++会默认编写并调用哪些函数

在面向对象编程时,记住三五法则。构造函数、拷贝构造函数、拷贝赋值运算符、移动赋值运算符、析构函数。记住这几个函数的作用,其在什么时候会被使用,如果没有的时候,系统会不会为我们生成。我们需不需要系统为我们生成。

L6:不想编译器默认生成的函数,应该明确拒绝

比如我们不希望编译器为我们生成默认的函数,我们应该将其定义为删除的或者定义为private的,也可以定义类似于uncopyable类似的base class。

L7:为多态的基类声明virtual析构函数

通常我们希望派生类覆盖或重写的函数,定义为virtual函数。析构函数作为对象被销毁时调用的函数,如果不是虚函数,那么可能在销毁的时候只会销毁基类的部分,局部销毁,造成资源泄露。

L8:不要让异常逃离析构函数

析构函数绝对不要吐出异常,当遇到异常的时候应该捕捉任何异常,然后吞下或结束程序。
如果需要对某个操作函数运行期间抛出的异常做出反应,应该提供一个普通的函数执行操作,而不是在析构函数中。

L9:绝不在构造和析构过程中调用virtual函数

构造和析构过程中,调用virtual函数的对象可能还没有产生,也就是派生类的对象,此时会产生未定义的行为。

L10:另operator=返回一个reference to *this

并不强制,只是为了防止一些调皮的调用者使用:x=y=z=15这样的操作。

L11:在operator=中处理自赋值的情况

确定任何函数如果操作一个以上的对象,而其中多个对象是同一个对象时,行为仍然正确。

L12:复制对象时不忘每一个成分

Copying函数应该确保复制对象内的所有成员变量和所有base class成分。
不要使用一个copying函数实现另一个copying函数,而是创建一个新的函数避免代码重复。