2012-08-22 72 views
2

我發現這裏的一些帖子討論有關運算符重載和運算符不能在C++中重載如.::.*sizeof等等。但我無法找到有關爲什麼應該避免.*的具體細節或原因?幾個你可能會投它的重複,但我會很樂意,如果我得到我想要的那些鏈接:)爲什麼。*運算符不能在C++中重載?

+3

這是出於同樣的原因'運營商.'不能超載。 –

+0

@Nicol Bolas你的意思是說我們可以重載 - > *所以我們不應該超載。 – Invictus

+1

@Ritesh:我不認爲你可以從Nicol所說的那個推論出來。他只是說,不允許'operator.'重載和'operator。*'重載的原因是一樣的。沒有鏈接到'運算符 - > *'(至少不是直接) –

回答

8

Horse's mouth細節:

操作.(點)的,原則上使用與 - >相同的技術來過載。但是,這樣做可能會導致問題,您的操作是否是爲超載.對象或.提到例如對象:

class Y { 
public: 
    void f(); 
    // ... 
}; 

class X { // assume that you can overload . 
    Y* p; 
    Y& operator.() { return *p; } 
    void f(); 
    // ... 
}; 

void g(X& x) 
{ 
    x.f(); // X::f or Y::f or error? 
} 

這個問題可以通過多種方式來解決。在標準化的時候,哪種方式最好不明顯。

AFAIU同樣的道理適用於.*

+0

除非rhs上的類型不是'Y ::'的成員指針。 – curiousguy

1

這是很容易理解,如果你通過操作函數調用的內在機制。

說一個類Complex可以有兩個成員; r爲實部,i爲虛部。例如:

Complex C1(10,20),C2(10,2) // we assume there is an already a two argument constructor within class. 

現在,如果你寫C1+C2的一份聲明中,編譯器試圖找到+操作的重載版本的複數。如果您超載+話務員,則C1+C2在內部翻譯爲c1.operator+(c2)

但是,你會翻譯一個過載的.運算符爲?例如:

C1.disp()//display content of a complex object 

現在試着想出一個C1.operator.(------)的內部表示形式。鑑於這種語法會修改它自己的語義,結果是無望的混亂。出於這個原因,不允許超載.