2012-07-04 135 views
1

編輯:對於愚蠢的標題感到抱歉;通過「指針對象」我想我的意思是解引用的對象指針(如果這是任何澄清)。爲什麼你不能在指針對象上調用函數?

我是新來的C++,我一直在嘗試習慣它的特性(來自Java)。

我知道這通常不是必要的,但我想嘗試通過它的指針傳遞一個對象。當然,它的工作原理,但我也期待這個工作:

void test(Dog * d) { 
*d.bark(); 
} 

而事實並非如此。爲什麼是這樣?我發現我可以做到以下幾點:

void test(Dog * d) { 
Dog dawg = *d; 
dawg.bark(); 
} 

它的工作完美無瑕。這對我來說似乎是多餘的。

任何澄清,將不勝感激。謝謝!

+0

重要的答案。感謝大家。我不知道你可以用括號將*狗分開。 – ICoffeeConsumer

+0

編輯我的答案,亞歷克斯;希望它澄清你可以做這樣的事情的原因:) – WendiKidd

+2

@Alex Reidy:稍微不相關..但請注意'Dog dawg = * d;'會創建傳遞的'd'對象的*副本*。所以'bark'將被複制的對象調用,而不是'd'。 – Naveen

回答

6

您必須在poi上使用->運算符nters。 .運算符用於非指針對象。

在您的第一個代碼段中,嘗試d->bark();。應該工作正常!


編輯:其他答案建議(*d).bark();。這也會起作用; (*d)取消引用指針(即將其轉換爲普通對象),這就是.運算符工作的原因。要使用原始指針,只需d,您必須按照我所述使用->運算符。

希望這會有所幫助!

+0

這兩種方法的很好的解釋!我一直認爲操作順序和括號只是用於數學運算。 – ICoffeeConsumer

+0

@AlexReidy謝謝! :)而不是,括號只是意味着「先做這個」。 – WendiKidd

+2

@WendiKidd:*「你必須在指針上使用 - >運算符。」*。如果'T'已經重載'operator->',那麼可以在'T'類型的非指針對象上應用' - >'。 – Nawaz

9

Imo。優先於非關聯*,即:

(*d).bark(); 

,或者爲指針,在對方回覆說 - 使用->

d->bark(); 

一定要檢查空:)

+7

IMO?你的意見完全與它無關。 –

+0

啊,對。請原諒我的英語,我的意思是AFAIK :)自C++日子以來的8年 –

6

其所有圓括號:

(*d).bark(); 
2

當使用指針時,您需要使用->運算符,即代碼應該是d->bark();

+0

謝謝!忘了那是爲了什麼。 – ICoffeeConsumer

7

只是爲了澄清的情況下,你可以使用任何(*pointer).member(),或pointer->member() - a->b相當於(*a).b

當然,這是假設你正在處理「真實」(內置)指針。這是可能重載operator->做一些不同的事情。但是,operator->的過載雖然有所限制,但通常會阻止人們對其進行操作。您可能遇到的一件事(例如,,舊的某些迭代器的實現)根本就不支持operator->,所以試圖使用它將導致編譯錯誤。儘管這種實現(大部分是)已經過去了很久,但您仍然可能會看到一些(通常較老的)代碼使用(*iterator).whatever而不是->,因此。

3

大家都缺少一點回答:運算符優先級

operator.的優先級高於(一元)指針間接(*)操作符的優先級。這就是爲什麼需要括號。這就像把周圍+括號來得到正確的平均值爲:

int nAverage = (n1+n2)/2; 

對於間接指針的情況下,你lukcy該編譯器是給你的錯誤!

相關問題