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

时间:2011-07-01 07:39:45

标签: c++ arrays static initialization

当我运行静态代码分析器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()和顺序   初始化未指定。   依赖于秩序   初始化可能会导致对象   在它们被使用之前被使用   初始化。如果抛出异常   作为初始化的结果   程序将使用非本地对象   立即终止。

     

使用static阻止范围对象   存储持续时间将被初始化   首次调用函数时。   因此,最好使用   单例模式而不是命名空间   对象和静态数据成员。这个   需要将对象包装在一个   作为本地静态对象,和   让函数返回引用   这个对象。

2 个答案:

答案 0 :(得分:3)

是的,这是一个标准规则。数组是一个聚合。聚合标准中明确提到了初始化规则。

  

这句话是:A * ap [5] = {}   使用NULL初始化5个指针?

  

当我使用A * ap [5] = {NULL}

时,QACPP会向我发出警告

什么警告?也许警告是你只初始化了第一个元素,其他元素将保持为NULL。当然,它可能是你需要的。但是,编译器只是警告你:)

我认为这个问题和答案会非常有趣。 What are Aggregates and PODs and how/why are they special?

答案 1 :(得分:0)

恕我直言,指出它也是内置类型,所以语句A* ap[5] = {NULL}没问题。