背景: 私は多くの変数を持つ複雑なクラスを持っています。オペレータ=のプレースメントnew(this)を使用できますか?
インテリアライザリストで呼び出されたメンバー変数コピーコンストラクタの中には、割り当てを実行するものがあります。
質問: operator=
を作成する必要があります。むしろ代わりに初期化リストの割り当てで既存のconstuctorを複製し、交換されるのメモリを解放し、などなどなどよりも、私は単純に次の操作を実行できます。つまり
Applepie& Applepie::operator=(const Applepie ©)
{
if(this != ©)
{
this->~Applepie(); // release own object
new(this) Applepie(copy); // placement new copy constructor
}
return *this;
}
、配置に続いて自己を破壊していますオペレータと意味的に同じ新しいコピーコンストラクタ=
これは劇的に繰り返しコードを削減し、各変数は代入時の効率の潜在的なわずかな損失のコストで、正しく初期化されていることを確認する可能性を持っているようです。私は何かをもっと不明瞭にしていますか?
理由: 私の実際のクラスには約30の偽りがあります。私は、コピーコンストラクタと代入オペレータの両方が30個すべてをコピーしなければならず、コードが分岐して2つの操作が異なる方法で動作することが懸念されます。 「例外C++」の状態でハーブサッターよう
コピーctorのがスローした場合は、オブジェクトが壊れているので、あなたはどのexpection安全保証を与えていません。 –
@R Martinho - 私は手動で各変数を割り当てていたとしても、コピー元がスローすると、私の演算子=スローされてしまうようです。 – jcwenger
問題は 'operator =' throwingではなく、 'operator ='はオブジェクトを無効な状態にしています!それは破壊されている。 –