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); 
} 

我知道它是可以使用複製和交換,但仍:這裏是什麼出了問題?

+2

此代碼並不是特例安全的,如果您瞭解swap,爲什麼會問這樣的問題?爲什麼你會寫這樣糟糕的代碼!你的代碼的問題是顯式調用構造函數是非法的。在已經分配的內存上調用構造函數的唯一方法是使用placement new(至少在C++ 03中)。如果第二種語法適用於你的編譯器,那麼我懷疑它是標準的。 – Phil1970

+2

*「爲什麼第二個解決方案能夠工作,但不是第一個解決方案?」 - 可能是因爲您正在使用有缺陷的編譯器或使用錯誤的選項調用它。 –

回答

-1

那麼,在海灣合作委員會這兩個是不允許的。我的猜測是,如果你的編譯器允許一個而不是另一個,那麼這是爲了避免消除歧義。

當您編寫this->Arr()時,編譯器無法知道您打算調用構造函數,而不是僅僅實例化一個新對象。

當你寫this->Arr::Arr(),那麼編譯器知道你叫靜態功能類ArrArr()

相關問題