Указатель по сравнению со ссылкой

Другое событие 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));
}

249
задан Robert Harvey 27 April 2015 в 08:43
поделиться

8 ответов

Мое эмпирическое правило:

указатели Использования, если Вы хотите сделать адресную арифметику с указателями с ними (например, постепенное увеличение адреса указателя для продвижения через массив) или если когда-нибудь необходимо передавать Нулевого указателя.

ссылки Использования иначе.

278
ответ дан aaronsnoswell 23 November 2019 в 02:59
поделиться

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

  1. Как во всех других местах, всегда быть const - корректен.

    • Примечание: Это означает, среди прочего, что только-оценивает (см. объект 3), и значения, переданные значением (см. объект 4), может недоставать const спецификатор.
  2. Только передают значение указателем, если значение 0/АННУЛИРОВАТЬ является допустимым входом в текущем контексте.

    • Объяснение 1: Как [1 128] вызывающая сторона , Вы видите, что независимо от того, что Вы передаете в , должен быть в применимом состоянии.

    • Объяснение 2: Как [1 129] названный , Вы знаете, что то независимо от того, что прибывает в , в применимом состоянии. Следовательно, никакая ПУСТАЯ проверка или обработка ошибок не должны быть сделаны для того значения.

    • Объяснение 3: Объяснения 1 и 2 будут , компилятор осуществил . Всегда фиксируйте ошибки во время компиляции, если Вы можете.

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

    • Объяснение: Мы не хотим повреждать объект 2...
  4. Выбирают "pass by value" по "передаче ссылкой константы", только если значение является POD ( Простой Datastructure) или достаточно маленький (мудрый памятью) или другими способами, достаточно дешевыми (мудрый временем) для копирования.

    • Объяснение: Избегайте ненужных копий.
    • Примечание: достаточно маленький и достаточно дешевый не абсолютный measurables.
71
ответ дан Community 23 November 2019 в 02:59
поделиться

Это в конечном счете заканчивает тем, что было субъективно. Обсуждение к настоящему времени полезно, но я не думаю, что существует корректный или решающий ответ на это. Много будет зависеть от инструкций по стилю и Ваших потребностей в то время.

, В то время как существуют некоторые различные возможности (действительно ли что-то может быть ПУСТЫМ) с указателем, самым большим практическим различием для выходного параметра является просто синтаксис. Руководство по стилю C++ Google ( https://google.github.io/styleguide/cppguide.html#Reference_Arguments), например, передает под мандат только указатели для выходных параметров и позволяет только ссылки, которые являются константой. Обоснование является одной из удобочитаемости: что-то с синтаксисом значения не должно иметь указателя семантическое значение. Я не предполагаю, что это обязательно правильно или неправильно, но я думаю, что точка здесь - то, что это - вопрос стиля, не правильности.

24
ответ дан Roland 23 November 2019 в 02:59
поделиться

Необходимо передать указатель, если Вы собираетесь изменить значение переменной. Даже при том, что технически передача ссылки или указателя является тем же, передавание указателя в Вашем варианте использования более читаемо, поскольку это "рекламирует" то, что значение будет изменено функцией.

7
ответ дан Max Caceres 23 November 2019 в 02:59
поделиться

Если у Вас есть параметр, где Вы, возможно, должны указать на отсутствие значения, это - обычная практика, чтобы сделать параметр значением указателя и передать в ПУСТОМ УКАЗАТЕЛЕ.

А лучшее решение в большинстве случаев (с точки зрения безопасности) состоит в том, чтобы использовать повышение:: дополнительный . Это позволяет Вам передавать в дополнительных значениях ссылкой и также как возвращаемое значение.

// Sample method using optional as input parameter
void PrintOptional(const boost::optional<std::string>& optional_str)
{
    if (optional_str)
    {
       cout << *optional_str << std::endl;
    }
    else
    {
       cout << "(no string)" << std::endl;
    }
}

// Sample method using optional as return value
boost::optional<int> ReturnOptional(bool return_nothing)
{
    if (return_nothing)
    {
       return boost::optional<int>();
    }

    return boost::optional<int>(42);
}
5
ответ дан Kiley Hykawy 23 November 2019 в 02:59
поделиться

Ссылка является неявным указателем. В основном можно изменить значение контрольные точки на, но Вы не можете изменить ссылку для указания на что-то еще. Так мои 2 цента то, что, если Вы только хотите измениться, значение параметра передает его как ссылку, но если необходимо изменить параметр для указания на различную объектную передачу на него с помощью указателя.

3
ответ дан 23 November 2019 в 02:59
поделиться

Считайте C# ключевым словом. Компилятор требует, чтобы вызывающая сторона метода подала заявку ключевое слово любому args, даже при том, что это уже знает, ли они. Это предназначается для улучшения удобочитаемости. Хотя с современными IDE я склонен думать, что это - задание для синтаксиса (или семантический) выделение.

3
ответ дан Daniel Earwicker 23 November 2019 в 02:59
поделиться

Передача ссылкой константы, если нет причина, Вы хотите измениться/сохранить содержание, в котором Вы являетесь передающими.

Это будет наиболее эффективным методом в большинстве случаев.

Удостоверяются, что Вы используете константу на каждом параметре, который Вы не хотите изменять, поскольку это не только защищает Вас от выполнения чего-то глупого в функции, это дает хороший признак другим пользователям, что функция делает к переданному в значениях. Это включает создание константы указателя, когда Вы только хотите изменить то, на что указывают...

2
ответ дан NotJarvis 23 November 2019 в 02:59
поделиться
Другие вопросы по тегам:

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