![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
itan |
|
|||
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 3.7.2006 Репутация: нет Всего: нет |
Добрый день! У кого какие соображения по поводу того, когда лучше использовать передачу параметра по ссылке, а когда по указателю ? Т.к. особой разницы между этими двумя подходами нет, то может существует какой-нибудь хороший стиль написания ?
Например, я вижу различие, только в том, что ссылка, в отличие от указателя не может быть NULL, поэтому те параметры (объекты), существование которых обязательно, должны всегда передаваться по ссылке. Еще что-нибудь? |
|||
|
||||
Damarus |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 671 Регистрация: 6.5.2006 Репутация: 6 Всего: 29 |
ИМХО, передавать по указателю надо только тогда, когда нет другого выхода. Во всех остальных случаях - по ссылке.
|
|||
|
||||
Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 8 Всего: 146 |
все зависит от того что передаешь!
-------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. ![]() |
|||
|
||||
Damarus |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 671 Регистрация: 6.5.2006 Репутация: 6 Всего: 29 |
||||
|
||||
vinter |
|
||||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
ИМХО по ссылке удобнее при передаче по ссылке, переменную внутри ф-ии можно исп. с именем какое ей дано
пр.
а указатель надо разыменововать
|
||||
|
|||||
itan |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 3.7.2006 Репутация: нет Всего: нет |
Вот, для примера, создаю я объекты класса
Как лучше оформить функции принимающие объекты классов Alpha и Betta в качестве параметров ? Так:
или так:
или еще как ? |
||||||
|
|||||||
vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
кстати а зачем const?? Это сообщение отредактировал(а) vinter - 21.9.2006, 10:56 |
|||
|
||||
EvgenZ |
|
||||
![]() Freedom in me ![]() ![]() Профиль Группа: Участник Сообщений: 407 Регистрация: 3.8.2006 Репутация: 1 Всего: 11 |
Затем что const не даст изменять объект а. -------------------- <удалено администрацией форума> |
||||
|
|||||
Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
itan, если в функции ты не собираешься освобождать указатель или ещё что-то с ним делать, а тебе нужен только объект, тогда зачем передавать указатель? Ссылки(особенно константные) скорей всего проще оптимизировать компилятору. Хотя всё зависит от ситуации и от результата который ты хочешь получить.
|
|||
|
||||
vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
что такое const я знаю ![]() |
|||
|
||||
EvgenZ |
|
|||
![]() Freedom in me ![]() ![]() Профиль Группа: Участник Сообщений: 407 Регистрация: 3.8.2006 Репутация: 1 Всего: 11 |
Ну а что тогда не понятно, если тебе не требуется изменять объект, то ставится const. Это идет как показатель, что объект изменяться не будет и защитит от неумышленного изменения...
-------------------- <удалено администрацией форума> |
|||
|
||||
0x07L |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 272 Регистрация: 10.6.2006 Где: Москва Репутация: нет Всего: 5 |
Указатель надо использовать тогда, когда может быть передано какое-нибудь специальное значение. Вместо реального указателя можно передать ноль, ссылка такое осуществить не позволяет. Например, в MFC:
CWnd* SetParent( CWnd* pWndNewParent ); Здесь указатель, а не ссылка, для того чтобы мог быть передан ноль. |
|||
|
||||
vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
просто вообще не вижу смысла передачи константных ссылок..
|
|||
|
||||
EvgenZ |
|
|||
![]() Freedom in me ![]() ![]() Профиль Группа: Участник Сообщений: 407 Регистрация: 3.8.2006 Репутация: 1 Всего: 11 |
Передача константной ссылки экономит на создании копий и т.д. и гарантирует сохранность объекта. Когда передаешь по значению, создается копия и все действия выполняются над ней, самже объект не изменяется. По ссылке не создается никаких копий (что есть хорошо), но зато любое изменение в функции объекта отразится на нем самом, чтобы не произошло изменения и гарантировать сохранность ставится конст.
-------------------- <удалено администрацией форума> |
|||
|
||||
maxim1000 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
слышал такой аргумент:
при передаче по неконстантной ссылке возможно (и, обычно, предполагается) изменение объекта однако, в точке вызова это никак не отражено т.е. человек посмотрит на func(a,b) и для того, чтобы сказать, будут ли изменены объекты a и b, нужно лезть смотреть описание функции а когда вместо неконстантной ссылки всегда используется передача по указателю, то & уже обращает на себя внимание, а если его нет, то можно быть уверенным, что передаваемый объект не изменится... честно говоря, лично я ещё не выработал какого-то определённого отношения к этому аргументу стараюсь вообще минимизировать случаи передачи изменяемых объектов в качестве аргументов но вообще-то, наверное, этот аргумент становится актуальным в коллективной разработке, где часто приходится смотреть чужой код... -------------------- qqq |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |