函数指针数组初始化

Function Pointer Array Initialization

本文关键字:初始化 数组 指针 函数      更新时间:2023-10-16

考虑 c++14 中类中的函数指针数组:

class myClass {
myClass();
void (* myFunctions [5])();
}

此数组将填充在代码的其他部分中,并且不能保证该数组实际上将包含尽可能多的函数指针(示例中为 5)。因此,在调用数组引用的任何函数之前,我需要检查我尝试使用的指针是否确实存储了一些东西。我的想法是将指针与nullptr进行比较,并假设如果测试失败,即在该类的某个函数中,它指向一个有效的函数:

if(myFunctions[x] == nullptr) {
// Handle error
return;
}
// Use myFunctions[x]

我想知道在进行这种猜测之前是否需要初始化数组。如果我只写上面两行代码,这个数组是如何初始化的?在这种情况下,我可以假设像myFunctions[x] == nullptr这样的事情是正确的吗?还是我需要像下面这样进行显式初始化?

for(int i = 0; i < dimension; i++)
myFunctions[i] = nullptr;

我在 cppreference.com 上找到了零初始化页面,但是当我学习c ++并且我仍然非常缺乏经验时,我无法理解这是否适用于我的情况。我还尝试通过打印指针的值来测试指针而不分配任何函数地址并得到0 0 0 0 0,但我认为结果不可靠:该程序适用于微控制器,堆栈上的"垃圾"值可能都是0的,因为它在每次代码上传期间都被清空了。

我不认为你必须初始化数组,尽管我鼓励你这样做。在您的情况下,数组默认初始化的原因是您提供了一个构造函数,并且没有在初始值设定项列表中提及数据成员(参见 cpp首选项/默认初始化):

默认初始化在三种情况下执行:

3) 当基类或非静态数据成员未在 构造函数初始值设定项列表,并调用该构造函数。

因此,将进行默认初始化。

无论如何,为了表达您依赖数据成员为"零"而不以其他方式强制执行无法访问未初始化的条目,我会明确初始化,例如

class myClass {
myClass();
void (* myFunctions [5])() = { };
}