在C++入門中,有一個使用複製控制成員來使一個類的行爲「有價值」的例子;即複製對象時,副本是獨立的。它提出了以下代碼:實施價值複製賦值運算符
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;
}
整個類都是無用的,因爲它可以直接存儲'std :: string'並讓它自動管理。 – milleniumbug 2015-02-24 20:00:43
你的觀察是正確的,儘管結尾的措辭有點奇怪。除了整個班級的無用之外,我認識到這是一個學術活動。你提出的改變將調用'std :: string'的複製賦值操作符,並直接賦值'int'成員'i'。前者的確在內部生活在一堆。對於*他們*賦值運算符的代碼的選擇實際上不是大多數人會這樣做的方式,因爲它是任何東西 - 但是對異常友好的,事實上,這些中沒有一個通常是這樣做的。 – WhozCraig 2015-02-24 20:03:27
當然,我不會在實際的程序中使用它。這僅僅是爲了概念證明。 @milleniumbug – JamesLens 2015-02-24 20:04:18