一部の書籍では、クラス内のデータメンバーの破棄順序が、その構築順序の逆の順序でなければならないことがわかります。このルールの理由は何ですか?すべての例が評価されます。なぜデータメンバーの破壊の順序は重要ですか?
答えて
これは、大部分において一貫性のためです。複数のオブジェクトが順番に作成されると、それらは常に逆の順序で破棄されます。たとえば、自動変数で、次の例を考えてみます。ここでは
{
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. オブジェクトの配列の破壊の順序
- 2. メンバーの順序、派生の順序は重要ですか?
- 3. キャッチブロックの順序は重要ですか?
- 4. CSSでメディアクエリの順序が重要なのはなぜですか?
- 5. 静的イニシャライザで宣言の順序が重要なのはなぜですか?
- 6. MySQLでLEFT JOINの順序が重要なのはなぜですか?
- 7. ウィジェットの作成順序が重要なのはなぜですか?
- 8. data.tableのキーの順序は重要ですか?
- 9. SQLの列の順序は重要ですか?
- 10. クエリの列の順序は重要ですか?
- 11. ページ内のjavascriptの順序は重要ですか?
- 12. カーネルビルドのメイクファイルのターゲット順序は重要ですか?
- 13. LibSVM機能ベクトルの機能の順序は重要ですか?
- 14. テーブル内の列の順序は重要ですか?
- 15. URLの順序はXMLサイトマップで重要ですか?
- 16. 複合キーの順序は重要ですか?
- 17. Sedコマンド - オプションフラグの順序は重要ですか? (-ir vs -ri)
- 18. VB.Netコンストラクタの順序は重要ですか?
- 19. MySQL 5:GROUP BYフィールドの順序は重要ですか?
- 20. 仮想テーブルの順序は重要ですか?
- 21. PHP SOAPでSOAPパラメータの順序が重要なのはなぜですか? PHPマニュアルの状態に
- 22. ベクトル要素の破壊順序を定義することは合理的でしょうか?
- 23. 結合順序はSQLで重要ですか?
- 24. window.onloadに関数を割り当てるときにスクリプトの順序が重要なのはなぜですか?
- 25. MongoDB BSON docでキーの順序が重要ですか?
- 26. ViewEngineの登録順序が重要でない理由
- 27. タッチイベントがAndroidフレームレートを破壊するのはなぜですか?
- 28. なぜListAppendは破壊的ではなく、ArrayAppendとStructInsertは両方とも破壊的ですか?
- 29. 明示的なLINQ-to-SQL(C#)では順序が重要ですか?
- 30. CMultiDocTemplateのView/Doc/Frameの破棄順序は何ですか?
これは推奨されている方法ではありませんが、実際の記述は簡単です:http://www.parashift.com/c++-faq-lite/dtors.html#faq-11.2 – mkb