c ++ 11 — Есть ли разница между этими способами инициализации массива C в C ++?

Я хочу инициализировать все члены массива в ноль, или nullptr

struct Window{ int a;};int main()
{
Window* list[4] = { 0, 0, 0, 0 };
Window* list2[4] = {0};
Window* list3[4] = {};
Window* list4[4]{ 0, 0, 0, 0 };
Window* list5[4]{0};
Window* list6[4]{};
}

Я понимаю, что при инициализации хотя бы одного члена любым значением все остальные инициализируются нулями, так что если я сделаю:

int list[4] = { 6 };

Первый член становится 6 а все остальные инициализируются нулями. Я смущен однако с:

int list[4]{0};

а также

int list[4]{};

Я предполагаю, что пустые волнистые скобки сразу после объявления без знака равенства — это то, что называется нулевой инициализацией, в отличие от инициализации по умолчанию, но также int list[4]{0}не так ли? Включает ли это std::initializer_list за кадром или нет? Я думал, что они были использованы только для типов не POD, поэтому std::initializer_list здесь не используется?

6

Решение

Есть ли разница между этими способами инициализации массива C в C ++?

Нет. Они семантически эквивалентны.

нулевая инициализация, в отличие от инициализации по умолчанию, но так же и int list [4] {0}, не так ли?

Первый элемент инициализируется копией с нуля. Остальные элементы инициализируются значением, которое для int действительно нулевая инициализация. Там нет никакой разницы в значении, нуля и копирования инициализации с нуля, особенно в случае int в частности. Различие в этом случае синтаксическое.

Это включает в себя std :: initializer_list за кулисами или нет?

std::initializer_list не участвует.

3

Другие решения

Не используйте указатель для хранения массива в C ++, он слишком стилизован под C 🙂

Вместо этого используйте контейнер. Я всегда придерживаюсь vector сделать массив объектов общего назначения. Инициализация вектора будет следовать за конструктором класса. Позвольте мне изменить ваш Window класс немного.

struct Window {
// Class constructor
Window(const int _a_) {
a = _a_;
}

// Class member
int a;
};

std::vector<Window> windows (4, Window(0));

Ваши окна будут содержать 4 Window с нулевым начальным значением a, Надеюсь, что это ответ на ваш вопрос.

0

По вопросам рекламы [email protected]