2017-11-22 4 views
4

のは、私はこのようなコンポーネントと呼ばれる単純なC++コンポーネントを持っているとしましょう:私は通常のコードで見つかったC++演算子をクラスの最後に置く目的は何ですか?

class Component { 
public: 
    explicit Component(int i) 
    : _integer(i) { 
    } 

    ~Component() { 
    } 

    private: 
    int _integer; 

    Component(const Component&); 
    Component& operator=(const Component&); 
}; 

私は2つの最後の指示を読んで、私は実際にそれを理解していません。コンポーネントを正しく使用するためには必須ですか?

+3

通常、コピーctorのを無効にするためのC++ 98/03トリックです代入演算子。 C++ 11では、代わりに= deleteを使うことができます(公開セクションでも) – Alexander

+0

クラスの終わりのようなものはありません。重要なことは、メンバーが宣言されているアクセス指定子です。 – CinCout

答えて

0

コピーコンストラクタとコピー代入演算子の宣言をクラスのプライベートセクションに配置すると、そのクラスのオブジェクトはコピーできなくなります。

10

これは、operator=のオーバーロードを宣言します。演算子をオーバーロードすると、通常、代入式(a = b)の実行方法を制御できます。

しかし、ここで重要なのは、オペレータが最後であるが、プライベートアクセス指定子の下にあるということではありません。これは、外部コードがComponentオブジェクトの代入(またはそのためのコピー構築)を実行しない可能性があることを意味します。

クラス内のコード(メンバー関数内)は、コンストラクトを割り当ててコピーすることができます。しかし、私はそれがそうであるとは思わないでしょう。これら2つの特別なメンバ関数をprivateにマークし、それらを定義しないことは、クラスのコピーを無効にするC++ 03の方法でした。コンパイラーがデフォルトのコピーコンストラクターと代入演算子を合成しないように、それらを宣言しなければなりませんでした。現代のC++では

、1が明示的にこれらの機能を削除することにより、コンパイル時にエラーに「未定義シンボル」エラーを回すことは:

Component(const Component&) = delete; 
Component& operator=(const Component&) = delete; 
+0

ありがとうございます。クラスのコピーを常に無効にすることをお勧めしますか? – klaus

+2

@klaus - これはクラスに大きく依存します。だから私はここで絶対的なアドバイスをすることはできません。しかし、ロジックが重いクラスを書くと、デフォルトではコピーを無効にすることをお勧めします。必要に応じて後でいつでも追加することができます。 – StoryTeller

+0

ポリモーフィックの基底クラスは、しばしばアイデンティティ(アドレスを変更するだけでなく)やスライス(https://en.wikipedia)を持つことが多いので、コピーを防ぐ(暗黙的に移動する)のを避けるのが得策です。 org/wiki/Object_slicing)はそれらには有害です。あなたの基底クラスが少なくとも一つの純粋仮想(すなわち 'virtual ... = 0;')メソッドを持っているなら、コピー代入演算子を削除済みとして宣言すれば十分です: 'T&operator =(const T&)= delete;'。それ以外の場合は、コピーコンストラクタも削除済みとして宣言します。スライシングを防ぎたいのであれば、代わりにそれらをprotectedとして宣言し、それらを '= default'として定義することができます。 –

関連する問題