C++, Как Вы устанавливаете массив в NULL указателей в списке инициализатора как путь?

HTML datepicker () поддерживает атрибут min / max, но не поддерживается широко .

Тем временем вы можете рассмотреть возможность использования bootstrap-datepicker , v1.2.0 включен в github .

Ссылки:

Спецификация W3C

27
задан user233320 10 April 2010 в 21:42
поделиться

6 ответов

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

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 между {}. Пустая пара из {} будет в порядке.

40
ответ дан AnT 28 November 2019 в 05:06
поделиться

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

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

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


Обновление: начиная с C ++ 11, есть еще один способ: использование

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

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

6
ответ дан Vlad 28 November 2019 в 05:06
поделиться

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

float * foo[42] = { NULL }; // init array of pointers to NULL
4
ответ дан Paul R 28 November 2019 в 05:06
поделиться

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

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

MyType * pointers[2] = {}

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

2
ответ дан Billy ONeal 28 November 2019 в 05:06
поделиться
void* p[10] = { 0 };
0
ответ дан Johan Kotlinski 28 November 2019 в 05:06
поделиться

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

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

-1
ответ дан 28 November 2019 в 05:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: