コンストラクターで整数 (_pPtrMem などのクラス メンバーが指す) に動的にメモリを割り当て、デストラクタで同じものを解放するクラス A があります。浅いコピーを避けるために、代入演算子とコピー コンストラクターをオーバーロードしました。代入演算子がオーバーロードされる広く使用されている方法は次のとおりです。
A& operator = (const A & iToAssign)
{
if (this == & iToAssign) // Check for self assignment
return *this;
int * pTemp = new int(*(iToAssign._pPtrMem)); // Allocate new memory with same value
if (pTemp)
{
delete _pPtrMem; // Delete the old memory
_pPtrMem = pTemp; // Assign the newly allocated memory
}
return *this; // Return the reference to object for chaining(a = b = c)
}
同じことを実装する別の方法は次のとおりです。
A& operator = (const A & iToAssign)
{
*_pPtrMem= *(iToAssign._pPtrMem); // Just copy the values
return *this;
}
2 番目のバージョンは比較的単純で高速 (解放、メモリの割り当てなし) であるため、広く使用されていないのはなぜですか? 私が理解できない問題はありますか?
また、連鎖 (a = b = c) の代入演算子から同じ型のオブジェクトを返します... したがって、*thisを返す代わりに、 iToAssignオブジェクトを返すことは問題ありません。