关于类类型的静态数组的空初始化
Regarding empty initialisation of static array of class types
当我运行静态代码分析器QACPP时,我收到了一个警告。根据QACPP文档,使用{0}
初始化仅适用于内置类型。若要初始化类型为A
的对象数组,必须使用{}
。如下:
int i[5] = {0}; // Only works with built-in types.
A a[5] = {}; // OK, works with both built-in and class types
这是标准的C++规则吗?根据这一点,指向类类型的指针数组也必须用{}
初始化,对吧?
是否声明:
A* ap[5] = {}
用NULL
初始化5个指针?
当我使用A* ap[5] = {NULL}
时,QACPP会给我一个警告,尽管代码编译和工作非常完美,即使在其他情况下也是如此。
附加
我认为警告更多的是因为数组是静态的。
这是我在文档中找到的解释:
使用时有很多问题具有静态存储的对象的持续时间,特别是那些宣布的功能之外。如果很多函数可以访问静态对象这种情况可能会变得很难维持此外,在它变成了多线程应用程序每个都需要使用互斥锁进行保护可以访问的静态对象同时因此,这是一个好限制静态范围的想法对象,以便你知道这样的物体在哪里吗已访问。
具有静态的命名空间或类对象存储持续时间将被初始化在程序开始时调用main((,以及初始化未指定。依赖的顺序初始化可能导致对象在使用之前已初始化。如果引发异常由于初始化程序将使用的非本地对象立即终止。
用静态阻止作用域对象存储持续时间将被初始化当首次调用函数时。因此,最好使用singleton模式而不是命名空间对象和静态数据成员。这需要将对象包裹在用作本地静态对象,以及让函数返回引用到该对象。
是的,这是一条标准规则。数组是一个聚合。聚合标准中明确提到了初始化规则。
是否执行以下语句:A*ap[5]={}用NULL初始化5个指针?
是
当我使用a*ap[5]={NULL}时,QACPP向我发出警告
什么警告?也许警告是您只初始化了第一个元素,其他元素将保持为NULL。当然,这可能正是你所需要的。但是,编译器只是警告您:(
我觉得这个问题和答案会很有趣。什么是聚合和POD,它们是如何/为什么特别的?
IMHO,指针也是内置类型,所以语句A* ap[5] = {NULL}
很好。
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- 在函数内部的声明中初始化数组,并在外部使用它
- 为什么用结构初始化数组需要指定结构名称
- 有没有一种代码密度较低的方法来使用非默认构造函数初始化数组?
- C++使用另一个数组和新值初始化数组
- 初始化数组、"memset"或" {//value} "的最佳方法是什么?
- 在 constexpr 构造函数中初始化数组是否合法?
- 我可以初始化 const 实例,以便我可以将其用作 const 来初始化数组吗?
- 在构造函数中初始化数组
- 是否可以使用函数返回的值初始化数组
- 使用宏使用额外元素初始化数组
- 在循环中显示不同值的初始化数组
- 如何在macOS中的旧扩展clang和gcc编译器中初始化数组和向量
- 使用可变模板列表初始化数组,并放置new
- 使用函数从 Visual Studio 2017 中的 main 创建和初始化数组
- 使用 c++ 中的函数初始化数组
- 这是使用构造函数初始化数组对象的最佳方法吗?
- C++ 使用变量而不是常量表达式初始化数组
- 在初始化列表中初始化数组的更好方法
- 在可变参数模板类中初始化数组