別々の書き込みが要約するには、この指標の誤解の多くは、前に、不完全な、私を修正してください批判があります!
まず、問題
あなたはそれらのメンバ関数を呼び出すときに1、実際には、彼らがどのように私はそれにアクセスするためのデータメンバーをどのオブジェクト知っているメンバ関数、関数がコードの同じ部分で異なるオブジェクトのクラスを呼び出しますか?
はい、このポインタによるもの。各オブジェクトは、オブジェクトのメモリアドレスに、このポインタレコードをこのへのポインタを持って、我々はメンバ関数を呼び出すとき、メンバ関数のデフォルトの最初のパラメータT *のconstこの登録、ほとんどのコンパイラは、によってECXレジスタで、このポインタを渡します暗黙のこのパラメータには、オブジェクトのデータメンバにアクセスすることができます。
2.なぜクラスのメンバ関数であり、静的定数によって修正することができないのですか?
データメンバの変形を防止するために使用される関数のconstのクラスは、典型的には、オブジェクトを変更するが、静的な関数は、オブジェクトのデータメンバにアクセスすることができない、このポインタではありません。
二、このポインタの注意事項
中1.C ++ このキーはに一定のポインタへのポインタであるオブジェクト自身、この割り当てを与えることができません。
2.メンバーだけが、この関数ポインタを持って、フレンド関数は、このポインタはありません、クラスのメンバ関数ではありません。
3.また、この特定のオブジェクトに属していないスタティック関数ポインタ、静的変数と静的関数、ではありません。
スコープクラスのメンバ関数内4.thisポインタは、クラスから抜け出すことができません。
5.thisオブジェクトポインタの一部ではない、このポインタは、反応sizeof演算子のメモリサイズによって占有されていません。
三、使用してこのポインタ
このようなデフォルトのアドレス演算子オーバーロード機能クラスとしてクラスオブジェクト自体が時間の非静的メンバ関数である1を返し、直接*これを返し、また戻すことができる*これを参照して、入力および出力ストリームとして缶「カスケード」操作。
2クラスのメンバ変数を変更し、メンバ変数またはパラメータ名は、(但し、書き込ま=コンパイラ)は、this-> =ように、同じです。
3.ときのクラス定義は、その時点で変数名を知らなかったので、自分の型変数を使用するような使用変数自体にこのポインタを使用します。
四、このポインタを探ります
1.このポインタは、ときに作成されましたか?
新しいオブジェクトは、さらなる理解を必要とする特定の段階で作成されます。
2.このポインタがどこ保存されていますか?ヒープ、スタック、グローバル変数、または他の何か?
なぜなら異なるコンパイラのこのポインタは異なる配置を持っています。スタックしてもよいし、それはレジスタ、でもグローバル変数かもしれません。即時、登録値とメモリ変数:どのレベルのコンパイルでは、値が唯一の三つの形式で表示されます。レジスタに格納されていないが、メモリに格納され、彼らは対応していない高レベルの言語変数です。
3.なぜC ++ NULLオブジェクトポインタは、非仮想メンバ関数を呼び出し、およびJava、しかし、そうではありませんか?
C ++言語では有意な差にC ++やJavaである、静的にバインドされています。メンバ関数は、特定のオブジェクトに関連付けられていないプログラムがコンパイルされるとき、メンバ関数の本体のすべてのメンバーに共通する機能が、すなわち、メンバ関数のアドレスが決定されています。また、C ++は、唯一の有効なオブジェクトへのポインタポイントは、C ++が自分の手の実効性を確保するために、プログラマを必要とするかどうかを気にしない、あなたのポインタ型を気に。また、いくつかのシステムでは、アドレス0は理論的には、オブジェクトのアドレスに0を構築することができ、有効なので、オブジェクトnullptrは、C ++メンバ関数でコールする理由はありません。
nullptrオブジェクトは、メンバ関数を呼び出すと、それは、これを使用することはありませんので、あなたは、このオブジェクトのアクセスメンバ変数、プログラムがクラッシュしたら、プログラムを実行し、オブジェクトの独自のメモリ部にアクセスしないでください。もちろん、仮想メソッドを呼び出すnullptr(メモリ空間を使用して、仮想関数と仮想テーブル)で実行されません、仮想メソッド呼び出しは、このポインタに依存しています。、あなたはそれをパラメータエラーを渡す、理解することができますが、それは機能の動作に影響を与えないように、関数内で引数を使用しませんでした。以下のコードを参照してください。
1つの#include <iostreamの> 2 使用して 名前空間STDを、 3 4 クラスCPeople 5 { 6 公共: 7 CPeople(CONSTのstd :: 文字列・名前、int型の年齢) 8 :MNAME(名前)、MAGE(年齢){} 9 〜CPeople()。 10 11 ボイド印刷() 12 { 13 のstd :: coutの<< " ショーの人々情報:" STD ::てendl; 14 } 15 16 ボイドPRINTINFO() 17 { 18 のstd :: COUT << " 名:" << MNAME << はstd :: ENDL。 19 のstd :: coutの<< " 年齢:" <<メイジ<< はstd ::てendl; 20 } 21 22 プライベート: 23 24 のstd :: 文字列MNAME。 25 int型MAGE。 26 27 }。 28 29 のint main()の 30 { 31 CPeople * JON = NULL; 32 jon->印刷(); // 実行プログラム 33は、 jon-> PRINTINFO(); // クラッシュ、不正なアドレスにアクセスし、この時間MNAME MAGEスペース割り当てられていない 34は、 リターン 0 ; 35 }
V.の概要
この回答への古典的なポインタ:
C ++クラスの総合的な理解と、このポインタの後、より深遠なステップかどうかを理解するには?ゆっくりと蓄積し、深い知識、是非!