C++プログラミング仕様指47.メンバー変数を同じ順序で定義および初期化


要約:
コンパイラと一致:メンバー変数の初期化の順序は、コンストラクション関数の初期化リストに記述された順序を考慮することなく、クラス定義で宣言された順序と常に一致します.コンストラクション関数コードが異なる順序を混同せずに指定されることを確認します.
次のコードを考慮します.
class Employee
{
         string emall_,firstName_, lastName_;
public:
         Employee(const char*firstName, const char* lastName)
                   :firstName_(firstName),lastName_(lastName)
                   ,emall_(firstName_ + "." + lastName_ + "@gmail.com"){}
};

このコードにはエラーが隠されており、危害が大きく、発見しにくい.クラス定義のemail_first_とlast_以前に宣言されたように、最初に初期化され、他の初期化されていないフィールドを使用しようとします.さらに悪いことに、コンストラクション関数の定義が別のフォルダにある場合、メンバー変数が宣言する順序がコンストラクション関数の正確性に与える遠距離の影響はさらに決定しにくい.
C++言語がこのような設計を行ったのは、メンバーを破棄する順序が唯一であることを確保するためである.そうでない場合、構造関数は、構造オブジェクトの構造関数に応じて異なる順序で対象を破棄します.このためにもたらす最下位のオペレーションオーバーヘッドは許容できないはずです.
解決策は、常にメンバー宣言の順序で食事の月初期化文を作成することです.これにより、いかなる不法依存も明らかになる.もちろん、1つのメンバーの初期化を他のメンバーに依存させないほうがいいです.
多くのコンパイラは、このルールに違反した場合に警告します.