2013/06/07

Copy Constructorって

コピーコンストラクタなんて一度も書いたことないけど、それで困ったことも一度もないよ。
要らないんじゃない?

コピーコンストラクタについて書かれたページの説明で多いのは、関数にオブジェクトを値渡しすると、オブジェクトのメンバーにポインタがあった場合deleteが2回呼ばれて落ちるっていう例。
int _tmain(int argc, _TCHAR* argv[])
{
   CSample obj;
   function( obj );
   return 0;
}
 
void function(CSample obj) ←実行時というよりこの時点でイクナイ
{
   //...

そこでコピーコンストラクタを定義して解決って流れだけど、その前にJavaから入ったオブジェクト脳のプログラマは『関数にオブジェクトを値渡し』って時点でアウトと思うはず。そこは参照渡し(かポインタ渡し)でないと。


もう一つ、代入演算子を自分で定義することについて。
「=」を自分で定義するなんて馬鹿らしいと思って考えもしなかった。が、スタック領域に生成したオブジェクトを代入演算子で上書きするとやはりdeleteがダブって落ちるらしい。これはJava脳的にはうまいことやってくれんじゃないかと思って書いてしまいそうな気がした。
   CSample obj;
   CSample obj2;
   obj = obj2; //←これはやっちゃいそう
最近の流儀ではコピーコンストラクタと代入演算子をPrivateに空っぽで宣言してしまうとコピーも代入も出来なくなるから安全とか、そのように定義したNoncopyableというクラスを作って継承すると良いとかあるらしいが、つまり言語仕様の欠陥ってことだよね。

Javaに無くてC++にあるものは疑ってかかれ
(Effective C++には代入演算子もコピーコンストラクタもきっちり定義しろって書いてるけど無くても何とかなるってwたぶんw)

0 件のコメント:

コメントを投稿