关于类类型的静态数组的空初始化

Regarding empty initialisation of static array of class types

本文关键字:初始化 数组 静态 类型 于类      更新时间:2023-10-16

当我运行静态代码分析器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}很好。