1. ホーム
  2. c++

[解決済み] C++: コンストラクタの変数を初期化する場所【重複】について

2023-01-06 11:57:57

質問

重複の可能性があります。

C++初期化リスト

オプション1とオプション2で変数を初期化することの長所/短所は何ですか?

class MyClass
{
public:
    MyClass( float f, char a );
private:
    float mFloat;
    char mCharacter;
    bool mBoolean;
    int mInteger;
};

MyClass::MyClass( float f, char a ) : mFloat( f ), mBoolean( true ) // option 1.
{
    // option 2
    mCharacter = a;
    mInteger = 0;
}

編集する なぜオプション2が一般的なのでしょうか?

どのように解決するのですか?

要するに、可能であれば常に初期化リストを優先してください。2 つの理由があります。

  • クラスの初期化リストで変数に言及しない場合、書いたコンストラクタの本体に入る前にデフォルトで初期化されます。つまり、オプション 2 では、各変数がデフォルトの初期化とコンストラクタ本体での代入のために 2 回書き込まれることになります。

  • また、他の回答でmwigdahlさんやavadaさんが述べられているように、constメンバや参照メンバでは だけ 初期化リストで初期化されます。

また、変数は常にクラス宣言で宣言された順番に初期化され、初期化リストに記載された順番にはならないことに注意してください(適切な警告を有効にすると、リストが順番通りに書かれていない場合にコンパイラが警告を出します)。同様に、デストラクタは、クラスのデストラクタのコードが実行された後、クラス宣言の最後から最初という逆の順序でメンバデストラクタを呼び出します。