Когда использовать указатели, а когда их не использовать
в настоящее время я делаю свой первый реальный проект на C++ и поэтому, довольно новый для указателей. Я знаю, что это такое, и прочитал некоторые основные правила использования. Вероятно, недостаточно, так как я все еще не понимаю, когда их использовать, а когда нет.
проблема в том, что в большинстве мест просто упоминается, что большинство людей либо злоупотребляют ими, либо злоупотребляют ими. Мой вопрос:когда их использовать, а когда нет?.
В настоящее время во многих случаях я спрашиваю себя, Должен ли я использовать указатель здесь или просто передайте переменную самой функции.
например, я знаю, что вы можете отправить указатель на функцию, чтобы функция могла фактически изменить саму переменную вместо ее копии. Но когда вам просто нужно получить некоторую информацию об объекте один раз (например, методу нужно что-то getValue ()), являются ли указатели полезными в этом случае?
Я хотел бы видеть либо реакции, но и ссылки, которые могут быть полезными. Так как это мой первый время использования C++ у меня еще нет хорошей книги на C++ (я думал о покупке, если я продолжу использовать c++, что, вероятно, будет).
9 ответов
для дел и не из C++:
эффективный C++ и более эффективный C++ Скотта Мейерса.
указатели (и ссылки):
- используйте pass by value, если тип вписывается в 4 байта и не хочет, чтобы он был изменен после возврата вызова.
- используйте pass по ссылке на const, если тип больше, и вы не хотите, чтобы он был изменен после возврата вызова.
- используйте pass by reference если параметр не может быть NULL
- использовать указатель в противном случае.
Не используйте необработанные указатели, если вам это не нужно. Большую часть времени умный указатель (см. Boost) является лучшим вариантом.
с в C++ часто задаваемые вопросы:
Используйте ссылки, когда можете, и указатели, когда нужно.
1) я предпочитаю использовать переменные уровня класса. Они построены в инициализаторе класса, и мне не нужно беспокоиться о указателях.
2) Вы можете пройти по ссылке на функцию и не беспокоиться о передаче указателей. Это эффективно передаст указатель на метод / функцию, которые можно использовать, как если бы вы передали класс, но без накладных расходов на копирование самого класса.
3) Если мне нужно контролировать время жизни объекта, который независимо от классов архитектуры моего основного приложения... затем я буду использовать auto_ptr из STL для автоматической обработки уничтожения указателя, когда никто больше не ссылается на него. Проверьте это - это путь.
использовать его, когда вы имеете дело с выделенной памятью или передача аргументов по ссылке на метод, я не думаю, что есть правило не использовать указатели.
мои правила:
- всегда передайте параметры функции как ссылки const,
- если они не являются встроенными типами, в этом случае они копируются (и const / non-const становится вопросом стиля, поскольку вызывающий абонент не затрагивается) или
- если они не предназначены для изменения внутри функции, чтобы изменения отражались на вызывающем абоненте, и в этом случае они передаются по ссылке non-const или
- если функция должна вызываться даже если у вызывающих абонентов нет объекта для передачи, они передаются как указатели, чтобы вызывающие могли передать
NULL
указатели вместо этого (применить #1 и #3, чтобы решить, следует ли передать заconst T*
илиT*
)
потоки всегда должны быть передан как не-const ссылки.
обычно, когда вы можете использовать ссылки вместо указателей, это хорошая идея. Ссылка должна иметь цель (без нарушений нулевого указателя), они позволяют ту же семантику, что и указатели при передаче в качестве аргументов функции, и они, как правило, лучше использовать для начинающих (или тех, кто не приходит из фона C).
указатели необходимы, когда вы хотите сделать динамическое распределение памяти; когда вам нужно иметь дело с неизвестным количеством вещей, которые будут позже указанный. В этом случае интерфейс для доступа к памяти через new
и delete
в указатели.
моя философия-всегда передавать по значению, если вам не нужно изменять переданную переменную или копировать объект дорого. В обоих случаях сначала рассмотрите возможность использования ссылки вместо указателя: если вам не нужно изменять объект, на который вы ссылаетесь, и вам не нужно возможное экстремальное значение (нулевой указатель), вы можете использовать ссылку.
Не забывайте и об итераторах.
все хорошие ответы выше. Кроме того, если вы выполняете некоторую работу с процессором, важно понимать, что разыменование указателя, вероятно, будет пропуском кэша на вашем процессоре. Это хорошая идея, чтобы сохранить ваши данные доступными с минимальными указатель разыменовывает.
- атрибут класса: указатель
- переменные, объявленные в методах: нет указателей, поэтому мы избегаем утечек памяти.
таким образом, предотвратите утечки памяти и согласованность атрибута controlle.
Salu2.