[解決済み] メンバコンストラクタとデストラクタの呼び出しの順番
質問
C++の達人たちよ、私は汝の知恵を求める。C++が次のプログラムを保証しているかどうか、標準語で教えてください。
#include <iostream>
using namespace std;
struct A
{
A() { cout << "A::A" << endl; }
~A() { cout << "A::~" << endl; }
};
struct B
{
B() { cout << "B::B" << endl; }
~B() { cout << "B::~" << endl; }
};
struct C
{
C() { cout << "C::C" << endl; }
~C() { cout << "C::~" << endl; }
};
struct Aggregate
{
A a;
B b;
C c;
};
int main()
{
Aggregate a;
return 0;
}
は常に
A::A
B::B
C::C
C::~
B::~
A::~
つまり、メンバーは宣言順に初期化され、逆順に破棄されることが保証されているのでしょうか?
どのように解決するのですか?
つまり、メンバーは宣言順に初期化され、逆順に破棄されることが保証されているのでしょうか?
両方ともイエスです。12.6.2参照
6 初期化は次の順序で行う。 次の順序で行う。
最初に、そして のコンストラクタのみです。 クラスのコンストラクタに限り、仮想基底 クラスは の深さ優先順位で表示されます。 の左から右への深さ優先走査に現れる順序で初期化されなければならない。 の有向非循環グラフを深さ優先で左から右に走査したときに現れる順序で初期化されなければならない。 ここで、"left-to-right" は基底クラスの出現順序である。 ベースクラスが出現する順序 の名前の出現順である。 base-specifier-listにあるベースクラス名の出現順です。
では、直接 基底クラスは に現れるように宣言順に初期化されなければならない。 の宣言順に初期化される。 に現れるように宣言順に初期化されなければならない(mem-initializersの順序に関係なく)。
次に、非静的データメンバは クラス定義で宣言された順序で初期化されなければならない。 で宣言された順に初期化されなければならない。 (の順序に関係なく)。 mem-initializersの順序に関係なく)。
最後に コンストラクタの複合ステートメント のボディが実行されます。[注意: 宣言の順序は 宣言の順序は ベースオブジェクトとメンバサブオブジェクトが が初期化されたときと逆の順序で破壊されるようにするためです。 初期化とは逆の順序で破壊されるようにするためです。-注意の終わり ]。
関連
-
[解決済み】C++コンパイルタイムエラー:数値定数の前に期待される識別子
-
[解決済み】C++ 式はポインタからオブジェクトへの型を持っている必要があります。
-
[解決済み】「corrupted size vs. prev_size」glibc エラーを理解する。
-
[解決済み】指定範囲内の乱数で配列を埋める(C++)
-
[解決済み] 配列のベクトルを扱う正しい方法
-
[解決済み】Eclipse IDEでC++エラー「nullptrはこのスコープで宣言されていません」が発生する件
-
[解決済み] C++で、あるコンストラクタを別のコンストラクタから呼び出す(コンストラクタ・チェイニングを行う)ことは可能ですか?
-
[解決済み] 1ビットのセット、クリア、トグルはどのように行うのですか?
-
[解決済み] static_cast, dynamic_cast, const_cast, reinterpret_cast はいつ使うべきですか?
-
[解決済み] コピーアンドスワップ慣用句とは?
最新
-
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++コンパイルタイムエラー:数値定数の前に期待される識別子
-
[解決済み】C++の変数はイニシャライザーを持っているが、不完全な型?
-
[解決済み] 非常に基本的なC++プログラムの問題 - バイナリ式への無効なオペランド
-
[解決済み】浮動小数点例外エラーが発生する: 8
-
[解決済み】エラー:strcpyがこのスコープで宣言されていない
-
[解決済み】ファイルから整数を読み込んで配列に格納する C++ 【クローズド
-
[解決済み】Visual Studioのデバッガーエラー。プログラムを開始できません 指定されたファイルが見つかりません
-
[解決済み】演算子のオーバーロード C++; <<操作のパラメータが多すぎる
-
[解決済み】デバッグアサーションに失敗しました
-
[解決済み】エラー。引数リストに一致するコンストラクタのインスタンスがない