NULL ポインター上のクラス メンバーへのアクセス
型 Foo のインスタンスへのポインターとして宣言されているにもかかわらず、foo 変数は次のように初期化されます。 0、nullポインタになります。 null ポインターのメンバーへのアクセスは通常未定義の動作であるため、これは直観に反しているように思えるかもしれません。ただし、特定の状況ではこの動作が許可されます。
非仮想メソッドの呼び出し
非仮想メソッド Say_hi() は、null ポインターにもかかわらず正常に呼び出されます。仮想メソッド。仮想メソッドには、オブジェクトのタイプに基づいて呼び出す関数を決定するための有効なオブジェクトが必要です。一方、非仮想メソッドには、コンパイラが直接関数呼び出し命令を生成するために使用する事前定義された関数アドレスがあります。
具体的には、コンパイラは次と同等のコードを生成します。
void Foo_say_hi(Foo* this); Foo_say_hi(foo);
say_hi() 関数は this ポインタを参照しないため、潜在的に null のポインタを逆参照する必要がなくなります。 pointer.
オブジェクトの割り当て
foo 変数は main 関数内のローカル変数であるため、関数のスタックに割り当てられます。ポインタ変数として、それが指す実際のオブジェクトはここでは割り当てられません。 null 値は、ポインターが有効なオブジェクトを参照していないことを示します。
以上がNULL ポインターで非仮想メソッドを呼び出しても未定義の動作が発生しないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。