1
我重載了Arr類的賦值運算符。這是通過使用析構函數刪除舊對象(並釋放分配的內存),然後使用複製構造函數(先前被重載)來使調用對象成爲rhs的副本來實現的。 this圖片顯示了兩種不同的方式來做到這一點(只有第50行和第57行不同)。爲什麼第二個解決方案可行,但不是第一個?從賦值運算符調用構造函數
的錯誤消息是「類型名稱是不允許的」
Arr& Arr::operator=(const Arr& rhs) {
this->~Arr();
this->Arr(rhs); // I get an error here: type name is not allowed
return (*this);
}
Arr& Arr::operator=(const Arr& rhs) {
this->~Arr();
this->Arr::Arr(rhs);
return (*this);
}
我知道它是可以使用複製和交換,但仍:這裏是什麼出了問題?
此代碼並不是特例安全的,如果您瞭解swap,爲什麼會問這樣的問題?爲什麼你會寫這樣糟糕的代碼!你的代碼的問題是顯式調用構造函數是非法的。在已經分配的內存上調用構造函數的唯一方法是使用placement new(至少在C++ 03中)。如果第二種語法適用於你的編譯器,那麼我懷疑它是標準的。 – Phil1970
*「爲什麼第二個解決方案能夠工作,但不是第一個解決方案?」 - 可能是因爲您正在使用有缺陷的編譯器或使用錯誤的選項調用它。 –