函数指针数组初始化
Function Pointer Array Initialization
考虑 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])() = { };
}
相关文章:
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- 在函数内部的声明中初始化数组,并在外部使用它
- 为什么用结构初始化数组需要指定结构名称
- 有没有一种代码密度较低的方法来使用非默认构造函数初始化数组?
- C++使用另一个数组和新值初始化数组
- 初始化数组、"memset"或" {//value} "的最佳方法是什么?
- 在 constexpr 构造函数中初始化数组是否合法?
- 我可以初始化 const 实例,以便我可以将其用作 const 来初始化数组吗?
- 在构造函数中初始化数组
- 是否可以使用函数返回的值初始化数组
- 使用宏使用额外元素初始化数组
- 在循环中显示不同值的初始化数组
- 如何在macOS中的旧扩展clang和gcc编译器中初始化数组和向量
- 使用可变模板列表初始化数组,并放置new
- 使用函数从 Visual Studio 2017 中的 main 创建和初始化数组
- 使用 c++ 中的函数初始化数组
- 这是使用构造函数初始化数组对象的最佳方法吗?
- C++ 使用变量而不是常量表达式初始化数组
- 在初始化列表中初始化数组的更好方法
- 在可变参数模板类中初始化数组