目录
一、自己习惯C++
1、尽量使用const代替define
const:编译器处理,有语法检查,类型检查,有作用域(如今优秀的编译器在底层实现const:把const存入一个符号表中,也不会分配内存,当对其取地址时,会另外分配内存)
define:预处理器处理,只是简单替换,无类型检查,不提作用域(无封装性可谈),不会有内存分配,实现宏函数(不会导致函数调用带来的额外开销,只是简单替换匹配,可用inline代替(遵守作用域和访问规则))
注意:class专属常量。为了将常量作用域限制在class内,必须让它成为class的一个成员;而为确保此常量至多只有一份实体,必须让它成为一个static成员。
例如:static const int num=5; //常量声明式
若是一个class的专属常量又是static,则可以声明并无需提供定义式。
class TestConst { public: protected: private: const int a = 10; //只是一个常值而已,不能保证只有一个实体 static const int b = 20; //若是const+static则可以只需要声明,且保证只有一个实体 //static int c = 30; //必须在类外定义 static int c; }; //static int TestConst::c = 30; //static是一个修饰关键字,不包括在类型中 //在类外定义 int TestConst::c = 30; //定义时:类型 类名::变量名=值
2、enum hack
enum更像#define,当不想让别人获得一个pointer或reference指向你的某个整数常量时,enum可以实现这个约束。不会导致非必要的内存分配。
总结:对于单纯常量,最好以const对象或enums代替#define。
对于形似函数的宏,最好改用inline函数替换#define。
3、尽量使用const
- 可帮助编译器侦测出错误用法,const可被施加于任何作用域内的对象、函数参数、函数返回类型、成员函数本体。
- 编译器强制实施bitwise constness(非我所欲),但编写程序时应该使用“概念上的常量性”。
- 当const和non-const成员函数有着实质等价的实现时,令non-const版本调用const版本可避免代码重复。
4、确定对象被使用前已先被初始化
对象的成员变量的初始化动作发生在进入构造函数本体之前。在构造函数中,只能叫做赋值。用成员初值列表代替赋值动作,但效率更高。
赋值版本:
ClassCopy::ClassCopy(int a,int b) { m_a=a; m_b=b; }
初始化过程:首先调用default构造函数为m_a,m_b设初值,然后立刻再对他们赋予新值。所以default构造函数的一切作为因此浪费。
成员初值列表版本:
ClassCopy::ClassCopy(int a,int b):m_a(a),m_b(b) { }
初始化过程:初值列表针对各个成员变量而设的实参,被拿去作为各成员变量之构造函数的实参,即m_a以a为初值进行copy构造,m_b以b为初值进行copy构造。
总结:比起先调用default构造函数然后再调用copy assianment操作符,单只调用一次copy构造函数是比较高效的。若想要default构造一个成员变量,在使用成员初值列表时,只要指定无物作为初始化实参即可。