C++の非静的メンバー関数
1518 ワード
以下の点を明らかにします. C++のクラスの非静的メンバーは共有されています.つまり、同じクラスのすべてのオブジェクトが同じ非静的メンバー関数を共有しています.すなわち、クラスの非静的メンバー関数はオブジェクトに依存しない. のコンパイラは、非静的メンバー関数を処理するときに、そのパラメータリストにthisポインタを追加します.thisポインタは、非静的メンバー関数を具体的に呼び出すオブジェクトの開始アドレスを指します.この非静的メンバー関数に必要なすべてのメンバーデータは、このthisポインタによって取得されます.
以下のいくつかの小さな例で説明します.
出力結果:
call fun1 success!
call fun1 success!
00000000 00000004
call fun2 success!
00000000 00000000
8
call fun3 success!
そしてプログラムがクラッシュします.
出力の1番目と2番目のcall fun 1 successについて!呼び出したオブジェクトアドレスが任意の整数から変換されたか、空のポインタであっても、クラスの非静的メンバー関数を呼び出すことができます.もちろん、ここの非静的メンバー関数は、ここのデータ部分が存在しないため、特定のオブジェクトのデータメンバーにアクセスできません.fun 4はデータメンバーにアクセスし、プログラムがクラッシュした.第一点を十分に説明した.
3行目と4行目の出力について、メンバーデータのアドレス(実際には真のメンバーデータのアドレスではない)を出力できる理由については、C++のデータメンバーアクセス方式を参照してください.
5行目、6行目、7行目の出力では、thisが指すアドレスとm 1のアドレスが同じであり、thisが指す構造体のサイズとクラスのデータメンバーのサイズが一致していることを示します.すなわち、thisはオブジェクトのデータ部の先頭アドレス(データ部にはダミーポインタが含まれており、この例ではダミー関数がないため、thisの値は最初のデータメンバーのアドレスと同じであり、ダミー関数があれば4つのBのオフセットがある)である.本物のオブジェクトアドレスで実験をすると、結果が一致することがわかります.
プログラムのクラッシュの原因は,任意に変換されたオブジェクトポインタでメンバーデータにアクセスする際にエラーが発生したため,実際にはそのオブジェクトは存在せず,アクセスオブジェクトのデータ部分も話さなくてもよいためである.
何か問題があったら、みんなで討論してください.
転載先:https://blog.51cto.com/5653918/1399123
以下のいくつかの小さな例で説明します.
#include
using namespace std;
class A
{
int m1;
int m2;
public:
void fun1()
{
cout<fun1();
A *pa = 0;
pa->fun1();
pa->fun2();
pa->fun3();
pa->fun4();
return 1;
}
出力結果:
call fun1 success!
call fun1 success!
00000000 00000004
call fun2 success!
00000000 00000000
8
call fun3 success!
そしてプログラムがクラッシュします.
出力の1番目と2番目のcall fun 1 successについて!呼び出したオブジェクトアドレスが任意の整数から変換されたか、空のポインタであっても、クラスの非静的メンバー関数を呼び出すことができます.もちろん、ここの非静的メンバー関数は、ここのデータ部分が存在しないため、特定のオブジェクトのデータメンバーにアクセスできません.fun 4はデータメンバーにアクセスし、プログラムがクラッシュした.第一点を十分に説明した.
3行目と4行目の出力について、メンバーデータのアドレス(実際には真のメンバーデータのアドレスではない)を出力できる理由については、C++のデータメンバーアクセス方式を参照してください.
5行目、6行目、7行目の出力では、thisが指すアドレスとm 1のアドレスが同じであり、thisが指す構造体のサイズとクラスのデータメンバーのサイズが一致していることを示します.すなわち、thisはオブジェクトのデータ部の先頭アドレス(データ部にはダミーポインタが含まれており、この例ではダミー関数がないため、thisの値は最初のデータメンバーのアドレスと同じであり、ダミー関数があれば4つのBのオフセットがある)である.本物のオブジェクトアドレスで実験をすると、結果が一致することがわかります.
プログラムのクラッシュの原因は,任意に変換されたオブジェクトポインタでメンバーデータにアクセスする際にエラーが発生したため,実際にはそのオブジェクトは存在せず,アクセスオブジェクトのデータ部分も話さなくてもよいためである.
何か問題があったら、みんなで討論してください.
転載先:https://blog.51cto.com/5653918/1399123