2008-10-21 77 views

回答

114

下面的兩個表達式是等效的:

a->b 

(*a).b 

(受運算符重載,如康拉德提到,但是這是不尋常的)。

+9

超載問題的返回類型少了很多不尋常的比你想象的。不久前,STL實現者對於某些迭代器類型沒有重載的` - >`運算符,所以你*有*使用`* .`。許多圖書館對它們的定義不一致。當您使用模板並且不知道確切的類型時變得非常煩人。 – 2008-10-21 10:15:00

+0

編輯完成後,我認爲你的帖子會以很好的方式召喚它。 – 2008-10-21 10:16:54

+1

你也可以做`a [0]。b`而不是`(* a).b`。但它不會像結構合理。 – 2013-06-19 03:35:11

61

a->b通常是(*a).b的同義詞。括號這裏是必要的,因爲運營商*.*a.b的綁定強度將不起作用,因爲.綁定更強,並首先執行。因此這相當於*(a.b)

但是請注意超載:由於->*都可能超載,因此它們的含義可能會有很大差異。

13

我主要是看它的權利到左,並呼籲「在」

foo->bar->baz = qux->croak 

變爲:

「巴茲在FOO酒吧成爲qux發牢騷。」

35

C++語言將箭頭運算符(->)定義爲取消引用指針的同義詞,然後在該地址上使用.操作符。

例如:

如果你有一個對象,anObject和指針,aPointer

SomeClass anObject = new SomeClass(); 
SomeClass *aPointer = &anObject; 

爲了能夠使用的對象方法中的一種取消引用指針,並做了該地址的方法調用:

(*aPointer).method(); 

其可以與箭頭操作符來寫:

aPointer->method(); 

箭頭運算符的existents的主要原因是它縮短了一個非常常見的任務的鍵入,並且它也容易忘記指針取消引用周圍的括號。如果您忘記了括號中的。運營商將結合做強那麼* - 運算符,讓我們的例子中執行如下:

*(aPointer.method()); // Not our intention! 

其他一些答案也同時提及的是C++運算符可以過載,它不是那很普通。

14

在C++ 0x中,運營商得到了第二含義,表示函數或lambda表達式

auto f() -> int; // "->" means "returns ..." 
相關問題