По поводу пустой инициализации статического массива типов классов - PullRequest
3 голосов
/ 01 июля 2011

Когда я запустил статический анализатор кода 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] = {}

инициализировать 5 указателей с помощью NULL?

QACPP выдает мне предупреждение, когда я использую A* ap[5] = {NULL}, хотя код компилируется и работает отлично даже в противном случае.


Дополнительный

Я думаю, что предупреждение было больше, потому что массив является статическим.

А вот объяснение, которое я нашел в документации:

Есть много проблем с использованием объектов со статическим хранилищем продолжительность, особенно заявленные вне функций. Если много функции могут получить доступ к статическому объекту эта ситуация может стать трудной поддерживать. Кроме того, в случае многопоточные приложения становится необходимо защитить мьютексом каждый статический объект, к которому можно получить доступ одновременно. Поэтому это хороший Идея ограничить объем статического объект как можно больше, так что Вы знаете, где находится такой объект доступ.

Пространство имен или объекты класса со статическим продолжительность хранения будет инициализирована в начале программы, до вызов main () и порядок инициализация не указана. Опора на порядок инициализация может привести к объектам используется, прежде чем они инициализирован. Если выдается исключение в результате инициализации нелокальный объект программа будет немедленно прекратить.

Блокировать объекты области видимости со статическим продолжительность хранения будет инициализирована когда функция впервые вызывается. Поэтому лучше всего использовать шаблон синглтона вместо пространства имен объекты и статические члены данных. это влечет за собой оборачивание объекта в функционировать как локальный статический объект, и имея функцию, возвращающую ссылку к этому объекту.

Ответы [ 2 ]

3 голосов
/ 01 июля 2011

Да, это стандартное правило.Массив является агрегатом.Правила инициализации явно упоминаются в стандарте для агрегатов.

Имеет ли это утверждение: A * ap [5] = {} инициализировать 5 указателей с NULL?

Да

QACPP выдает мне предупреждение, когда я использую A * ap [5] = {NULL}

Какое предупреждение?Возможно, предупреждение в том, что вы инициализировали только первый элемент, а остальные останутся пустыми.Конечно, это может быть то, что вам нужно.Но тогда компилятор просто предупреждает вас:)

Я думаю, этот вопрос и ответ будут очень интересными. Что такое агрегаты и POD и как / почему они особенные?

0 голосов
/ 01 июля 2011

ИМХО, указатели это тоже встроенные типы, так что оператор A* ap[5] = {NULL} в порядке.

...