C++の関数ポインタのデフォルト値は何ですか? (どうやらそれはありえないのでNULL
、それは何ですか?)
このプログラムはどのように動作するはずで、その理由は何ですか?
struct S { void (*f)(); };
int main()
{
S s = S();
s.f(); // What is the value of s.f?
}
C++の関数ポインタのデフォルト値は何ですか? (どうやらそれはありえないのでNULL
、それは何ですか?)
このプログラムはどのように動作するはずで、その理由は何ですか?
struct S { void (*f)(); };
int main()
{
S s = S();
s.f(); // What is the value of s.f?
}
あなたの場合、オブジェクトs
はゼロで初期化されています。つまり、関数ポインターはNULL
.
struct S { void (*f)(); };
int main()
{
S s = S();
if ( s.f == NULL)
std::cout << "s.f is NULL" << std::endl;
}
出力:
s.f is NULL
関数ポインタは NULL にすることができます。これにより、何も指していないことを示すことができます!
関数ポインタは NULL にすることができ、それに NULL を割り当てることができます。たとえば、ここを見てください:
#include <iostream>
using namespace std;
struct S { void (*f)(); };
int main()
{
S s = S();
s.f = NULL;
return 0;
}
構造体のコンストラクター( with )を呼び出す方法では()
、 f が NULL になると思います。
C++ (および C) では、ポインター (型に関係なく)自体に既定値はありません。彼らは、その時点で記憶に残っていることをすべて取り上げます。ただし、デフォルトの初期化値はNULL
です。
コンストラクターを明示的に定義しない場合、C++ は各メンバー変数で既定の初期化子を呼び出し、へのポインターを初期化します0
。ただし、コンストラクターを定義しても、ポインターの値を設定しない場合、既定値はありません。動作は整数、浮動小数点数、倍精度浮動小数点数の場合と同じです。
さておき
int main()
{
S s = S();
s.f(); // <-- This is calling `f`, not getting the pointer value.
}