web-dev-qa-db-ja.com

C ++クラスオブジェクトポインターとメンバー関数へのアクセス

私はC++に少し慣れていないので、Qtを使って作業しようとすると、この混乱することに遭遇しました。

さまざまなチュートリアルの概念は、次のように述べています。

_Class *obj;
_

_*obj_-参照されたメモリに格納されているオブジェクトの値を表示します
obj-指しているメモリのアドレスになります

だから、私は次のようなことをします

_*obj=new Class();
_

関数にアクセスしたい場合は、obj->function1();ではなく*obj->function1();を実行する必要があります

-通常のオブジェクトでは[normalObj.function1();]が機能するため、理由は不明です。これは直接値だからです。

したがって、ポインタオブジェクトの場合、なぜ関数にアクセスするためにメモリ参照を使用するのか、または通常のオブジェクトの場合も常に参照するのはなぜですか?

PS:誰かが私にC++でのポインターの使用法の優れたチュートリアルを案内してくれませんか?.

14
rock_win

*記号は、ポインターを定義し、ポインターを逆参照するために使用されます。たとえば、intへのポインタを作成したい場合は、次のようにします。

int *ptr;

この例では、*を使用して、これがintへのポインターであることを宣言しています。ここで、ポインターを宣言せずに、すでに宣言されているポインターで*シンボルを使用すると、そのポインターが逆参照されます。ご存知のように、ポインタは単なるアドレスです。ポインターを逆参照すると、そのアドレスが指す値が取得されます。例えば:

int pointToMe = 5;
int *ptr = &pointToMe;
std::cout << *ptr;

これにより、5が出力されます。また、新しいアドレスへのポインターを割り当てており、それが宣言にない場合は、notを使用して*記号を使用します。そう:

int pointToMe = 5;
int *ptr;
ptr = &pointToMe;

あなたがそれをする方法です。ポインタを参照して、アドレスが指す値に新しい値を割り当てることもできます。といった:

int pointToMe = 5;
int *ptr = &pointToMe;
std::cout << *ptr; // Prints out 5
*ptr = 27;
std::cout << *ptr; // Prints out 27

現在、->は、差分記号のように機能します。ポインターを逆参照し、非ポインターオブジェクトで.を使用した場合と同様に、メンバー関数と変数を使用します。ポインタではないオブジェクトでも、最初にアドレスを取得することで->を使用できます。

CObj object;
(&object)->MemberFunction();

これはポインタの簡単な概要です。お役に立てば幸いです。

28
Yokatta24

「通常の」.を使用してオブジェクトメンバーにアクセスできますが、最初にポインターを逆参照する必要があります。

演算子の優先順位により、これは(*obj).memberのようになります。これを書くには多すぎると思う人にとっては、obj->memberはより短い代替手段です。

タイプcのオブジェクトClassがある場合、*c.ptrは、ptrのメンバーであるポインターClassの逆参照を意味します。それが(*obj).memberの1つの理由です。これは別のことを意味します。

4
Bo Persson

実際、あなたは間違っています。あなたがやる:

obj=new Class();

または

Class *obj = new Class;

まったく違います。

Class *obj;
*obj = new Class;

コンパイルされません。

objはタイプClass*、これを割り当てることができます(そしてnew Class 戻り値)。

3
Luchian Grigore

より正確には、あなたはこのようにすることができます

Class  obj;
Class* obj_ptr;

obj_ptr = &obj;

// Now onwards you can use the pointer to access data members and function

obj_ptr->a = 10; // Like this
1
Vikas Rao