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 ;
}