1 对于内置型对象来说,应该进行手工初始化,因为c++不保证初始化他们。
2 构造函数最好使用成员初始值(member initialization list),而不是要在构造函数本体内使用赋值操作。初始列列出的成员变量,
其排列次序应该是和它们在class中的生命次序相同。
class aaa
{
public:
int a;
float b;
std::string c;
aaa(int a1, float b1, const std::string& name);
...
};
aaa::aaa(int a1, float b1, const std::string& name ):a(a1), b(b1), c(name){} // 应该用用成员初始值初始化,效率高, 对于c来说只是调用了一次copy 构造函数
aaa::aaa(int a1, float b1,const std::string& name) // 不要用这种在构造函数内赋值的方法
{
a = a1;
b = b1;
c = name; // 对于c来说,先调用了一次default的构造函数(完全浪费了),然后再调用一次copy assignment来赋值。
}
3 为免除“跨编译单元之初始化次序”问题,请以local static 对象替换non-local static 对象
对于不是在函数内定义的non-local static对象来说,c++对于“不同编译单元内”的non-local static 对象的初始化并没有定义。
所以如果某个non-local static对象A的初始化动作使用了另一个编译单元内的某个non-local static对象,则它使用到的这个对象可能尚未被初始化。
解决的方法就是用local static来进行替换。因为c++保证:对于函数内的local static对象会在“该函数被调用期间” “首次遇上该对象之定义式”时被
初始化。
example 1: 使用non-local static对象
/// File1
class FileSystem
{
public:
...
std::size_t numDisks() const;
...
};
extern FileSystem tfs;
/// File2
class Directory
{
public:
Directory(params);
...
};
Directory::Directory(params)
{
...
std::size_t disks = tfs.numDisks(); // 使用tfs对象。假如tfs还没有被初始化,那么这里就会出错。
...
}
example 2: 使用local static 对象来代替
/// File1
class FileSystem {...}; // 同上
FileSystem& tfs()
{
static FileSystem tfs;
return tfs;
}
/// File2
class Directory{...}; // 同上
Directory::Directory(params)
{
...
std::size_t disks = tfs().numDisks(); // 使用tfs() ,这样就可以保证在使用tfs前其已经初始化
...
}