1 为普通内置类型进行初始化,否则c++不会保证初始化他们
2 尽量使用成员初始化列表进行初始化工作
2.1 如果在构造函数本体内赋值 非内置类型有构造与拷贝构造开销,而初始化列表中只调用一次其自身的构造并也可以在其构造中调用缺省构造完成
2.2 常成员与引用型成员要在初始化列表中完成
2.3 类的成员变量总是以其声明次序而依次被初始化,虽然初始化列表允许以不同的次序出现,但还是应该避免晦涩产生,最好以其声明次序为次序
3 不同编译单元的non-local static object(对函数而言是local) 的初始化
C++在“定义于不同的编译单元内的non-local static 对象”的初始化相对次序并无明确定义
在A中成员函数需要调用另一个编译单元中B类中的成员函数,如果B类在A类的编译单元中尚未初始化,就会出问题,
class FileSystem{//你的程序库
public:
...
std::size_t numDisks()const;
...
};
extern FileSystem fts;//准备给客户使用
//------------
class Directory{//由程序库客户建立
public:
Directory(params);
..
};
Directory::Directory(params){
...
std::size_t disks = tfs.numDisks();//使用tfs对象
}
Directory tempDir(params);//为临时文件而做出的目录
问题:tfs必须在tempDir之前创建
解决:可以利用单例模式的实现手法 把non-local static对象放在专属函数内,返回此实例对象的引用
class FileSystem{...};
FileSystem&fts(){//如频繁调用可设置为inline
static FileSystem fs;
return fs;
}
class Directory{...};
Directory::Directory(params){
...
std::size_t disks=tfs().numDisks();
...
}
Directory&tempDir(){//如频繁调用可设置为inline
static Directory td;
return td;
}
在单线程程序中,如果有一个系统,其中对象A必须在对象B之前先初始化,可使用上述方法
2 尽量使用成员初始化列表进行初始化工作
2.1 如果在构造函数本体内赋值 非内置类型有构造与拷贝构造开销,而初始化列表中只调用一次其自身的构造并也可以在其构造中调用缺省构造完成
2.2 常成员与引用型成员要在初始化列表中完成
2.3 类的成员变量总是以其声明次序而依次被初始化,虽然初始化列表允许以不同的次序出现,但还是应该避免晦涩产生,最好以其声明次序为次序
3 不同编译单元的non-local static object(对函数而言是local) 的初始化
C++在“定义于不同的编译单元内的non-local static 对象”的初始化相对次序并无明确定义
在A中成员函数需要调用另一个编译单元中B类中的成员函数,如果B类在A类的编译单元中尚未初始化,就会出问题,
class FileSystem{//你的程序库
public:
...
std::size_t numDisks()const;
...
};
extern FileSystem fts;//准备给客户使用
//------------
class Directory{//由程序库客户建立
public:
Directory(params);
..
};
Directory::Directory(params){
...
std::size_t disks = tfs.numDisks();//使用tfs对象
}
Directory tempDir(params);//为临时文件而做出的目录
问题:tfs必须在tempDir之前创建
解决:可以利用单例模式的实现手法 把non-local static对象放在专属函数内,返回此实例对象的引用
class FileSystem{...};
FileSystem&fts(){//如频繁调用可设置为inline
static FileSystem fs;
return fs;
}
class Directory{...};
Directory::Directory(params){
...
std::size_t disks=tfs().numDisks();
...
}
Directory&tempDir(){//如频繁调用可设置为inline
static Directory td;
return td;
}
在单线程程序中,如果有一个系统,其中对象A必须在对象B之前先初始化,可使用上述方法