5

クラスにcctor、dtor、またはop =を追加するときのC++の経験則は知っています。他の2つも追加して、すべての状況でクラスが適切に機能するようにする必要があります。

3 つすべてを提供する必要がなく、そのうちの 1 つまたは 2 つだけを提供する必要がある場合はありますか?

それらの 1 つをクラスに追加する場合、C++ ではそれらをすべて追加する必要がないのはなぜですか?

EDIT1:

それらのいくつかを必要としないだけでなく、それらを持ちたくないので、それらを非公開または保護したい場合の例について言及しました。ただし、本文が空の場合でも、コードにそれらを記述する必要があります。

空のボディを持つ仮想デストラクタを追加してクラスをポリモーフィックにするときに、それらすべてを持っていない唯一の正当な理由。しかし、デストラクタの本体に何かを書き込むとすぐに、cctor と op= の本体にも何かを書き込むことを検討する必要があります。

3 つのメソッドすべてを記述する必要がなく、初心者がクラスを使用している場合でも、クラスにバグを引き起こすことなくそれらのいくつかを省略できる例を探しています。:)

4

4 に答える 4

5

One case in which you may want to use a destructor without a copy constructor or assignment operator is when developing a polymorphic class, in which case you want a virtual destructor to allow deallocation through a base class pointer. These classes often will support copy constructors in order to facilitate the "virtual clone" idiom. However, they rarely have assignment operators, since polymorphic classes are usually heap-allocated and referenced only through pointers, in which case direct assignment almost always leads to slicing.

于 2011-03-31T09:50:45.690 に答える
3

監視対象のクラス (その存続期間を別のクラスに報告するクラス) には、すべてのコンストラクターとデストラクタが必要ですが、op= は必要ありません。C++ はそれらを必要としません。なぜなら、それは完全に不必要だからです。

さらに、コピー不可能なクラスがある場合は、デストラクタが必要になる場合がありますが、他の 2 つは必要ありません。

于 2011-03-31T09:49:41.170 に答える
1

You have to write them all if you have pointers or sth like that in your class so there will be no shallow copy in the copy cctor or op=, and no memory leak in dtor.

This is one case where you should write them all, other cases exist in other answers.

C++ doesn't require them all because it writes default ones, and because they may not be neseccary.

于 2011-03-31T09:53:05.420 に答える
1

通常、アクセス権を変更したい場合や、デストラクタの場合は仮想化します。プライベート コピー コンストラクターまたは代入演算子を宣言することは、デストラクタが必要ない場合でも、これらの操作を禁止する従来の方法です。クラスから派生させたいときはいつでも、デストラクタは仮想 (または保護) である必要があります。動的に割り当てられたインスタンス以外を禁止したい場合、古典的なイディオムは、デストラクタをプライベートに宣言しdelete this、オブジェクトを削除する destruct 関数を実装することです。

最後に、コンパイラで生成されたバージョンはインラインであるため、これらの関数のいずれかを宣言して、インラインにならないようにすることができます。(メモリが少ない時代には、これはしばしば考慮されました。)

于 2011-03-31T09:56:53.110 に答える