Когда использовать указатели, и если не использовать их

Это - идеальное использование Регулярных выражений. Выезд этот полезный веб-сайт , класс .Net Regular Expressions и эта очень полезная книга , Осваивающая Регулярные выражения .

9
задан bastijn 25 August 2009 в 12:24
поделиться

9 ответов

Что можно и чего нельзя делать в C ++:

«Эффективный C ++» и «Более эффективный C ++» Скотта Мейерса.

Для указателей (и ссылок):

  • используйте передачу по значению, если тип умещается в 4 байта и не хочет, чтобы он изменялся после возврата вызов.
  • используйте передачу по ссылке на const, если тип больше, и вы не хотите, чтобы он изменялся после возврата вызова.
  • используйте передачу по ссылке, если параметр не может быть NULL
  • в противном случае используйте указатель.

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

19
ответ дан 4 December 2019 в 06:49
поделиться

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

  1. Всегда передавайте параметры функции как константные ссылки,
  2. , если они не являются встроенными типами, и в этом случае они копируются (а константа / неконстантность становится вопросом стиля, поскольку вызывающий не является t) или
  3. , если только они не предназначены для изменения внутри функции, чтобы изменения отражались в вызывающей стороне, и в этом случае они передаются неконстантной ссылкой или
  4. , если функция не должна быть вызываемой, даже если вызывающие не имеют объекта для передачи, тогда они передаются как указатели,так что вызывающие абоненты могут вместо этого передавать указатели NULL (примените # 1 и # 3, чтобы решить, передавать ли через const T * или за T * )

Потоки всегда должны передаваться как неконстантные ссылки.

2
ответ дан 4 December 2019 в 06:49
поделиться

Из c ++ faq :

Используйте ссылки, когда можете, и указатели, когда вам нужно.

https://isocpp.org/wiki/faq/references#refs-vs-ptrs

7
ответ дан 4 December 2019 в 06:49
поделиться

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

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

3) Если мне нужно контролировать время жизни объекта, который не зависит от классов моей основной архитектуры приложения ... тогда я буду использовать auto_ptr из STL, чтобы автоматически обрабатывать уничтожение указателя, когда на него больше не ссылаются. Проверьте это - это правильный путь.

4
ответ дан 4 December 2019 в 06:49
поделиться

Используйте его всякий раз, когда вы имеете дело с выделенной памятью или передачей аргументов по ссылке на метод; Я не думаю, что существует правило не использовать указатели.

2
ответ дан 4 December 2019 в 06:49
поделиться

Обычно, когда вы можете использовать ссылки вместо указателей, это хорошая идея. Ссылка должна иметь цель (без нарушений NULL-указателя), они допускают ту же семантику, что и указатели, при передаче в качестве аргументов функции, и их, как правило, удобнее использовать для новичков (или тех, кто не работает с C).

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

0
ответ дан 4 December 2019 в 06:49
поделиться

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

Не забывайте и об итераторах.

0
ответ дан 4 December 2019 в 06:49
поделиться

Все хорошие ответы выше. Кроме того, если вы выполняете некоторую работу с интенсивным использованием процессора, важно понимать, что разыменование указателя, вероятно, приведет к пропуску кеша на вашем процессоре. Хорошая идея - сохранить доступ к вашим данным с минимальным разыменованием указателей.

0
ответ дан 4 December 2019 в 06:49
поделиться
  1. Атрибут класса: указатель
  2. Переменные, объявленные в методах: без указателей, поэтому мы избегаем утечек памяти.

Таким образом предотвращаются утечки памяти и контролируется согласованность атрибутов.

Salu2 .

0
ответ дан 4 December 2019 в 06:49
поделиться
Другие вопросы по тегам:

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