C++ Primer には、copy-control メンバーを使用してクラスを「値のように」動作させる例があります。つまり、オブジェクトをコピーする場合、コピーは独立しています。次のコードを提案します。
class HasPtrValue
{
public:
HasPtrValue(const std::string &s = std::string()) : ps(new std::string(s)), i(0) { }
HasPtrValue(const HasPtrValue &orig) : ps(new std::string(*orig.ps)), i(orig.i) { }
HasPtrValue& operator=(const HasPtrValue&);
~HasPtrValue() { delete ps; };
std::string *ps;
int i;
};
HasPtrValue& HasPtrValue::operator=(const HasPtrValue &rhs)
{
auto newp = new std::string(*rhs.ps);
delete ps;
ps = newp;
i = rhs.i;
return *this;
}
私の質問は、コピー代入演算子に関するものです。私が理解しているように、ヒープに新しい文字列を作成し、古い文字列を削除し、lhs が新しい文字列を指すようにします。それは本当に必要ですか?以下のコードは、ヒープ上の既存の文字列に割り当てるだけでは、まったく同じことをしませんか?
HasPtrValue& HasPtrValue::operator=(const HasPtrValue &rhs)
{
*ps = *rhs.ps;
i = rhs.i;
return *this;
}