C++でNULLオブジェクトポインタからメンバー関数を呼び出す方法
C++では、NULLオブジェクトポインタを使ってクラスのメンバー関数を呼び出すことができます。
注意:これは未定義動作(undefined behavior)であり、プログラムが正しく実行される保証は一切ありません。実際の結果は、使用するコンパイラによって異なります。あくまで言語仕様の理解を深めるための例としてご覧ください。
以下に、この挙動を示すサンプルプログラムを紹介します。
サンプルコード
#include <iostream>
using namespace std;
class Demo {
public :
void fun() {
cout << "This member function is called through Null object pointer.";
}
};
int main() {
Demo *ptr = NULL;
ptr->fun();
return 0;
}
実行結果
上記プログラムの出力は以下のとおりです。
This member function is called through Null object pointer.
それでは、このプログラムの内容を詳しく見ていきましょう。
クラスDemoの定義
クラスDemoには、メンバー関数fun()が定義されています。この関数は、「This member function is called through Null object pointer.」という文字列を出力します。該当するコードは以下のとおりです。
class Demo {
public :
void fun() {
cout << "This member function is called through Null object pointer.";
}
};
main関数での呼び出し処理
main()関数内では、NULLで初期化されたオブジェクトポインタptrを作成し、そのptrを通じてメンバー関数fun()を呼び出しています。該当するコードは以下のとおりです。
int main() {
Demo *ptr = NULL;
ptr->fun();
return 0;
}
なぜNULLポインタでも呼び出せるのか
このコードが一見正常に動作するのは、非仮想メンバー関数の呼び出しが、コンパイル時に通常の関数呼び出しとほぼ同じ形に変換され、暗黙的に渡されるthisポインタが単なる引数の一つとして扱われるためです。fun()の内部でthisポインタやメンバー変数にアクセスしなければ、NULLポインタ経由の呼び出しでも実行時エラーが発生せず、そのまま処理が完了します。
ただし、仮想関数を呼び出した場合や、関数内でメンバー変数へアクセスした場合は、NULL参照によりクラッシュする可能性が高くなります。繰り返しになりますが、この手法は未定義動作であり、実務のコードで使用することは絶対に避けてください。
-
C++のconstメンバー関数とは?基本から使い方まで解説
C++におけるconstメンバー関数とは、クラス内でconstキーワードを付けて宣言されたメンバー関数のことです。この種の関数は、呼び出し元のオブジェクトの状態(メンバー変数)を一切変更できません。オブジェクトに対する意図しない変更やバグを防ぐために、値を返すだけのゲッター関数などには積極的にconstを付けることが推奨されています。constメンバー関数の重要なルールconstメンバー関数:constオブジェクト・非constオブジェクトのどちらからでも呼び出せます。非constメンバー関数:非constオブジェクトからのみ呼び出せます。constオブジェクトからは呼び出せません。構文戻り値
-
C++のswap()関数とは?2つの変数の値を入れ替える方法をサンプルコード付きで解説
swap()関数とは C++のswap()関数は、2つの値を入れ替える(交換する)ための関数です。この関数を利用すれば、一時的な第三の変数を自分で用意することなく、2つの変数の値を簡単に入れ替えることができます。 swap()関数の構文 void swap(int variable_name1, int variable_name2); 変数に値を代入してswap()関数に渡した場合、関数内では値の入れ替えが行われますが、呼び出し元の実際の変数の値は変わりません。これは、引数が「値渡し」で渡されるためです。実際の変数の値を入れ替えたい場合は、後述する「参照渡し」を使用します。 例1:s