Когда использовать указатели, а когда не использовать их - PullRequest
9 голосов
/ 25 августа 2009

В настоящее время я делаю свой первый настоящий проект на C ++, и поэтому довольно плохо знаком с указателями. Я знаю, что это такое, и прочитал некоторые основные правила использования. Наверное, недостаточно, так как я до сих пор не понимаю, когда их использовать, а когда нет.

Проблема в том, что в большинстве мест просто упоминается, что большинство людей либо злоупотребляют ими, либо недооценивают их. У меня вопрос, когда их использовать, а когда нет? .

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

Например, я знаю, что вы можете отправить указатель на функцию, чтобы функция могла фактически изменить саму переменную вместо ее копии. Но когда вам просто нужно получить некоторую информацию об объекте один раз (например, метод нуждается в getValue () что-то), полезны ли указатели в этом случае?

Мне бы очень хотелось увидеть обе реакции, но также ссылки, которые могут быть полезны. Поскольку я впервые использую C ++, у меня пока нет хорошей книги по C ++ (я думал о ее покупке, если я продолжу использовать c ++, что, вероятно, у меня будет).

Ответы [ 9 ]

19 голосов
/ 25 августа 2009

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

Эффективный C ++ и более эффективный C ++. Автор Scott Meyers.

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

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

Не используйте сырые указатели, если вам это не нужно. В большинстве случаев лучше использовать интеллектуальный указатель (см. Повышение ).

7 голосов
/ 25 августа 2009

Из c ++ часто задаваемых вопросов :

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

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

4 голосов
/ 25 августа 2009

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

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

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

2 голосов
/ 25 августа 2009

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

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

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

2 голосов
/ 25 августа 2009

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

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

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

Salu2.

0 голосов
/ 25 августа 2009

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

0 голосов
/ 25 августа 2009

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

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

0 голосов
/ 25 августа 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...