effective c++ 第一章:让自己习惯c++

来源:互联网 发布:2010表格找出重复数据 编辑:程序博客网 时间:2024/04/30 16:35

条款1: 视c++为语言联邦

高效的c++在不同场景下,有不同的编写范式或风格。没有必要为其规定统一格式,根据需要使用c++不同的特点去扮演不同的角色吧。

条款2:尽量以const、enum和inline替代define

使用define“定义”的常量对编译器不可见,不会进入符号表,不便以后排错,且会加大目标代码量。使用define定义的函数宏也十分不便。

如何使用const定义和初始化不同类型的常量,也需要留意。还记得常量指针的定义吗?

1.  const int* p:p值的数据是常量;int * const p:p本身是常量,以及const int * const p。

2. 类内的const static成员在头文件中定义,在源文件中初始化。

关于the enum hack的理解现在还不是很深:可以使用一个enum成员当做一个int的常量,使得程序可以顺利编译(如使用它作为数组长度)

inline函数针对函数宏而言的,而它的主要目的是为了规避函数调用的代价。inline函数的缺点呢? 过度使用inline函数会增加目标代码量,还有呢?

条款3:尽可能使用const

感觉const为用户(调用者)做语义保证,当然离不开编译器的支持。

到底有哪些地方可以使用const呢,一般的,比如全局和局部变量,类变量,函数参数,类方法;还有函数返回值,虽然这个自己不常用,但在STL却大量出现。

编译器保证const对象的bitwise constness,但是有时候我们需要改变对象的一些bit(呵呵,即内部状态)而不影响外部表现,做到logic constness,这是就需要mutable关键字出场了,const成员函数可以改变有mutable修饰的成员变量。

另外,const属性可以作为函数签名的一部分,参与重载。如f(const int)与f(int)是合法的重载函数。对一个const对象,访问者只能调用它的const成员函数。如果你允许用户定义一个const的对象,记得要为其定义const函数。

4:确认对象使用前已进行初始化

这是常识。这里补充一下c++如何初始化成员对象。

构造函数的初始化列表是其成员变量初始化的地方,而构造函数体则是在初始化后进一步处理的场所。如果不注意这些,在构造函数体内“初始化”成员对象,不仅造成效率问题,也使得const成员无法完成合适的初始化。

成员对象的初始化顺序是先父类再子类,先早定义的后晚定义的(而不是按照初始化列表里的顺序)。

如果某个成员没有出现在初始化列表内,则按照其默认构造函数进行初始化。



0 0