Интересным аспектом этого вопроса является то, что я чаще видел обратную перспективу: как в C ++ можно указывать указатель, который не может быть нулевым? Ответы сводятся к одним и тем же принципам.
Основные отличия указателя от ссылки:
- Можно сделать указатель для указания на другой объект.
- Указатель может быть нулевым.
Если вы сделаете указатель постоянным, первое отличие исчезнет. C ++ способ иметь «обнуляемую ссылку» - это иметь постоянный указатель. Обратите внимание, что я говорю о том, что указатель является константой, как в T * const
, который не зависит от константы указываемого объекта, как в T const *
или const T *
.
Вас, возможно, учили думать, что все указатели являются злом, но это чрезмерное обобщение. Необработанные указатели - хороший способ ссылаться на необязательные объекты , память которых вы не ответственны за . Если вы несете ответственность за освобождение памяти, используйте умный указатель, но если кто-то другой хранит память для вас, используйте ссылку или указатель. Используйте ссылку, если объект требуется (не может быть нулевым); указатель, если он необязательный (может быть нулевым). О, это предполагает, что вам не нужно менять, на какой объект указывает указатель, и в этом случае ссылка больше не будет опцией.
При этом могут быть альтернативы в конкретных контекстах. Если между нулевым и ненулевым случаями нет общего кода, может быть лучше иметь перегруженные функции, например, void foo(const std::string &)
и void foo()
. Это должно быть сбалансировано с различными компромиссами, включая согласованность API. Пойдите с тем, что лучше всего подходит для вашей ситуации.