2012-07-07 7 views
8

私はC++へのビット新たなんだとQtで物事を仕事にしようとすると、この混乱を招く事に出くわした:C++クラスオブジェクトのポインタとアクセスメンバ関数

様々なチュートリアルの概念のようなものを述べる:

Class *obj; 

*obj - 参照メモリに格納されたオブジェクトの値を表示する
obj - それは

ようポインティングされたメモリのアドレスとなり、Iはsomethiをするだろう以下のようなNG

*obj=new Class(); 

が、私は機能にアクセスしたい場合は、私が代わりに*obj->function1();

obj->function1(); をしなければならない - 通常のオブジェクトであるため、[normalObj.function1();]働くだろう、なぜわからない、それはだから直接価値。

ので、ポインタオブジェクトは、なぜ私たちは、 に機能にアクセスするためのメモリ参照を使用するか、また、通常のオブジェクトの場合には、そのは常に参照することにあるんため

PS:誰かが良いのチュートリアルに私を導くことができますC++でポインタを使用することで、これらのようなクエリを直接扱うことができます。

+1

のように行うことができます[「C++でのポインタの良いチュートリアル」](http://dl.dropbox.com/u/6101039/Modern%20C%2B%2B .pdf) –

答えて

23

*シンボルは、ポインタを定義し、ポインタを逆参照するために使用されます。例えば、私はint型へのポインタを作成したい場合は、私が行うことができます。この例では

int *ptr;

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

​​

これはまた5.プリントアウトされます、あなたは*記号を使用しないでください。だから:

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(); 

ポインタだけの簡単な概要ですが、それが役に立てば幸い。

+1

- >演算子を説明してくれてありがとう –

3

実際、あなたは間違っています。あなたは実行します。

obj=new Class(); 

または完全に異なってい

Class *obj = new Class; 

Class *obj; 
*obj = new Class; 

はコンパイルされません。

objのタイプはClass*なので、それに割り当てることができます(そしてnew Classが返すもの)。

3

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

オペレータの優先順位のため、これは(*obj).memberのようになります。これがあまりにも書いていると思う人のためには、obj->memberはもっと短い選択肢です。

あなたはタイプClassのオブジェクトcClassのメンバーであるポインタptrを逆参照*c.ptr手段を持っている場合。これが(*obj).memberの理由の1つです。

0

より正確にuはこの

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