第4条:決定したオブジェクトが使用される前に初期化されています

三つのことに注意してください。

1.手動で初期化する内蔵の非メンバーオブジェクト

オブジェクトを扱うためにメンバーのリストのすべてのメンバーを初期化する2.

3.その設計に注意を払うへの質問「初期化シーケンスではありませんがありません」。

 

ここでは、第三のケースに焦点を当てます:

以下TFSは、外部ファイルb.cppで使用されますが、b.cppのTFSで使用される文言は、これが問題の原因となります、初期化されていることを保証することはできません。

1つの // AH 
2  クラスファイルシステム
 3。 {
 4  公共5      int型 numDisk()のconst ;
 6  };
 7  
。8  のexternファイルシステムFS;     // のみ宣言
 9  
10  // a.cpp 
。11ファイルシステムFS;     // これが定義されている
12である 
13のIS  
14  /// B.cpp 
15  クラスディレクトリ
 16  {
 17。 公共18である      ディレクトリ(文字列 のparams。19      {
 20は         、INT(=ディスクのfs.numDisks);     // コンパイル時にためa.cppのb.cpp及びシーケンスを保証するものではない、まだそれを用いたTFS、そこに初期化されないことが
21      }
 22 } ;

 

TFSはでコールするとき、我々はfsが初期化されなければならない戻りオブジェクトへの参照は、そのようなb.cppを確保できるという関数を宣言します。しかし、著者はそれの静的変数の使用を参照してくださいなぜここで私は、質問がありますか?できませんローカル変数です?または参照を使用していませんか?

1つの // AH 
2  クラスファイルシステム     // ライブラリクラスで定義された
。3  {
 4  公共5      int型 numDisks()のconst ;
 6  };
 7  
。8  // a.cpp 
。9ファイルシステム・TFS()// ライトショーのTFS()グローバル関数ではなく、メンバ関数である。
10  {
 11      静的、ファイルシステムFS     // C ++は、ローカル静的関数が初期化される「第1のオブジェクトタイプの定義を満たし、」「関数が呼び出された」中されるオブジェクトことを確実にする場合。
12は     戻り、FS
 13である }
 14の 
15  // B.cpp 
16  クラスディレクトリ
 17  {
 18  公共19      ディレクトリ(文字列 のparams 20      {
 21          int型の   ディスク= TFS()numDisks();。    
22      }
 23 }。

 

おすすめ

転載: www.cnblogs.com/Stephen-Qin/p/12081549.html