Чем отличается новый _Elem [_Size] () от нового _Elem [_Size] {}?

Другое событие NullPointerException возникает, когда объявляется массив объектов, а затем сразу же пытается разыменовать его внутри.

String[] phrases = new String[10];
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

Этот конкретный NPE можно избежать, если порядок сравнения отменяется ; а именно, использовать .equals для гарантированного непустого объекта.

Все элементы внутри массива инициализируются их общим начальным значением ; для любого типа массива объектов, это означает, что все элементы null.

Вы должны инициализировать элементы в массиве перед доступом или разыменованием их.

String[] phrases = new String[] {"The bird", "A bird", "My bird", "Bird"};
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

0
задан darune 11 April 2019 в 09:29
поделиться

2 ответа

Нет никакой разницы между ними.

За исключением {}, он не работает в C ++ 98.

0
ответ дан HolyBlackCat 11 April 2019 в 09:29
поделиться

В C ++ {} используется для предоставления объекту значения инициализации и применяется с C ++ 03.

Вот некоторая полезная информация об инициализации значения:
https://en.cppreference.com/w/cpp/language/value_initialization
и форум пост, задающий очень похожий вопрос с хорошим ответом пользователя Alok Save:
Что означает «инициализация значения» чего-либо?

Что вы должны использовать, зависит от что вы будете делать с объектом, и принимают ли его конструкторы инициализацию значения. После C ++ 03, если создается массив объектов, и вы помещаете данные в {} и конструктор объекта принимает инициализацию значения, каждый элемент массива будет инициализирован значением, но если вы просто поместите {}, массив будет инициализироваться нулями, если это поддерживается.
Например, вот несколько способов инициализации массива целых чисел:

Для value-initialize список делает это:
int* intArray = new int[5]{1, 2, 3, 4, 5};
И список будет инициализирован так:
1, 2, 3, 4, 5

Но если вы попытаетесь инициализировать список следующим образом:
int* intArray = new int[5]{1};
В итоге вы получите:
1, 0, 0, 0, 0
Это потому, что для целочисленных массивов ожидается значение инициализатора для каждого элемента.

Также обратите внимание, что при использовании конструктора по умолчанию список вообще не инициализируется (во всяком случае, для целочисленных списков), поэтому это:
int* intArray = new int[5];
Результатом будет каждый элемент сохранение любого значения, которое уже находится в этой ячейке памяти, например:
16256696, 16253120, 0, 0, -1543503708
Если первое, что вы планируете сделать, это заполнить массив данными из вашей программы, это быстрее и более эффективный, поскольку вам не нужно устанавливать данные в каждой ячейке памяти дважды. Однако, как указано в комментариях, это в конечном итоге означает, что данные в вашем массиве БУДУТ непредсказуемыми, поэтому вы должны быть уверены, что заполняете весь массив как можно скорее, чтобы предотвратить возможные ошибки.

В качестве альтернативы, если вы хотите, чтобы эти данные были инициализированы нулями , вы должны сделать следующее:
int* intArray = new int[5]{};
И список qill будет инициализирован as:
0, 0, 0, 0, 0

Однако нет гарантии, что это будет то же самое для типа данных _Elem, поэтому я бы рекомендовал провести некоторое тестирование, подобное тому, что я сделал здесь выяснить, что наиболее актуально для вас.

0
ответ дан NathanielJS 11 April 2019 в 09:29
поделиться
Другие вопросы по тегам:

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