2011-05-08 50 views
3

當我有這樣一個指針:C++的問題,有關*和 - >

MyClass * pRags = new MyClass; 

這樣我就可以使用

pRags->foo() 

(*pRags).foo() 

來調用foo。

爲什麼這兩個是相同的?什麼是* pRags?

謝謝

+0

謝謝大家。我知道了。 – 2011-05-08 07:15:29

回答

4

pRags->foo()定義爲作爲相當於(*pRags).foo()的句法糖。

*運算符對一個指針取消引用。也就是說,它表示您正在操作指針指向的內容,而不是指針本身。

5

爲什麼這兩個相同的?

它們是等價的,因爲規範說它們是等價的。內置的->是根據內置的*.定義的。

什麼是*pRags

這是pRags指向的MyClass對象。 *解除引用指針,產生指向的對象。

欲瞭解更多信息,請考慮拿起a good introductory C++ book

1
  • 是的,它們是相同的。作爲標記方便,C包含在C中(因此繼承到C++中)。
  • *在該上下文中用於取消引用指針。
+0

問題是*爲什麼*它們是相同的。 – 2011-05-08 07:15:25

2

->只是一個方便的方式來編寫(*).。並且*pRags是存儲在pRags中的地址處的對象。

1

一元*被稱爲dereferencing operator。解引用指針會將T*變成T&;如果定義了對象,那麼解引用對象將調用該對象類型的一元對象operator*,否則將提供錯誤。

+0

它會變成'T&'嗎?成*參考*到'T'?還是它返回實際值?我不確定是否有區別,除了'T&'總是有效的,而'T *'可能指向'NULL',因此是無效的。 – 2011-05-08 07:16:29

+0

@Nathan Fellman:是的,它變成了對「T」的引用,而不是「T」的值;否則'* pdouble = 4.2;'將無法正常工作,因爲它會嘗試爲右值賦值。解引用'NULL'指針的行爲會調用[未定義的行爲](http://en.wikipedia.org/wiki/Undefined_behavior),但我不明白這與此有關。 – ildjarn 2011-05-08 07:18:05

+0

感謝您的澄清。然而,考慮到它在C中的工作原理是相同的,並且C沒有引用,我不確定你是否正確。在C中,你也可以用它作爲左值。 – 2011-05-08 07:19:53

1

(*pRags)它通過指針pRags並得到你的整個對象,所以你可以使用常規點符號.

1

pRags是MyClass類型的指針。就像你可以擁有原始數據類型的指針一樣,例如int ptr,你也可以有指向對象的指針,在這種情況下用pRags表示。現在使用箭頭運算符( - >)訪問對象「成員」,或者可以使用「。」。並取消引用「*」來訪問對象的成員值。這裏的成員是MyClass中的一個變量。所以,foo()將在MyClass中有一個定義。

5

除了其他答案,' - >'是爲了方便。每次訪問函數的類變量時,取消引用一個指向對象的指針是非常難看,不方便的,並且可能更容易混淆。

例如:

(*(*(*car).engine).flux_capacitor).init() 

VS

car->engine->flux_capacitor->init() 
+0

我喜歡這個例子。這當然會澄清這條捷徑的*原因*。 – 2011-05-08 07:25:07

+1

你的第一個例子錯了。 '(*(*(*車).engine).flux_capacitor)的.init()' – 2011-05-08 11:34:13