4

重複の可能性:
NULLオブジェクトポインターでメンバー関数を呼び出すとどうなりますか?

class A {
  public:
    void foo() { cout << "Work";}
    void bar() { this->foo(); }//new edit, works too!
};

class B {
  private:
    A *a; //never initialized
  public:
    A& getA() {
      return *a;
    }
};

void SomeFunction() {
    B *b = new B();
    B& bRef = *b;
    bRef.getA().bar();//edited
    delete b;
}

「a」を初期化せずにSomeFunction()を呼び出しましたが、それでも「Work」は正しく出力されます。理由がわかりません。セグメンテーション違反で救済されるべきでした。

4

3 に答える 3

10

これは未定義の動作ですが、ほとんどのコンパイラで機能しますが、そうではfooなく、ポインタvirtualを使用しません。this

于 2012-10-18T07:34:37.220 に答える
5

クラスはC++の単なる構成要素であることを忘れないでください。thisコンパイルすると、すべてのクラスメソッドは、非表示のパラメーターを受け入れる静的メソッドにすぎません。

メソッドがデータメンバーを参照することはないため、foo()メソッドを使用する必要はないため、この値が初期化されていなくても正常に実行されます。

于 2012-10-18T07:45:24.927 に答える
3

意味的には、

o.f(args)

と同じです

f(o, args)

A::foo()したがって、呼び出している関数( )は:と同等であると見なすことができます。

void A_foo(A* pthis)
{
    cout << "Work";
}

ご覧のとおり、pthis参照が解除されることはないため、無効なメモリアクセスは発生しません。と入力しても、this->foo()まったく同じ呼び出しであり、this逆参照する必要はありません。

少なくとも、それはコンパイラがそれを実装する一般的な方法の1つです。何が起こるかは正確には定義されていないため、Death Station 9000でコードを実行すると、代わりに子猫が宇宙に飛び出す可能性があります。子猫のことを考えてください!

于 2012-10-18T07:59:02.377 に答える