Подтвердить что ты не робот

С++ Как вы устанавливаете массив указателей на нуль в списке инициализации, как?

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

Я не уверен, как это делается. Я слышал, что указатель установлен на NULL по умолчанию, хотя я не знаю, гарантировано ли это/в стандарте С++. Я также не уверен, что инициализация через нового оператора по сравнению с обычным распределением также может иметь значение.

Изменить: я хочу сделать это в списке инициализации файла заголовка/конструктора. Я не хочу помещать его в конструктор, и я не хочу использовать Vector.

4b9b3361

Ответ 1

Чтобы установить массив указателей на нули в списке инициализаторов конструктора, вы можете использовать инициализатор ()

struct S {
  int *a[100];

  S() : a() {
    // `a` contains null pointers 
  }
};

К сожалению, в текущей версии языка инициализатор () является единственным инициализатором, который вы можете использовать с членом массива в списке инициализатора конструктора. Но, по-видимому, это то, что вам нужно в вашем случае.

() оказывает такое же влияние на массивы, выделенные с помощью new[]

int **a = new int*[100]();
// `a[i]` contain null pointers 

В других контекстах вы можете использовать инициализатор агрегации {} для достижения того же эффекта

int *a[100] = {};
// `a` contains null pointers 

Обратите внимание, что нет необходимости сжимать 0 или NULL между {}. Пустая пара {} будет отлично работать.

Ответ 2

Вы можете переключиться с массива на std::vector и использовать

std::vector<T*> v(SIZE);

Значения будут автоматически инициализированы NULL. Это предпочтительный способ С++.


Обновление: с С++ 11 существует еще один способ: используя

std::array<T*, SIZE> array = {};

Это ведет себя скорее как исправленная версия массива C-стиля (в частности, избегает динамических распределений), переносит свой размер и не распадается на указатель. Размер, однако, должен быть известен во время компиляции.

Ответ 3

Обычно массив не инициализируется по умолчанию, но если вы инициализируете один или несколько элементов явно, то любые оставшиеся элементы будут автоматически инициализированы на 0. Так как 0 и NULL эквивалентны, вы можете поэтому инициализировать массив указателей на NULL следующим образом:

float * foo[42] = { NULL }; // init array of pointers to NULL

Ответ 4

Я не уверен, как это делается. Я слышал, что указатель установлен на NULL по умолчанию, хотя я не знаю, гарантировано ли это/в стандарте С++.
Это не гарантируется стандартом С++. Встроенные типы (например, указатели) заполняются мусором, если не установлено иное.

Я также не уверен, что инициализация с помощью нового оператора по сравнению с обычным распределением также может иметь значение.
Что вы подразумеваете под "нормальным распределением"? Если вы говорите об автоматической переменной, вы можете сделать это:

MyType * pointers[2] = {}

и указатели должны быть инициализированы в NULL.

Ответ 5

void* p[10] = { 0 };

Ответ 6

Если у вас есть массив-член, тогда нет возможности инициализировать, если это не статический член. Если массив не является статическим членом, вам придется заполнить его внутри тела конструктора.

Тем не менее, скорее всего, вам действительно лучше использовать std::vector. Помимо технических причин, таких как отсутствие стандартного STL для вашей платформы или немного меньшая производительность, std::vector лучше, чем массив по любым критериям. Если производительность является проблемой, убедитесь, что вы профилировали и знаете по номерам, что это проблема.