2012-01-17 12 views
3

コピーコンストラクタが提供されている場合は、代入演算子も用意する必要があるということは何度も私の頭の中に掘り下げました。しかし、クラスがコピーコンストラクタを使用できますが、代入演算子は使用できないことがあります。例えばC++のコピーコンストラクタと代入

class A { 
public: 
    const int myVar; 

    A(const int var) : myVar(var) {}; 
    A(const A& other) : myVar(other.myVar) {}; 
}; 

だから、これを行うために恐ろしいことですか?代入演算子は定義する必要がありますが、プライベートにする必要はありますか?そのようなクラスはまだコピー構成可能ですか?

+0

このクラスは、明示的なコピーコンストラクタを必要としません。 –

+0

@ R.MartinhoFernandes:これは、問題を表現するために提供される単純なコードサンプルであると仮定しています。 –

答えて

3

これは恐ろしいことですか?
いいえ、そうではありません。
すべてのクラスが、コンストラクタブルとアサイナブルの両方でコピーする必要はありません。コピー可能でありながら割り当て不可能なクラスを持つことは完全に有効です。

このようなクラスはまだコピーコンストラクタブルですか?
はいです。
あなたのクラスがpublicコピーコンストラクタを提供している限り、あなたのクラスはコピーコンストラクタブルです。

代入演算子を定義する必要がありますが、プライベートにする必要はありますか?
あなたの用途によって異なります。
クラスを割り当て可能にする必要がある場合は、理想的にはconstメンバーが必要です。

許可されていないconstメンバーに割り当てようとするため、クラスにconstメンバがある場合、デフォルトのコンパイラ生成コピー代入演算子は機能しません。したがって、コードにコピー代入演算子が必要な場合は、独自のオーバーロードされたバージョンを提供する必要があります。しかし、とにかく、このオーバーロードされたバージョンは、期待される代入セマンティクスを提供できません。

クラスオブジェクトを割り当てる必要がない場合は、定義しないでください。あなたのコードが間違ってそれを使用すると、コンパイラはとにかくエラーを生成します。

+0

割り当て可能である必要はありませんが、コピーコンストラクタブルである必要があります。しかし、コピーコンストラクタを持っているかどうかを常に伝えることに慣れています。代入演算子も必要ですが、ここでは意味がありません。 – tpg2114

+0

@ tpg2114:ここで参照する 'C++ 11'の' C++ 03'の** Rule of Three **や** Five of **の**ですが、ほとんどの場合、それは標準によって強制される条件ではありません(標準であればそれが助けになります)。クラスはコピー可能であるがアサイナブルではありませんので、その場合にガイドラインを破っても問題ありません。 –

+2

3/5のルールは、必要な項目の一部を非公開に宣言し、それらを実装しないままにすることを許可します。しかし、彼らは宣言されるべきです。コンパイラに予期せぬものを生成させたくないので宣言します。実際には –

関連する問題