一.关于命名空间
1. .cc中的不具名命名空间可避免命名冲突、限定作用域,避免直接使用using提示符污染命名空间。
2. 嵌套类符合局部使用原则。只是不能在其他文件中前置声明,尽量不要用public。
3. 尽量不要用全局变量和全局函数,考虑作用域和命名空间限制,尽量单独形成编译单元。
4. 多线程中的全局变量(含静态成员变量)不要使用class类型(含STL容器),避免不明确行为导致的bug。
5. 作用域的使用,除了考虑名称污染、可读性之外,主要是为降低耦合度,提高编译、执行效率。
二.关于类
1.单参数构造函数使用C++关键字explicit,避免调用时造成隐式转换;
eg: explicit Foo(string name);
2.可以考虑在类的private中添加只有声明没有定义的空拷贝构造函数、赋值操作。当其他代码企图使用它们的时候, 编译器会自动报错。
3.绝大多数情况是不需要拷贝的,如果确实需要拷贝,应在该头文件中说明原由,并适当定义拷贝构造函数和赋值操 作。注意在operator=中检测自赋值情况。
4.仅当只有数据时使用struct,其他一概用class。
5.使用组合通常比继承更适宜。如果继承的话,使用只公共继承。
6.在含虚函数的父类中,定义虚析构函数是绝对必要的。
7.静态函数存放于对象模型内存之外。与类继承无关。
8.类中定义次序为:public:、protected:、private:。每一块中声明次序为:
1). Typedef 和 enum
2). 常量
3). 构造函数
4). 析构函数
5). 成员函数,含静态成员函数
6). 数据成员,含静态数据成员
9. 子类重载的虚函数也要声明virtual关键字
三.关于指针
1.如果确实需要使用智能指针的话,scoped_ptr完全可以胜任。特殊情况下例如对STL容器中对象,应该只使用std::tr1::shared_ptr。任何情况下都不要使用auto_ptr。
四.关于其他C++特性
1.函数形参表中所有引用必须是const。
2.禁止使用缺省函数参数,避免使用可能不为程序员所知的缺省参数。
3.禁止使用变长数组和alloca(),它们在堆栈中根据数据分配大小可能导致难以发现的内存泄露。使用安全的分配器,如scoped_ptr/scoped_array。
4.使用static_<>()等C++类型转换。不要使用int y = (int)x;
5.只在记录日志时使用流(streams)。用printf()代替。
6.左大括号总在最后一个参数同一行末尾处。