在 C++ Primer 中有一个使用复制控制成员使类行为“类值”的示例;也就是说,在复制对象时,副本是独立的。它提出了以下代码:
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;
}