前々回に予告したとおり、今回はメンバ関数を呼びだしたオブジェクトを参照する方法について話します。それでは。
今回の要点は以下の通りです。
では、いってみましょう。
前々回の配列をコピーする関数で、自分自身はコピーしないようにする処理がありました。
// 自分自身はコピーしない if(m_pnum == rother.m_pnum) return true;
そうそう、これです。
違うオブジェクトではそれぞれ別なところに配列を確保しているので、これで判定できるというものです。両方 NULL なときでも引っかかりますが、その時はコピーは不要です。
しかし、自分自身かどうかをメンバで確認するというのは不便です。今回はたまたま確認できるようなメンバがありましたが、そういうメンバのないこともあります。
ここで考えられるのは、メンバのアドレスを確認するというものです。同じオブジェクトの同じメンバのアドレスは同じですね。
if(&m_pnum == &rother.m_pnum) return true;
しかし、何か回りくどい気がします。
ここで、第2章で言ったことを思い出してみて下さい。
「メンバ関数を呼ぶときにオブジェクトのアドレスを渡し、メンバ関数ではそのアドレスを使って szName を利用しているのです。」
メンバ変数のアドレスが取得できるのは、オブジェクト自身のアドレスが分かっているからです。ということは、メンバ関数を呼んだオブジェクトのアドレスを直接取得できても良さそうですね。そうなると、それと &rother を比べれば判定できます。
その自分自身のアドレスというのは this というもので取得できます。これを this ポインタと呼びます。これを使えば、
if(this == &rother) return true;
となるわけです。これですっきりしましたね。
では、実際に this ポインタがメンバ関数を呼んだ関数のアドレスになっているのかを確かめてみましょう。
プログラム | 実行結果 |
---|---|
// This1.cpp #include <iostream.h> class CTest { int a[100]; public: CTest* RetThis(){ return this; } }; int main() { CTest test1, test2; cout << "test1 : " << &test1 << endl << "test2 : " << &test2 << endl << "test1 : " << test1.RetThis() << endl << "test2 : " << test2.RetThis() << endl; return 0; } |
test1 : 0x0065FC68 test2 : 0x0065FAD8 test1 : 0x0065FC68 test2 : 0x0065FAD8 |
期待通りの結果になりましたね。
では、今回の要点です。
次回も this ポインタについてのお話です。1つにしても良かったのですが、やっぱり2つに分けました。
それでは、次回まで。
Last update was done on 2000.8.30
この講座の著作権はロベールが保有しています