1. 构造函数的职责
如果对象需要进行有意义的(non-trival)初始化,考虑使用明确的init()的方法来进行初始化操作。因为如果在构造函数中进行有意义的初始化操作,一旦这些操作失败,对象将进入不确定的状态。symbian编程中广泛使用一种称为“两阶段构造法”的方法来解决这个问题,值得借鉴。
2. 默认构造函数
如果一个类定义了很多数据成员,那么就自己写一个构造函数,因为如果不自己写,编译器会产生一个垃圾的默认构造函数,这应该不是你想要的。
new 一个不带参数的类对象时, 会调用类的默认构造函数. 用
new[] 创建数组时,默认构造函数则总是被调用。保证对象的构造要有意义。
3. 对单个参数的构造函数使用explicit关键字。
如果C++的构造函数只有一个参数,那么就会有一个对应的“隐式转换”。即:将该构造函数中参数的数据类型对应的数据转换为该类的对象。这么说有点绕,举个例子就明白了:
class IntCls
{
public:
IntCls(int m);
};
IntCls ic = 10; // Convert 10 to IntCls
// convert:
// IntCls tmp = IntCls(10);
// ic = tmp
4.拷贝构造函数
仅在代码中需要拷贝一个类对象的时候使用拷贝构造函数。大部分类并不需要可拷贝, 也不需要一个拷贝构造函数或重载赋值运算符。
// 禁止使用拷贝构造函数和 operator= 赋值操作的宏
// 应该类的 private: 中使用
#define DISALLOW_COPY_AND_ASSIGN(TypeName) \
TypeName(const TypeName&); \
void operator=(const TypeName&)
在class Foo 中:
class Foo {
public:
Foo(int f);
~Foo();
private:
DISALLOW_COPY_AND_ASSIGN(Foo);
};
5. 结构体
仅当只有数据时使用
struct, 其它一概使用
class.