Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Общие вопросы > передача параметров |
Автор: itan 21.9.2006, 09:50 |
Добрый день! У кого какие соображения по поводу того, когда лучше использовать передачу параметра по ссылке, а когда по указателю ? Т.к. особой разницы между этими двумя подходами нет, то может существует какой-нибудь хороший стиль написания ? Например, я вижу различие, только в том, что ссылка, в отличие от указателя не может быть NULL, поэтому те параметры (объекты), существование которых обязательно, должны всегда передаваться по ссылке. Еще что-нибудь? |
Автор: Damarus 21.9.2006, 10:11 |
ИМХО, передавать по указателю надо только тогда, когда нет другого выхода. Во всех остальных случаях - по ссылке. |
Автор: Romikgy 21.9.2006, 10:13 |
все зависит от того что передаешь! |
Автор: Damarus 21.9.2006, 10:17 |
И какая разница ![]() |
Автор: vinter 21.9.2006, 10:29 | ||||
ИМХО по ссылке удобнее при передаче по ссылке, переменную внутри ф-ии можно исп. с именем какое ей дано пр.
а указатель надо разыменововать
|
Автор: itan 21.9.2006, 10:35 | ||||||
Вот, для примера, создаю я объекты класса
Как лучше оформить функции принимающие объекты классов Alpha и Betta в качестве параметров ? Так:
или так:
или еще как ? |
Автор: vinter 21.9.2006, 10:55 | ||
кстати а зачем const?? |
Автор: EvgenZ 21.9.2006, 11:09 | ||||
Затем что const не даст изменять объект а. |
Автор: Daevaorn 21.9.2006, 11:14 |
itan, если в функции ты не собираешься освобождать указатель или ещё что-то с ним делать, а тебе нужен только объект, тогда зачем передавать указатель? Ссылки(особенно константные) скорей всего проще оптимизировать компилятору. Хотя всё зависит от ситуации и от результата который ты хочешь получить. |
Автор: vinter 21.9.2006, 11:30 | ||
что такое const я знаю ![]() |
Автор: EvgenZ 21.9.2006, 11:41 |
Ну а что тогда не понятно, если тебе не требуется изменять объект, то ставится const. Это идет как показатель, что объект изменяться не будет и защитит от неумышленного изменения... |
Автор: 0x07L 21.9.2006, 11:49 |
Указатель надо использовать тогда, когда может быть передано какое-нибудь специальное значение. Вместо реального указателя можно передать ноль, ссылка такое осуществить не позволяет. Например, в MFC: CWnd* SetParent( CWnd* pWndNewParent ); Здесь указатель, а не ссылка, для того чтобы мог быть передан ноль. |
Автор: vinter 21.9.2006, 11:57 |
просто вообще не вижу смысла передачи константных ссылок.. |
Автор: EvgenZ 21.9.2006, 12:10 |
Передача константной ссылки экономит на создании копий и т.д. и гарантирует сохранность объекта. Когда передаешь по значению, создается копия и все действия выполняются над ней, самже объект не изменяется. По ссылке не создается никаких копий (что есть хорошо), но зато любое изменение в функции объекта отразится на нем самом, чтобы не произошло изменения и гарантировать сохранность ставится конст. |
Автор: maxim1000 21.9.2006, 12:29 |
слышал такой аргумент: при передаче по неконстантной ссылке возможно (и, обычно, предполагается) изменение объекта однако, в точке вызова это никак не отражено т.е. человек посмотрит на func(a,b) и для того, чтобы сказать, будут ли изменены объекты a и b, нужно лезть смотреть описание функции а когда вместо неконстантной ссылки всегда используется передача по указателю, то & уже обращает на себя внимание, а если его нет, то можно быть уверенным, что передаваемый объект не изменится... честно говоря, лично я ещё не выработал какого-то определённого отношения к этому аргументу стараюсь вообще минимизировать случаи передачи изменяемых объектов в качестве аргументов но вообще-то, наверное, этот аргумент становится актуальным в коллективной разработке, где часто приходится смотреть чужой код... |
Автор: Romikgy 21.9.2006, 12:34 |
попробуй передать в копирующий конструктор указатель ![]() А вообще имхо просто разница в обращении к этой переменной, в смысле написания буковок в коде, (почти )все что можно написать юзая ссылку , можно также реализовать и через указатель |
Автор: EvgenZ 21.9.2006, 12:39 |
Использование ключевого слова const позволяет функции работать как с постоянными объектами, так и с переменными. |
Автор: vinter 21.9.2006, 13:02 |
EvgenZ не убедил ![]() ИМХО хочешь чтобы обьект менялся, передавай по ссылке, не хочешь, передавай просто так(можно и с идентификатором const, чтобы выглядело красивей ![]() |
Автор: EvgenZ 21.9.2006, 13:09 | ||
к примеру у тебя объект не объект класса точка, а какой-нибудь супер объект, содержащий поля из объектов других классов в большом колличестве. При передаче по значению у тебя для каждого такого поля будет создаваться копия... будут вызванны конструкторы для каждого(а если еще и поле из составного класса то и далее...) это очень затратно и расточительно. |
Автор: vinter 21.9.2006, 13:16 | ||
![]() ![]() ![]() Убедил ![]() |
Автор: Rockie 22.9.2006, 01:12 | ||
При передаче по указателю используется косвенный доступ, а при передаче по ссылке - прямой.
imho вроде как по указателю стоит передавать текстовые массивы, так как указатель обозначает начало массива. |