6

C++の関数ポインタのデフォルト値は何ですか? (どうやらそれはありえないのでNULL、それは何ですか?)

このプログラムはどのように動作するはずで、その理由は何ですか?

struct S { void (*f)(); };

int main()
{
    S s = S();
    s.f();   // What is the value of s.f?
}
4

5 に答える 5

8

あなたの場合、オブジェクト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

オンラインデモ

于 2013-02-12T09:26:18.013 に答える
3

関数ポインタは NULL にすることができます。これにより、何も指していないことを示すことができます!

于 2013-02-12T09:25:53.587 に答える
3

関数ポインタは NULL にすることができ、それに NULL を割り当てることができます。たとえば、ここを見てください:

#include <iostream>

using namespace std;

struct S { void (*f)(); };

int main()
{
    S s = S();
    s.f = NULL;
    return 0;
}

構造体のコンストラクター( with )を呼び出す方法では()、 f が NULL になると思います。

于 2013-02-12T09:29:02.420 に答える
0

C++ (および C) では、ポインター (型に関係なく)自体に既定値はありません。彼らは、その時点で記憶に残っていることをすべて取り上げます。ただし、デフォルトの初期化値はNULLです。

デフォルトの初期化

コンストラクターを明示的に定義しない場合、C++ は各メンバー変数で既定の初期化子を呼び出し、へのポインターを初期化します0。ただし、コンストラクターを定義しても、ポインターの値を設定しない場合、既定値はありません。動作は整数、浮動小数点数、倍精度浮動小数点数の場合と同じです。

さておき

int main()
{
    S s = S();
    s.f();   // <-- This is calling `f`, not getting the pointer value.
}
于 2013-02-12T09:24:43.467 に答える