【问题标题】:Regarding empty initialisation of static array of class types关于类类型的静态数组的空初始化
【发布时间】:2011-09-26 13:32:49
【问题描述】:

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

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

【问题讨论】:

标签: c++ arrays static initialization


【解决方案1】:

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

此语句是否:A* ap[5] = {} 用 NULL 初始化 5 个指针?

是的

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

时,QACPP 向我发出警告

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

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

【讨论】:

  • 谢谢阿门。我打算尽快完整阅读该链接,但我需要尽快了解一件事。如果我描述的指针数组是一个静态数组,它还会在这个语句上初始化吗?使用 {NULL} 时,QACPP 警告说“此非本地聚合将在运行时初始化”。建议的解决方案继续说“依次使用单例类实例”。但是,如果我用空括号 {} 而不是 {NULL} 初始化数组,警告就会消失。因此,它是否真的被初始化了(因为它是静态的,这是至关重要的)。
  • @kiki:您可以放心,所有内容都将使用 NULL 进行初始化。我不知道单例与聚合的初始化有什么关系......哦,等等,我知道 - 什么都没有:)
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-31
    • 2020-04-14
    • 2011-02-26
    • 1970-01-01
    相关资源
    最近更新 更多