考虑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上找到了zero initialization页面,但是因为我正在学习c ++而且我仍然非常缺乏经验,所以我无法理解这是否适用于我的情况。我也尝试通过打印它们的值来测试指针而不分配任何函数地址并获得0 0 0 0 0
,但我不认为结果是可靠的:这个程序是针对微控制器的,而且可能是“垃圾“堆栈上的值都是0
,因为它在每次代码上传期间都被清空了。
答案 0 :(得分:1)
我不认为您必须初始化阵列,尽管我鼓励您这样做。在您的情况下对数组进行默认初始化的原因是因为您提供了构造函数,并且未在初始化列表中提及数据成员(参见cppreference/default initialization):
默认初始化在以下三种情况下执行:
...
3)当a中没有提到基类或非静态数据成员时 构造函数初始化列表和该构造函数被调用。
因此,将进行默认初始化。
无论如何,为了表示你依赖数据成员是&#34;零&#34;如果不以其他方式强制执行未初始化的条目,我就会明确初始化,例如
class myClass {
myClass();
void (* myFunctions [5])() = { };
}