2010-05-29 103 views
7

可能顯示的文件:
C++: ptr->hello(); /* VERSUS */ (*ptr).hello();
Why does C have a distinction between -> and . ?- >和>之間的區別是什麼。在C/C++?

我知道由指針操作者的構件操作者和構件之間的差值( - >)(。)。

爲什麼C設計人員爲此訪問創建了不同的運算符?爲什麼編譯器不能自行解決?

如果你總是使用a。是否有任何情況存在於您指的是會員還是會員的含義模糊的情況下?

編輯:我不是在尋找「(* a).b」語法。我問爲什麼設計師不讓你使用「a.b」而不是「a-> b」?

+0

該符號最初來自C. – 2010-05-29 23:53:21

+0

好點:我改變了問題使用C而不是C++。 – 2010-05-29 23:56:24

+0

[C++:ptr-> hello();/* VERSUS * /(* ptr).hello();](http://stackoverflow.com/questions/447543/c-ptr-hello-versus-ptr-hello)和[有什麼區別(。)點運算符和( - >)箭頭在c + +](http://stackoverflow.com/questions/1238613/what-is-the-difference-between-dot-operator-and-arrow-in-c) – 2010-05-30 00:05:38

回答

0

如果您的語言核心爲「便攜式彙編程序」,則不要試圖隱藏用戶的實現細節。當然,編譯器可以找出表達式a.b中的a是一個指針。你可以嗎?可靠?每時每刻?在毛茸茸的,複雜的代碼?你能不能想象一個不能很快注意到的情況,a是一個指針可能是一個問題?

停止思考「難寫」,並開始思考「容易閱讀」。 (是的,我知道,這違背了整個C程序員的神話!)你會閱讀的代碼比你寫的代碼要多出幾個數量級。

6

你真的想讓編譯器「自行解決嗎?」如果有,那麼下面將評估爲同樣的事情(假設p是指向一個結構與一個成員x):

(*p).x; 
p.x 

如果指針的間接引用是隱性存在,它應該是隱無處不在?考慮:

int* p; 
int i = p; // should dereferencing be implicit here as well? 

我認爲這會比有兩個單獨的運營商更令人困惑。

讓兩個操作員幫助跟蹤您擁有多少層間接尋址也是有幫助的。當然,->運營商並非絕對必要的,因爲p->x等同於(*p).x,但它確實使代碼更清晰易讀。

+0

您還必須考慮在涉及更多級別的間接時應該發生什麼情況:是否允許編譯器在使用'.'時取消任意深度的struct指針或將其限制爲最多一個間接程度?這兩種解決方案對我來說都是「正確的」...... – Christoph 2010-05-30 00:12:06

+0

好吧,因爲這個(對於' - >'和'::'只有''.''是在某些語言中它是如何完成的,所以這是可能的。而且看起來來自這些語言的C或C++的人們發現,必須區分它們使人感到困惑。 – sbi 2010-05-30 00:16:08

+0

另請參閱[這個答案](http://stackoverflow.com/questions/2843916/c-help-about-class-and-error-c3861/2843960#2843960)。 – sbi 2010-05-30 00:21:58

2

是含糊來自能夠同時重寫運營商。最好的例子可能是shared pointers。共享指針可以用於。和 - >操作符都有不同的含義。

使用 - >訪問指向的對象。你訪問共享指針本身的成員。

例如:

class MyObject { 
public: 
    void myFunction() {} 
}; 
boost::shared_ptr<MyObject> ptr; 
ptr.use_count(); // calls use_count, which is a member of boost::shared_ptr. 
ptr->myFunction(); // calls MyObject::myFunction, as the operator-> is overriden 
-1

兩個fo->bar(*fo).bar做同樣的事情!

該語言僅提供間接訪問操作符,即箭頭(->)並將其視爲單個符號。

+0

爲什麼這是upvoted?它不回答這個問題。 – 2010-05-30 07:06:35

+0

@好事實際上,你編輯了你的問題! – Secko 2010-05-30 11:17:48

-1

- >運算符只是通過指針引用對象的方法或成員的一種簡單方法,而不是使用類似(* p).member或(* p).method之類的方法。

示例:

MyClass * MyObj;方法();();}}比(* MyObj).method()更好的閱讀和理解;

0

C++讓你覆蓋->運營商。當你有一個像std::auto_ptr這樣的智能指針類時,同一個變量可能同時支持.->,您在其上使用.來訪問auto_ptr->的成員,以訪問其包含的指針的成員。

相關問題