Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C+;中函数指针的默认值+; C++中函数指针的默认值是什么?(显然,它不能是NULL,那么它是什么?)_C++_Function Pointers - Fatal编程技术网

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

C+;中函数指针的默认值+; C++中函数指针的默认值是什么?(显然,它不能是NULL,那么它是什么?),c++,function-pointers,C++,Function Pointers,这个程序应该如何运行,为什么 struct S { void (*f)(); }; int main() { S s = S(); s.f(); // What is the value of s.f? } 在C++(和C)中,指针(不管类型)本身没有默认值;他们拿走了当时记忆中的东西。但是,它们的默认初始化值为NULL struct S { void (*f)(); }; int main() { S s = S(); if ( s.f == NULL

这个程序应该如何运行,为什么

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

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

在C++(和C)中,指针(不管类型)本身没有默认值;他们拿走了当时记忆中的东西。但是,它们的默认初始化值为

NULL

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

int main()
{
    S s = S();
    if ( s.f == NULL)
       std::cout << "s.f is NULL" << std::endl;
}
默认初始化

当您没有显式定义构造函数时,C++将调用每个成员变量上的默认初始化器,它将初始化指针到<代码> 0 < /C>。但是,如果您定义了构造函数,但未设置指针的值,则它没有默认值。整数、浮点数和double的行为是相同的

旁白

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

s、 函数指针可以为空,这样你就可以表明它们没有指向任何东西!

在你的例子中,对象
s
初始化为零,这意味着函数指针
NULL

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

int main()
{
    S s = S();
    if ( s.f == NULL)
       std::cout << "s.f is NULL" << std::endl;
}

.

函数指针可以为NULL,您可以为其指定NULL。请查看以下示例:

#include <iostream>

using namespace std;

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

int main()
{
    S s = S();
    s.f = NULL;
    return 0;
}
#包括
使用名称空间std;
结构S{void(*f)(;};
int main()
{
S=S();
s、 f=零;
返回0;
}
我相信你调用结构构造函数的方式(使用
()
)f将是空的。

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

C++11第8.5节,第10页

初始值设定项为空括号集的对象,即(),应为值初始化的对象

这一点很重要,因为您的声明包括:

S s = S();
根据值初始化的定义:

C++11§8.5,第7页

初始化T类型对象的值意味着:

  • 如果T是一个(可能是cv限定的)类类型(第9条),具有用户提供的构造函数(12.1),则调用T的默认构造函数(如果T没有可访问的默认构造函数,则初始化是错误的)

  • 如果T是一个(可能是cv限定的)非联合类类型,没有用户提供的构造函数,那么对象是零初始化的,如果T隐式声明的默认构造函数是非平凡的,则调用该构造函数

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

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

这就引出了零初始化对象类型的含义:

C++11第8.5节第5节

将类型为T的对象或引用初始化为零意味着:

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

  • 如果T是(可能是cv限定的)非并集类类型,每个非静态数据成员和每个基类子对象初始化为零,填充初始化为零位

  • 如果T是(可能是cv限定的)联合类型,则对象的第一个非静态命名数据成员被初始化为零,填充被初始化为零位

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

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

103)如4.10所述,将值为0的整型常量表达式转换为指针类型会导致空指针值

后者是指针为空的原因。给定相同代码的标准不会保证为空,但将
s
的声明更改为:

S s;
给出如上所述的声明后,标准将采用不同的路径:

C++11第8.5节,第11页

如果未为对象指定初始值设定项,则对象为默认初始化对象;如果未执行初始化,则具有自动或动态存储持续时间的对象具有不确定值。[注:具有静态或线程存储持续时间的对象为零初始化,请参阅3.6.2

这就引出了最后一个问题,什么是默认初始化:

C++11§8.5,第6页

默认初始化T类型的对象意味着:

  • 如果T是(可能是cv限定的)类类型(第9条),则调用T的默认构造函数(如果T没有可访问的默认构造函数,则初始化是错误的)

  • 如果T是数组类型,则每个元素默认初始化

  • 否则,不执行初始化


(显然它不能是
NULL
,…).为什么?@Mehrdad:是的,你错了。@Angew:Hmm…任何指针?那么你的意思是即使是成员函数指针也可以为null吗?@Mehrdad可能是在指针为null时处理了角情况?即当指针指向no function时调用默认处理程序。@Angew宏
null
不能定义为
((void*)0的原因<代码>是因为C++标准称它不能。<代码> 0代码>代码>类型<代码> int >代码>,除特殊的措辞外,不能被分配给任何指针。<代码>((空缺*)0)<代码> >代码>空白> */COD>,除C标准中的特殊措辞外,不能在C.中指定函数指针,这两种标准都包含特殊语言,允许空指针常量中断类型系统。C++使用传统定义;由于某种原因,C委员会将合法类型扩展为空指针。常量。哈?我想如果我说
struct P{void*P;};P P=P();
那么
P.P
必须是
NULL
,不是吗?@Mehrdad我会试试t