程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> Effective C++筆記之三確定對象在使用前已初始化

Effective C++筆記之三確定對象在使用前已初始化

編輯: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 ;

}

 



摘自 Cql_liliang‘s Blog

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved