2012-09-27 19 views
5

同様に、デフォルトのコピーコンストラクタはすべてのメンバでコピーコンストラクタを呼び出しますか?例えば、クラスがそのような非PODのメンバーを持っている場合:デフォルトの代入演算子は、すべてのメンバーに対して演算子を呼び出しますか?

class A 
{ 
    std::string str; 
}; 

...意志デフォルトのコンパイラが生成するコピーコンストラクタと代入演算子の作業が正しく?彼らは文字列のコピーコンストラクタとoperator=を呼び出しますか、メンバー変数strのビット単位のコピーを作成しますか?

つまり、std::stringメンバーを持つことは、このクラスにはユーザ実装コピーコンストラクタと代入演算子が必要であることを意味しますか?

答えて

5

はい、コンパイラで生成されたものは正しく動作します。

ただし、独自のものを実装して空のままにしておくと、それはできません。

メモリを管理しておらず、すべてのメンバーが正しいコピー/割り当て/破棄を提供している場合は、独自のコピーコンストラクタ/デストラクタ/代入演算子を実装する必要はありません。

つまり、std :: stringメンバーを持つことは、このクラスがユーザー実装のコピーコンストラクタと代入演算子を必要としていることを意味しますか?

いいえ、コンパイラによって生成されたものは完全に動作します。

+0

"はい、コンパイラ生成のものは正しく動作します。" - constメンバーを持つクラスでさえ? –

+0

@spin_eightそれでもコピーや割り当てはコンパイルされません。 –

+3

@LuchianGrigore:実際には、コピーがコンパイルされます。割り当ては明らかにされません。 @MatthieuM。 –

関連する問題