web-dev-qa-db-ja.com

C ++でのドット(。)演算子と - >の違いは何ですか?

C++でのドット(。)演算子と - >の違いは何ですか?

292
moorthy

foo->bar()(*foo).bar()と同じです。

*および.演算子の結合強度のため、上記の括弧が必要です。

Dot(.)演算子が最初に評価されるため、*foo.bar()は機能しません( 演算子の優先順位 を参照)

Dot(.)演算子はオーバーロードできません。arrow(->)演算子はオーバーロードできます。

ドット(.)演算子はポインタには適用できません。

また、参照してください: C + +での矢印演算子( - >)の同義語は何ですか?

297
SwDevMan81

ポインタのために、我々はただ使うことができます

*pointervariable.foo

しかし、.演算子は*演算子よりも優先順位が高いため、.が最初に評価されます。それで括弧でこれを強制する必要があります。

(*pointervariable).foo

しかし()をつねに入力するのは難しいので、同じことを言うためのショートカットとして->を開発しました。オブジェクトまたはオブジェクト参照のプロパティにアクセスする場合は.を使用します。ポインタを介してオブジェクトのプロパティにアクセスする場合は->を使用します。

68

ドット演算子はオーバーロードできず、矢印演算子はオーバーロードできます。矢印演算子は通常、ポインタ(またはスマートポインタのようにポインタのように動作するオブジェクト)に適用することを目的としています。ドット演算子をポインタに適用することはできません。

編集ポインタへの適用矢印演算子は、ポインタ演算子へのドット演算子の適用と同等です(ptr-> fieldは(* ptr).fieldと同等です)

55
Tadeusz Kopec

矢印演算子はドットと似ていますが、ポインタを先に参照解除する点が異なります。 foo.bar()はオブジェクトfooのメソッドbar()を呼び出し、foo->barはポインタbarが指すオブジェクトのメソッドfooを呼び出します。

28

.演算子は直接メンバーアクセス用です。

object.Field

あなたがそれが指しているオブジェクト/メモリにアクセスできるように、矢印はポインタを間接参照します

pClass->Field
14
pSomething->someMember

と同等です

(*pSomething).someMember
13
Tamás Szelei

ターゲット。ドットはオブジェクトに作用します。矢印はオブジェクトへのポインタに作用します。

std::string str("foo");
std::string * pstr = new std::string("foo");

str.size ();
pstr->size ();
10
ezpz

ポインタがある場合は->を使用してください。構造体(クラス)がある場合は.を使用してください。

構造体に属するpoint属性が欲しいときは.を使います。

structure.attribute

ポインタでメモリを参照している属性を指す場合は、->を使用します。

pointer->method;

または同じ

(*pointer).method
5
Am1rr3zA

- >演算子は、operator []へのアクセスなど、特定の目的には使用できません。

#include <vector>

int main()
{
   std::vector<int> iVec;
   iVec.Push_back(42);
   std::vector<int>* iVecPtr = &iVec;

   //int i = iVecPtr->[0]; // Does not compile
   int i = (*iVecPtr)[0]; // Compiles.
}
3
gparent

- >はポインタの間接参照のための単なる構文糖です。

他の人が言っているように:

pointer-> method();

という簡単な方法です。

(*ポインタ).method();

もっとポインターを楽しくするために、Binkyと彼の魔法のワンドの参照解除をチェックしてください。

http://www.youtube.com/watch?v=UvoHwFvAvQE

2
Ali Parr

いつでも簡単です

 x->y

それが同じであることを知っている

 (*x).y
2
Logan Capaldo

2つの最も単純な違いは、 " - >"がそのオブジェクトフィールド、関数などを調べる前にポインタを間接参照することです。最初に間接参照しません。オブジェクトへのポインタがあるときは " - >"を使い、 "。"を使ってください。オブジェクトの実際のインスタンスを使っているとき。

これを書くための別の等価な方法は、最初にポインタで間接参照 "*"を使用し、次に "。"を使用することです。 「 - >」を使用して仲介人をスキップします。

他にも違いがありますが、他の答えはこれを広くカバーしています。

もしあなたがJavaのバックグラウンドを持っているなら、これはあなたを混乱させるかもしれません、なぜなら、Javaでは、すべてがポインターだからです。これは、ポインタを先に参照しないシンボルを持つ理由がないことを意味します。しかしc ++では、ポインタとは何か、またポインタではないことを覚えておくと、もう少し注意が必要です。それらにプレフィックス「p_」または単に「p」を付けることをお勧めします。

1
Mads Engberg

です。 (ドット)演算子は通常、フィールドを取得したり、クラスのインスタンス(またはクラスの静的フィールド/メソッド)からメソッドを呼び出すために使用されます。

p.myField、p.myMethod() - クラスのpインスタンス

- >(矢印)演算子は、クラスが指すコンテンツからフィールドを取得したり、メソッドを呼び出したりするために使用されます。

p-> myField、p-> myMethod() - pはクラスを指す

1
Samuel Carrijo

- >演算子は、ポインタを操作しているときに使用され、それ以外の場合はドットが使用されます。それで、以下のような構造体クラスがあるとします。

struct class{ int num_students; int yr_grad; };

そしてクラス* curr_class(クラスポインタ)のインスタンスを持っています、そしてそれから私たちがするであろう多くの学生にアクセスするために

cout << curr_class->num_students << endl;

Class_2016と言う単純なクラスオブジェクトがある場合は、次のようにします。

cout << class_2016.num_students << endl;

クラスへのポインタの場合、 - >演算子は次のものと同等です。

(*obj).mem_var

注:クラスの場合、そのクラスのメンバー関数にアクセスする方法も同じです。

1
PYA