1

=deleteデストラクタを宣言できること、またはprivateプログラムがスコープの最後でオブジェクトを暗黙的に削除するのを防ぐことができることを知っています。また、プライベートの場合、呼び出すたびにデストラクタを明示的に呼び出すことができるメンバー関数を使用できることも知っています。void kill() { this–>~A(); }

私の質問は次のとおりです。

  • 暗黙の破壊を防ぎたいと思うのはなぜですか? 例を挙げてください

  • どうする=delete?デストラクタが実行されないようにしますか? では、オブジェクトはそのスコープ外に永遠に存在するのでしょうか?

4

1 に答える 1

1

プライベート デストラクタのようなイディオムは、通常、他のプログラマがあなたの型で特定の操作を実行できないようにするために使用されます。特にプライベート デストラクタは、次のことを防ぎます。

  • スタック上のインスタンスのタイプの宣言
  • delete キーワードによるタイプのインスタンスの手動削除
  • 手動デストラクタ呼び出し

これらのいずれかを実行すると、回避するのが簡単ではないコンパイル エラーが発生します。エラーは通常、これらの操作の 1 つまたはすべてを実行してはならないという作成者からユーザーへのメッセージです。

  • ファクトリ関数を呼び出して、この型のインスタンスを破棄します (通常は、プライベート コンストラクターと結合されます)。構築と破棄に関する追加のコンテキストを提供することで、最適化の機会を提供したり、バッチ操作が「1 回限りの」割り当てよりもはるかに効率的な場合に API の誤用を防ぐことができます。
  • このタイプのインスタンスを割り当てません (おそらくシングルトンです)

ハードウェア インターフェイスを管理する型を作成することを検討してください。ユーザーが単にインスタンスを削除できるようにすると、ハードウェアが望ましくない状態になる可能性があります。はい、ある時点で API を構築してこの問題を抽象化することができますが、基本的なレベルで「壊れやすい」機能を公開する必要があります。

=delete は、ユーザー エラーを防止する「新しい」防弾方法です。プライベート コピー コンストラクターとは異なり、'friend' キーワードを介して回避することはできません。また、この機能が利用できないことを一貫した方法でコードのユーザーに伝えるという点で、読みやすくなる傾向があります。私の理解では、「コピーなし/削除なしのイディオム」の代わりに =delete が c++11 で導入されました。

于 2013-09-17T02:37:47.077 に答える