Effective C++笔记之三确定对象在使用前已初始化
1.在同一个编译单元中对象的初始化.
class PhoneNumber{.....} ;
class Info
{
public:
Info(const std::string name , const std::string address , const std::list<PhoneNumber> phonenum) : m_Name(name) , m_Address(address) , m_PhoneNum(phonenum)
{}
private:
std::string m_Name ;
std::list<PhoneNumber>
std::string m_Address ;
} ;
(1). 注意若用赋值的方法逐个的赋值给相应的数据成员,这不是初始化,仅仅是赋值,并且这样的话,这个构造函数进行了两次赋值,传参的时候也要一次,所以这样的话导致效率低。
(2).要注意数据成员的初始化的顺序, 它是按照数据成员在类中的声明的顺序来初始化的,与你所写的初始化列表中的顺序无关!!
(3).如果有多个不同的构造函数的时候,并且,它们之间有很多的相同的数据成员时,可调用共同的私有的成员函数Init(),来进行初始化!!
2.若对象在不同的编译单元, 若在一个non-local static 对象要使用另外一个位于不同的编译单元的对象,这个时候就不能保证这个对象被使用前已被初始化,其实不同编译单元的对象之间的初始化顺序是不确定的。这样我们使用designe pattern 的Singleton模式的方法来解决,即:将每一个non-local static对象搬到自己的专属函数内(该对象被声明为static),此类函数返回一个reference指向它所含的对象,这时候当用户使用这些对象时,而不直接涉及这些对象,这时候调用的就是local static 对象了。
eg1:
class FileSystem //文件系统class
{
public:
..........
std::size_t numDisk() const ;
} ;
FileSystem tfs ;
假设客户建立一个管理系统文件的类
class Directory
{
Directory(params) ;
} ;
Direcoty::Directory(params)
{
std::size_t disks = tfs.numDisks() ; //此时使用的tfs对象可能还未初始化,所以有很大的漏洞
}
所以我们用上面的所说的方法来解决此问题:
class FileSystem{.....} ; //类同上
FileSystem& tfs()
{
static FileSystem fs ;
return fs ;
}
class Directory{....} //同上
Directory& DirecTemp()
{
static Directory dirtemp ;
return dirtemp ;
}
补充:软件开发 , C++ ,