C++の非静的メンバー関数

1518 ワード

以下の点を明らかにします.
  • C++のクラスの非静的メンバーは共有されています.つまり、同じクラスのすべてのオブジェクトが同じ非静的メンバー関数を共有しています.すなわち、クラスの非静的メンバー関数はオブジェクトに依存しない.
  • のコンパイラは、非静的メンバー関数を処理するときに、そのパラメータリストにthisポインタを追加します.thisポインタは、非静的メンバー関数を具体的に呼び出すオブジェクトの開始アドレスを指します.この非静的メンバー関数に必要なすべてのメンバーデータは、このthisポインタによって取得されます.

  • 以下のいくつかの小さな例で説明します.
    #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