一部の書籍では、クラス内のデータメンバーの破棄順序が、その構築順序の逆の順序でなければならないことがわかります。このルールの理由は何ですか?すべての例が評価されます。なぜデータメンバーの破壊の順序は重要ですか?
答えて
これは、大部分において一貫性のためです。複数のオブジェクトが順番に作成されると、それらは常に逆の順序で破棄されます。たとえば、自動変数で、次の例を考えてみます。ここでは
{
A a;
B b(a);
} // b.~B() is called, then
// a.~A() is called
は、b
はa
を使用しています。オブジェクトが構築の逆の順序で破棄されることを保証することによって、C++はオブジェクトの生涯管理をより多くより容易にします。
クラスでは、別のデータメンバーを初期化するときに、あるデータメンバーへの参照を渡すことができます。オブジェクトが逆の順序で破壊され、あなたは自動変数と同じ動作を得ることを確認:
struct S
{
A a;
B b;
S() : a(), b(a) { }
};
注それは、相互に参照するデータメンバを持っていることは通常は良い考えではないが、それが可能とたまに便利な両方だと。
おそらく、オブジェクトBの後ろにオブジェクトBが現れるとき、BはAへの参照を保持することができます。逆は真ではないので、逆順(B、A)の破壊は意味をなさないが、最初にAを破壊するとBそれを参照することができます。 – EmeryBerger
@EmeryBergerそうですが、直接メンバーの参照は構築時に初期化する必要があるためです。しかし、参照は唯一の '参照'の形ではありません。メンバーは互いにポインタを保持することが自由であり、いつでも設定することができ、順序が乱れて無効になることは自由です。さらに、メンバーが 'std :: vector'のような動的コンテナのメンバである場合、メンバは互いに '真の'参照を順序どおりに保持することができません。だから、本当に「できない」か「できない」ということはありません。ちょうど_should_と_できないはずです。参照の形式に関係なく、生涯について適切に考えることは不可欠です –
私は多分あなたが誤解したと思います。そのメンバーではないはこの順序で破壊されるべきであるが、それらはと指定されているです。
まれに、アイテムが破棄される順序を知ることが重要です。
いずれにせよ、それはオブジェクトが破壊される順序です。あなたはそれについて何もできませんが、起こっていることを知っています。
C++のライフタイムは可能な限り入れ子になっています。通常、まれにデータメンバーが互いに依存したり(例えば、あるもののポインタを渡すなど)、間接的に(たとえ両方がグローバルに依存し、stderrに出力を書き込むように)可能ですが、指定された順序を持つといいですし、他の順序よりも他の言語がどのように機能するか(例えば、関数スコープでの存続時間)は入れ子のほうが適しています。
もちろん、標準の "as-if"ルールの後で、コンパイラ/実装がユーザコードを決定できれば、破壊リオーダリングを見ることができないので、好きなように行うことができます。
- 1. ANTLR4トークンの順序が重要なのはなぜですか?
- 2. オブジェクトの配列の破壊の順序
- 3. メンバーの順序、派生の順序は重要ですか?
- 4. キャッチブロックの順序は重要ですか?
- 5. MySQLでLEFT JOINの順序が重要なのはなぜですか?
- 6. 静的イニシャライザで宣言の順序が重要なのはなぜですか?
- 7. CSSでメディアクエリの順序が重要なのはなぜですか?
- 8. NgModuleのインポートの順序が重要なのはなぜですか?
- 9. ウィジェットの作成順序が重要なのはなぜですか?
- 10. コマンドラインの順序が重要な場合
- 11. MySQLクエリでテーブルパラメータの順序が重要なのですか?
- 12. std :: stack要素の破棄順序
- 13. Javaでは、InputStreamの順序は重要ですか?
- 14. MATCH()節の列の順序は重要ですか?ここで
- 15. Having句の条件の順序はSQLで重要ですか?
- 16. Symfony2の:EntityTypeフィールドをpreferred_choicesの順序を破壊query_builder
- 17. 認証ミドルウェアの重要な順序ですか?
- 18. カーネルビルドのメイクファイルのターゲット順序は重要ですか?
- 19. iceServers配列のエントリーの順序は重要ですか?
- 20. EPR断片のプレノックス定量の順序は重要ですか?
- 21. テーブル内の列の順序は重要ですか?
- 22. クエリの列の順序は重要ですか?
- 23. SQLの列の順序は重要ですか?
- 24. CREATE TABLE文のKEYの順序は重要ですか?
- 25. ページ内のjavascriptの順序は重要ですか?
- 26. data.tableのキーの順序は重要ですか?
- 27. predの制約の順序は重要ですか?
- 28. LibSVM機能ベクトルの機能の順序は重要ですか?
- 29. LINQではwhere句の結合順序が重要ですか?
- 30. URLの順序はXMLサイトマップで重要ですか?
これは推奨されている方法ではありませんが、実際の記述は簡単です:http://www.parashift.com/c++-faq-lite/dtors.html#faq-11.2 – mkb