C++クラス構築関数初期化リストおよび初期化メンバー変数の誤り

1297 ワード

コンストラクション関数の初期化リストは、コロンで始まり、カンマで区切られたデータ・メンバーのリストに続き、各データ・メンバーの後ろに括弧で囲まれた初期化式が続きます.例:
class CExample {
public:
    int a;
    float b;
    //         
    CExample(): a(0),b(8.8)
    {}
    //        
    CExample()
    {
        a=0;
        b=8.8;
    }
};
の上の例の2つの構造関数の結果は同じである.上のコンストラクション関数(初期化リストを使用するコンストラクション関数)は、明示的な初期化クラスのメンバーです.初期化リストを使用しないコンストラクション関数は、クラスのメンバーに値を割り当て、明示的な初期化は行われません.
初期化と付与は、上記のいずれかのコンストラクション関数のように、組み込みタイプのメンバーに大きな違いはありません.非組み込み型メンバー変数の場合、2回の構造を回避するために、クラス構造関数を使用してリストを初期化することを推奨します.
ただし、初期化リスト付きのコンストラクション関数を使用する必要がある場合があります:1.メンバー・タイプは、デフォルトのコンストラクション関数がないクラスです.初期化式が表示されていない場合、コンパイラはメンバータイプのデフォルトコンストラクタを暗黙的に使用し、クラスにデフォルトコンストラクタがない場合、コンパイラがデフォルトコンストラクタを使用しようとすると失敗します.2.constメンバーまたは参照タイプのメンバー.constオブジェクトまたは参照タイプは初期化のみ可能なため、値を割り当てることはできません.
初期化リストのメンバー初期化順序:C++クラスメンバーを初期化する場合は、初期化リストに表示される順序ではなく、宣言された順序で初期化されます.Example:
class CMyClass {
    CMyClass(int x, int y);
    int m_x;
    int m_y;
};

CMyClass::CMyClass(int x, int y) : m_y(1), m_x(m_y)
{
}
上のコードが最初にm_を作ると思っているかもしれません.y=1、そしてm_x=m_y、最後に同じ値があります.
ただしコンパイラはm_を初期化するx、そしてm_yは、このような順序で宣言されているためです.結果はm_xには予測不可能な値があります.
2つの方法でそれを回避する方法があります.1つは、常に初期化されることを望む順序でメンバーを宣言することです.2つ目は、初期化リストを使用することを決定した場合、常にメンバーを宣言する順序で羅列することです.これは混同を解消するのに役立ちます.