2012-02-12 21 views
3

誰かが私に " - >"がC++で何を意味するのか説明できますか?C++での " - >"演算子の意味は何ですか?

例として、あなたができれば、彼らは私がよりよく理解するのに役立ちます。おかげさまで

+1

+1なぜ人々があなたを下降させているのか分かりません。基本的な質問ですが、何ですか?それは悪くはありません。 –

+1

+1:それは簡単な質問ですが、ウェブでそのような文字を検索することは非常に難しいです。あなたはおそらく[良い本](http://stackoverflow.com/q/388242/78845)から利益を得るだろう。 – Johnsyweb

+4

本当に、それは基本的な質問です。しかし、それはまた、C++やCのどんな*本を見ても簡単に答えることができる質問です。Googleは人々がすべき唯一の研究ではありません。 –

答えて

9

これは、プロパティへのアクセス(またはメソッド呼び出し)に続いて逆参照するためのショートカットです。コードで

、ここではこの同値のいくつかの例は以下のとおりです。

Foo *foo; 

// field access 
foo->bar = 10; 
(*foo).bar = 10; 

// method invocation 
foo->baz(); 
(*foo).baz(); 

あなたはこれらの長いシーケンスを持っている場合、これは特に便利です。あなたは各要素は次へのポインタを持っている単独リンクリストのデータ構造を持っている場合たとえば、次は等価で5番目の要素を見つける(が、1つは非常に良く見えます)の方法:

linked_list *head, *fifth; 
fifth = head->next->next->next->next; 
fifth = (*(*(*(*head).next).next).next).next; 
+0

はるかに便利です。実際のコードのコードスニペットは、リソース記述子( 'rd')へのポインタがあれば、リソースをホストするサーバのフレンドリ名を取得します:' rd-> resource-> GetServer() - > GetFriendlyName() '。 'GetServer'関数は、リソースをホストするサーバへのポインタを返します。 'resource'はリソース記述子構造のメンバーです。それが '(*)'の形でいかに醜いか考えてみましょう。 –

+0

C++のほぼすべての演算子と同様に、 '*'と ' - >'の両方に '(* a).b'と' a-> b 'のオーバーロードができる補遺を作るべきです。 'a'がポインタでないと同等です。 – PeterT

6

それは多くの場合、「会員アクセス」演算子と呼ばれています。基本的にa->bは、(*a).bと書く方が良いです。あなたは「にオブジェクトaポイントでbメンバー/機能にアクセスする」としてa->bと考えることができます。 「aメンバーアクセスb」と声を出して読むことができます。私は(別の人によって書かれた、いくつかの異なるプロジェクトから)チェック構造C++コードは、コードの行の10%(ヘッダーをカウントしない)のランダムサンプルで

は、少なくとも一つのメンバアクセス演算子を含んでいました。

+1

あなたの答えに「ポインタ」という言葉の言及がはっきりしていません。はい、演算子 - >オーバーロードすることができますが、それでも実際にはポインタを模倣するオブジェクトに対してのみ行われます。 –

+0

@NicolBolas通常は、(ほとんどの場合、)メンバアクセスオブジェクトは、文字どおりのポインタか、ポインタのように動作するクラスのインスタンスのいずれかに使用されます。私はそれが "オブジェクト" a * points * to "にアクセスすると言います。 –

+0

はい、あなたはそう言いますが、あなたはそれを "a"のメンバーアクセス "b"と読むことができます。ポインタが実際にメンバーを持っていないので、 'a'が裸のポインタである場合、これは不可能です。それは "a"の逆参照であり、次にメンバーアクセスはb "である。そして、「逆参照」はポインタについて話すことなく意味をなさない。 –

1

->演算子は、LHSのポインタ(またはポインタのようなオブジェクト)と、RHSの構造体またはクラスメンバ(lhs->rhs)とともに使用されます。一般に(*lhs).rhsに相当します。これは、メンバーにアクセスするもう1つの方法です。 Demeterの法則を無視し、lhs->mid->rhs(一般的には(*(*lhs).mid).rhsより読むのが簡単です)を書く必要がある方が便利です。

あなたは->演算子をオーバーロードすることができ、かつスマートポインタは、頻繁に行います。 AFAIK.演算子をオーバーロードすることはできません。

+0

'.'は('。* '、' :: '、' '?:'とともに)多重定義することはできません。 –

関連する問題