C++でのドット(。)演算子と - >の違いは何ですか?
foo->bar()
は(*foo).bar()
と同じです。
*
および.
演算子の結合強度のため、上記の括弧が必要です。
Dot(.
)演算子が最初に評価されるため、*foo.bar()
は機能しません( 演算子の優先順位 を参照)
Dot(.
)演算子はオーバーロードできません。arrow(->
)演算子はオーバーロードできます。
ドット(.
)演算子はポインタには適用できません。
また、参照してください: C + +での矢印演算子( - >)の同義語は何ですか?
ポインタのために、我々はただ使うことができます
*pointervariable.foo
しかし、.
演算子は*
演算子よりも優先順位が高いため、.
が最初に評価されます。それで括弧でこれを強制する必要があります。
(*pointervariable).foo
しかし()をつねに入力するのは難しいので、同じことを言うためのショートカットとして->
を開発しました。オブジェクトまたはオブジェクト参照のプロパティにアクセスする場合は.
を使用します。ポインタを介してオブジェクトのプロパティにアクセスする場合は->
を使用します。
ドット演算子はオーバーロードできず、矢印演算子はオーバーロードできます。矢印演算子は通常、ポインタ(またはスマートポインタのようにポインタのように動作するオブジェクト)に適用することを目的としています。ドット演算子をポインタに適用することはできません。
編集ポインタへの適用矢印演算子は、ポインタ演算子へのドット演算子の適用と同等です(ptr-> fieldは(* ptr).fieldと同等です)
矢印演算子はドットと似ていますが、ポインタを先に参照解除する点が異なります。 foo.bar()
はオブジェクトfoo
のメソッドbar()
を呼び出し、foo->bar
はポインタbar
が指すオブジェクトのメソッドfoo
を呼び出します。
.
演算子は直接メンバーアクセス用です。
object.Field
あなたがそれが指しているオブジェクト/メモリにアクセスできるように、矢印はポインタを間接参照します
pClass->Field
pSomething->someMember
と同等です
(*pSomething).someMember
ターゲット。ドットはオブジェクトに作用します。矢印はオブジェクトへのポインタに作用します。
std::string str("foo");
std::string * pstr = new std::string("foo");
str.size ();
pstr->size ();
ポインタがある場合は->
を使用してください。構造体(クラス)がある場合は.
を使用してください。
構造体に属するpoint属性が欲しいときは.
を使います。
structure.attribute
ポインタでメモリを参照している属性を指す場合は、->
を使用します。
pointer->method;
または同じ
(*pointer).method
- >演算子は、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.
}
- >はポインタの間接参照のための単なる構文糖です。
他の人が言っているように:
pointer-> method();
という簡単な方法です。
(*ポインタ).method();
もっとポインターを楽しくするために、Binkyと彼の魔法のワンドの参照解除をチェックしてください。
いつでも簡単です
x->y
それが同じであることを知っている
(*x).y
2つの最も単純な違いは、 " - >"がそのオブジェクトフィールド、関数などを調べる前にポインタを間接参照することです。最初に間接参照しません。オブジェクトへのポインタがあるときは " - >"を使い、 "。"を使ってください。オブジェクトの実際のインスタンスを使っているとき。
これを書くための別の等価な方法は、最初にポインタで間接参照 "*"を使用し、次に "。"を使用することです。 「 - >」を使用して仲介人をスキップします。
他にも違いがありますが、他の答えはこれを広くカバーしています。
もしあなたがJavaのバックグラウンドを持っているなら、これはあなたを混乱させるかもしれません、なぜなら、Javaでは、すべてがポインターだからです。これは、ポインタを先に参照しないシンボルを持つ理由がないことを意味します。しかしc ++では、ポインタとは何か、またポインタではないことを覚えておくと、もう少し注意が必要です。それらにプレフィックス「p_」または単に「p」を付けることをお勧めします。
です。 (ドット)演算子は通常、フィールドを取得したり、クラスのインスタンス(またはクラスの静的フィールド/メソッド)からメソッドを呼び出すために使用されます。
p.myField、p.myMethod() - クラスのpインスタンス
- >(矢印)演算子は、クラスが指すコンテンツからフィールドを取得したり、メソッドを呼び出したりするために使用されます。
p-> myField、p-> myMethod() - pはクラスを指す
- >演算子は、ポインタを操作しているときに使用され、それ以外の場合はドットが使用されます。それで、以下のような構造体クラスがあるとします。
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
注:クラスの場合、そのクラスのメンバー関数にアクセスする方法も同じです。