在C中的函数指针的默认值++(Default value of a function pointer

2019-07-19 18:07发布

什么是C ++中的函数指针的默认值? (显然,它不可能是NULL ,那么它是什么?)

这个程序应该是怎样的行为,为什么?

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

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

Answer 1:

在您的情况下,对象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

在线演示 。



Answer 2:

首先任何指针可以为空。 它是关于指针的一个普遍的真理。 这就是说,你的是空的,但不一定是原因,您可能想;

C ++ 11§8.5,P10

一个对象,其初始化为空集括号的,即,(,值初始化

这是重要的,因为你的声明中包含这样的:

S s = S();

通过初始化值的定义:

C ++ 11§8.5,P7

到的类型T是指值初始化的对象:

  • 如果T是一个(可能是CV-合格)类型(第9节)与用户提供的构造(12.1),然后对T中的默认构造函数被调用(并形成不良的初始化如果T没有可访问的缺省的构造) ;

  • 如果T是一个(可能CV修饰)非工会类没有用户提供的构造类型,则该对象是零初始化 ,并且如果T的隐式声明的缺省的构造是不平凡的,该构造函数被调用。

  • 如果T是一个数组类型,则每个元素是值初始化;

  • 否则,该对象被初始化为零。

这给我们带来了什么可以为您的对象类型是零初始化:

C ++ 11§8.5,P5

到零初始化对象或类型T表示的参考:

  • 如果T是一个标量类型(3.9),该对象被设置为值0(零),作为一个整体常量表达式,转换为T(103)

  • 如果T是一个(可能CV修饰)非工会类型, 每个非静态数据成员,并且每个基础类子对象是零初始化和填充被初始化为零比特;

  • 如果T是一个(可能是CV-合格)联合类型,对象的第一非静态命名的数据成员是零初始化并且填充被初始化为零比特;

  • 如果T是一个数组类型,每一个元素是零初始化;

  • 如果T是引用类型,则不执行初始化。

103)如在4.10指定,转换在一个空指针值整数表达式中,其值是0至指针类型的结果。

后者是你指针为空的原因。 它不会在标准中给出相同的代码得到保证,所以,但改变的声明s到这一点:

S s;

鉴于象上面的声明,一个不同的路径通过标准采取:

C ++ 11§8.5,P11

如果一个对象被指定没有初始化,对象是缺省初始化 ; 如果不进行初始化,具有自动或动态存储持续时间的对象具有不确定的值。 [注意:用静态或线程存储时限对象是零初始化,见3.6.2。

然后引出了最后一个问题,什么是默认的初始化

C ++ 11§8.5,P6

为默认值初始化类型的对象T表示:

  • 如果T是一个(可能是CV-合格)类型(第9节),T的默认构造函数被调用(和是形成不良的初始化如果T没有可访问的缺省的构造);

  • 如果T是一个数组类型,每一个元素是缺省初始化;

  • 否则,不进行初始化。



Answer 3:

A function pointer can be NULL and you may assign NULL to it. Have a look here for instance:

#include <iostream>

using namespace std;

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

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

I believe the way you call the constructor of the structure(with ()), f will be NULL.



Answer 4:

函数指针可以为空,这样就可以表明,他们不指向任何东西!



Answer 5:

在C ++(和C),指针(的类型无关)不具有默认值本身 ; 他们采取什么都恰好是在内存中的时间。 然而,他们确实有一个默认初始化值NULL

缺省初始化

当你没有明确定义构造函数,C ++会呼吁各成员变量的默认初始化器,这将初始化指向0 。 但是,如果你定义一个构造函数,但没有为指针的值,它不具有缺省值。 该行为是整数,浮点数和双打一样。

在旁边

int main()
{
    S s = S();
    s.f();   // <-- This is calling `f`, not getting the pointer value.
}


文章来源: Default value of a function pointer in C++