以下是C++ Primer 第 5 版的练习:
练习 13.22:假设我们希望 HasPtr 表现得像一个值。也就是说,每个对象都应该有自己的对象指向的字符串副本。我们将在下一节展示复制控制成员的定义。但是,您已经知道实现这些成员所需的一切。在继续阅读之前编写 HasPtr 复制构造函数和复制赋值运算符。(第 511 页)
类代码HasPtr
:
class HasPtr
{
public:
//! default constructor
HasPtr(const std::string &s = std::string()):
ps(new std::string(s)), i(0) { }
//! copy constructor
HasPtr(const HasPtr& hp) : ps(new std::string(*hp.ps)), i(hp.i) { }
HasPtr&
operator = (const HasPtr& hp);
~HasPtr()
{
delete ps;
}
private:
std::string *ps;
int i;
};
我的这个复制赋值运算符的代码:
HasPtr&
HasPtr::operator = (const HasPtr &hp)
{
delete ps;
ps = new std::string(*hp.ps);
i = hp.i;
return *this;
}
本书以下部分中提供的代码:
HasPtr&
HasPtr::operator = (const HasPtr &rhs)
{
auto newp = new string(*rhs.ps); // copy the underlying string
delete ps; // free the old memory
ps = newp; // copy data from rhs into this object
i = rhs.i;
return *this; // return this object
}
通过一步一步的执行,我发现两个代码之间有细微的差别。在我的代码中,它不会更改ps
指向的地址,而书中的代码ps
指向一个新地址。我想知道这种细微的差异是否有任何重要意义?在类似情况下,我是否应该始终将指针更改为新地址?为什么?