[解決済み】メンバー初期化リストの使用を推奨する理由は?
2022-04-01 09:46:42
質問
私はコンストラクタでメンバ初期化リストを使うのが好きなのですが、その理由をずっと忘れていました。
あなたは、コンストラクターにメンバー初期化リストを使用しますか?使っている場合、その理由は何ですか?使っていない場合は、その理由を教えてください。
解決方法は?
対象 POD クラス・メンバの場合は、スタイルの問題に過ぎず、違いはありません。 クラスであるクラス・メンバの場合は、デフォルトのコンストラクタが不必要に呼び出されないようにします。 考えてみてください。
class A
{
public:
A() { x = 0; }
A(int x_) { x = x_; }
int x;
};
class B
{
public:
B()
{
a.x = 3;
}
private:
A a;
};
この場合、コンストラクタで
B
のデフォルトコンストラクタを呼び出します。
A
を初期化し、さらに
a.x
を 3 にするのがよいでしょう。
B
のコンストラクタから直接
A
のコンストラクタをイニシャライザーリストに追加します。
B()
: a(3)
{
}
を呼び出すだけです。
A
's
A(int)
のコンストラクタで、デフォルトのコンストラクタではありません。 この例ではその違いはごくわずかですが、たとえば
A
のデフォルトコンストラクタは、メモリの割り当てやファイルのオープンなど、より多くのことを行います。 不必要にそんなことはしたくないですよね。
さらに、クラスにデフォルトコンストラクタがない場合や
const
メンバ変数が
しなければならない
には、イニシャライザー・リストを使用します。
class A
{
public:
A(int x_) { x = x_; }
int x;
};
class B
{
public:
B() : a(3), y(2) // 'a' and 'y' MUST be initialized in an initializer list;
{ // it is an error not to do so
}
private:
A a;
const int y;
};
関連
-
[解決済み] テスト
-
[解決済み] error: 'if' の前に unqualified-id を期待した。
-
[解決済み】c++で.txtファイルから2次元の配列に読み込む
-
[解決済み] どのような場合に '$this' よりも 'self' を使うべきですか?
-
[解決済み] なぜC++はPythonよりもstdinからの行の読み込みが遅いのですか?
-
[解決済み] なぜテンプレートはヘッダーファイルでしか実装できないのですか?
-
[解決済み] なぜ、オブジェクトそのものではなく、ポインタを使用しなければならないのですか?
-
[解決済み] なぜゲッターとセッター/アクセッサーを使うのですか?
-
[解決済み] mixinとは何か、なぜ有用なのか?
-
[解決済み】なぜC++プログラマは'new'の使用を最小限に抑えなければならないのでしょうか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Visual Studio 2015で「非標準の構文; '&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み】Visual Studio 2015で「非標準の構文。'&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み】識別子 "string "は未定義?
-
[解決済み】C++でランダムな2倍数を生成する
-
[解決済み】Cygwin Make bash コマンドが見つかりません。
-
[解決済み] 式はクラス型を持つ必要があります。
-
[解決済み】クラステンプレートの使用にはテンプレート引数リストが必要です
-
[解決済み] [Solved] インクルードファイルが開けません。'stdio.h' - Visual Studio Community 2017 - C++ Error
-
[解決済み】Enterキーを押して続行する
-
[解決済み] 警告:暗黙の定数変換でのオーバーフロー