[解決済み] 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メンバや参照メンバでは だけ 初期化リストで初期化されます。
また、変数は常にクラス宣言で宣言された順番に初期化され、初期化リストに記載された順番にはならないことに注意してください(適切な警告を有効にすると、リストが順番通りに書かれていない場合にコンパイラが警告を出します)。同様に、デストラクタは、クラスのデストラクタのコードが実行された後、クラス宣言の最後から最初という逆の順序でメンバデストラクタを呼び出します。
関連
-
[解決済み] C++で、あるコンストラクタを別のコンストラクタから呼び出す(コンストラクタ・チェイニングを行う)ことは可能ですか?
-
[解決済み] Java で、あるコンストラクタを別のコンストラクタから呼び出すにはどうすればよいですか?
-
[解決済み] C#でベースコンストラクタを呼び出す
-
[解決済み] HashMapを直接(リテラルに)初期化する方法は?
-
[解決済み] コンストラクタ内の仮想メンバー呼び出し
-
[解決済み] あるコンストラクタを別のコンストラクタから呼び出す
-
[解決済み] 配列のすべてのメンバーを同じ値で初期化するには?
-
[解決済み] HashSetの値を構造的に初期化する方法は?
-
[解決済み] ベースクラスのコンストラクタを呼び出す際のルールは?
-
[解決済み】C++ 構造体の初期化
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++でint型に無限大を設定する
-
[解決済み】 != と =! の違いと例(C++の場合)
-
[解決済み】変数 '' を抽象型 '' と宣言できない。
-
[解決済み] error: 'if' の前に unqualified-id を期待した。
-
[解決済み】文字列関数で'char const*'のインスタンスを投げた後に呼び出されるterminate [閉店].
-
[解決済み】関数名の前に期待されるイニシャライザー
-
[解決済み】テンプレートの引数1が無効です(Code::Blocks Win Vista) - テンプレートは使いません。
-
[解決済み】クラステンプレートの使用にはテンプレート引数リストが必要です
-
[解決済み】浮動小数点数の乱数生成
-
[解決済み] 警告:暗黙の定数変換でのオーバーフロー