2009-02-06 80 views
67

能夠超載這將是非常有用的。運算符在C++中,並返回一個對象的引用。爲什麼你不能重載'。'運算符在C++中?

可以重載operator->operator*但不operator.

是否有技術原因?

+4

您能舉一個例子說明何時需要重寫'。'。運營商? – 2009-02-06 12:01:15

+4

通常,用例是「智能參考」。一種代理。 – ddaa 2009-02-06 12:12:57

+2

@Gamecat:通讀[this](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1671.pdf)提議增加重載`operator.`的能力和`operator。*`,它有幾個例子。 – Mankarse 2012-02-12 02:46:43

回答

51

this quote from Bjarne Stroustrup

操作。 (點)原則上可以使用與 - >相同的技術來過載。但是,這樣做會導致問題 有關操作是否適用於對象重載。或一個 對象所指的。例如:

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? 
} 

此問題可以通過多種方式解決。在標準化的時候,哪種方式最好不明顯。有關詳細信息,請參見The Design and Evolution of C++

27

斯特勞斯has an answer for this question

操作。 (點)原則上可以使用與用於 - >的 相同的技術來重載 。但是,如果這樣做,則 會導致有關 操作是否適用於對象 重載的問題。或者是由 所引用的對象。例如:

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? 
} 

這個問題可以通過幾種方式解決 。在標準化時, 不清楚哪一種方式最好是 。有關更多詳細信息,請參閱D&E

47

Stroustrup說C++應該是一種可擴展但不可變的語言。

點(屬性訪問)操作符被認爲太靠近語言的核心以允許超載。

請參閱The Design and Evolution of C++,第242頁,第部分11.5.2智能參考文獻

當我決定讓運營商->超載,我自然考慮是否操作.也同樣可以過載。

當時,我認爲以下論點是決定性的:如果obj是類對象,那麼obj.m對該對象類的每個成員m都有含義。我們儘量不要通過重新定義內置操作來使語言變爲可變(儘管該規則違反了=的急迫需求,並且對於一元的&)。

如果我們允許一類X.超載,我們將無法通過正常手段獲得的X成員;我們將不得不使用指針並且->,但是->&也可能已被重新定義。我想要一種可擴展的語言,而不是一個可變的語言。

這些論點很重要,但不是確鑿的。特別是在1990年,Jim Adcock提出允許運營商.恰好超載運營商->的方式。

此引用中的「I」是Bjarne Stroustrup。你不可能比那更具權威性。

如果你想真正理解C++(例如「爲什麼是這樣」),你應該閱讀本書。

1

這很容易理解,如果你通過運算符函數調用的內部機制, 說一個類複合體可以有兩個成員r爲實部和i爲虛部。 說複雜的C1(10,20),C2(10,2) //我們假設在類中已經有了一個兩個參數的構造函數。 現在,如果您編寫C1 + C2作爲語句,那麼編譯器會嘗試在複數上查找+運算符的重載版本。現在我們假設我是過載+運算符,所以 C1 + C2內部翻譯爲c1.operator +(c2) 現在假設您的時間可以重載'。'運營商。 所以現在想下面再打電話C1.disp() //顯示一個複雜對象的內容現在嘗試表示爲內部表示 C1.operator。(------),創建完全混亂的東西。這就是我們不能超載的原因。''運算符

相關問題