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