3

三つのルール、三つのルールとは何ですか?要約すると次のようになります。

デストラクタ、コピーコンストラクタ、またはコピー代入演算子のいずれかを自分で明示的に宣言する必要がある場合は、おそらく3つすべてを明示的に宣言する必要があります。

私の質問は次のとおりです。C++アプリケーションには、リソースを管理するクラスがあります(ポインターの削除を処理するデストラクタがあります)。アプリケーションが至る所で代入演算子を使用していることは知っていますが、コピーコンストラクターのアプリケーション、つまり型の使用法は絶対にないClass c(..); Class d(c);ので、このような状況でも、両方を実装する必要がありますか?代入演算子とコピーコンストラクタ?それとも、代入演算子だけで十分でしょうか?代入演算子がどういうわけかコピーコンストラクターを使用することは可能ですか?

あなたの考えに感謝します。

4

3 に答える 3

13

コピーコンストラクターが使用されないことがわかっている場合は、それをプライベートにして実装しないようにすることで、次のように表現できます。

class C
{
private:
    C(const C&); // not implemented
};

= delete(C ++ 11では、新しい構文を使用できます)。とは言うものの、それが必要になることは絶対にないと確信している場合にのみ、それを行う必要があります。それ以外の場合は、実装したほうがよい場合があります。そのままにしないことが重要です。その場合、コンパイラーは、間違ったことを実行するデフォルトのメンバーごとのコピーコンストラクターを提供します。これは、発生するのを待つ問題です。

ある程度は、クラスが何に使用されるかによって異なります。たとえば、ライブラリの一部であるクラスを作成している場合は、一貫性の理由からコピーコンストラクターを実装する方がはるかに理にかなっています。クラスがどのように使用されるのか、先験的にはわかりません。

于 2012-06-13T22:50:27.113 に答える
4

コピーコンストラクターのアプリケーション、つまりクラスc(..)型の使用法は絶対にありません。クラスd(c)

次のコードを知っていますか

Foo c;
Foo b = c;

代入演算子ではなく、コピーコンストラクターを呼び出しますか?安全のために、コピーコンストラクターを実装します。

于 2012-06-13T22:50:13.223 に答える
1

ほとんどすべての場合、コンパイラがこれらのメソッドを生成し、何もする必要はありません。ただし、暗黙的に生成されたコピーコンストラクター/代入演算子が希望どおりに機能せず、設計上、クラスをコピーできるようにするのが理にかなっている場合は、両方を使用するかどうかに関係なく、コピーコンストラクターと代入演算子を明示的に指定する必要があります。 (グッドプラクティスとして)。

設計上、クラスがコピー不可であることが理にかなっている場合は、コピーコンストラクター/割り当て操作を宣言することはできますが、定義することはできません。

于 2012-06-13T22:52:11.610 に答える