Я хочу инициализировать все члены массива в ноль, или 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
здесь не используется?
Есть ли разница между этими способами инициализации массива C в C ++?
Нет. Они семантически эквивалентны.
нулевая инициализация, в отличие от инициализации по умолчанию, но так же и int list [4] {0}, не так ли?
Первый элемент инициализируется копией с нуля. Остальные элементы инициализируются значением, которое для int
действительно нулевая инициализация. Там нет никакой разницы в значении, нуля и копирования инициализации с нуля, особенно в случае int
в частности. Различие в этом случае синтаксическое.
Это включает в себя std :: initializer_list за кулисами или нет?
std::initializer_list
не участвует.
Не используйте указатель для хранения массива в 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
, Надеюсь, что это ответ на ваш вопрос.