在C++ Primer 5th,13.2.1類似Act的Like類中,作者創建一個類似於值的類,這意味着每個對象都有自己的類管理的資源副本。一個非常簡單的類,只包含一個指向字符串的指針,而一個int成員函數只是默認的構造函數和複製控制成員。更容易的複製賦值運算符實現?
class HasPtr{
public:
HasPtr(const std::string &s = std::string()) :ps(new std::string(s)), i(0){}
HasPtr(const HasPtr &p) :ps(new std::string(*p.ps)), i(p.i){}
HasPtr &operator=(const HasPtr &rhs);
~HasPtr(){ delete ps; }
private:
std::string *ps;
int i;
};
下面是書
HasPtr &HasPtr::operator=(const HasPtr &rhs){
auto newp = new std::string(*rhs.ps);
delete ps;
ps = newp;
i = *rhs.i;
return *this;
}
這是很好的考慮到實施操作的=,但我認爲,我們可以使用下面的實現可避免刪除指針和分配新的內存。
HasPtr &HasPtr::operator=(const HasPtr &rhs){
*ps = *rhs.ps;
i = rhs.i;
return *this;
}
我測試我的代碼作品,甚至自我賦值。但是,這個代碼有什麼問題嗎?
在這種情況下工作,因爲'* ps'是可賦值的。情況並非總是如此。 – 2014-10-28 14:08:42
@MikeSeymour我明白了。這是因爲std :: string定義了operator =,所以它起作用。如果成員沒有定義=,那麼我必須使用本書給出的工具。我想到這一點,因爲下一章將比較圖書館交換的性能和該類定義的交換。 – TungWah 2014-10-28 14:16:21
這是什麼意思?爲什麼不把字符串變成非指針成員呢? – 2014-10-28 16:07:24