C ++コア原則C.41:コンストラクタ生成されたオブジェクトが完全に初期化されなければなりません

C.41:万一Aコンストラクタオブジェクトの作成Aは完全に初期化さ
C.41生成されたオブジェクトのコンストラクタが完全に初期化されなければなりません

 

 

 

理由(理由)

 

コンストラクタは、クラスの不変条件を確立します。このクラスのユーザは、構築されたオブジェクトが使用可能であると仮定することができなければなりません。

コンストラクタは、クラスの不変を確立する責任があります。ユーザークラスは、オブジェクト・タイプで構成されているものとすることができる利用可能です。

 

 

例えば、悪い(陰性試料)

 

class X1 {
    FILE* f;   // call init() before any other function
    // ...
public:
    X1() {}
    void init();   // initialize f
    void read();   // read from f
    // ...
};

void f()
{
    X1 file;
    file.read();   // crash or bad read!
    // ...
    file.init();   // too late
    // ...
}

コンパイラは、コメントを読んでいません。

コンパイラは、コメントを読んでいません。

 

 

例外(例外)

 

有効なオブジェクトは、便利なコンストラクタによって構築することができない場合は、ファクトリ関数を使用します。

あなたは簡単にファクトリ関数を使って、有効なオブジェクトのコンストラクタ関数を構築することができない場合。

 

 

施行(提案)

 

  • (シンプル)すべてのコンストラクタは(委任ctorの呼び出しを介して、またはデフォルトの建設を経て、明示的に)すべてのメンバ変数を初期化する必要があります。

    (シンプル)すべてのコンストラクタは、(明示的にコンストラクタやデフォルトコンストラクタによって委託)すべてのメンバ変数を初期化する必要があります

  • (不明)コンストラクタが確実に契約を結んでいる場合、それは事後条件として保持しているかどうかを確認してみてください。

    (不明)コンストラクタは確実にプロトコルが含まれている場合は、それがすべての前提条件が含まれていることを確認するためにしてみてください。

 

Note(注意)

 

コンストラクタは、リソースを取得した場合、リソースはデストラクタで解放されるべきであること、(有効なオブジェクトを作成します)。コンストラクタを持つことのイディオムは、リソースを獲得し、デストラクタは、それらがRAII(「リソース取得された初期化」)と呼ばれているリリース。

コンストラクタは(有効なオブジェクトを生成するために)リソースを要求した場合、そのリソースはデストラクタを解放する必要があります。コンストラクタとデストラクタのアプリケーションリソースは、彼らの練習知らRAII(「リソース要求が初期化される」)をリリースします。

 

 

説明リンク

 

https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#c40-define-a-constructor-if-a-class-has-an-invariant

 


 

私はこの記事は参考になりましだと思いますか?ようこそ親指アップし、より多くの人と共有することができます。

より多くの更新の記事を読む、オブジェクト指向の考え方のマイクロチャンネル公衆数にしてください注意を払います[]

公開された408元の記事 ウォンの賞賛653 ビュー290 000 +

おすすめ

転載: blog.csdn.net/craftsman1970/article/details/104415127