Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> передача параметров, * или & 
:(
    Опции темы
itan
Дата 21.9.2006, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 3.7.2006

Репутация: нет
Всего: нет



Добрый день! У кого какие соображения по поводу того, когда лучше использовать передачу параметра по ссылке, а когда по указателю ? Т.к. особой разницы между этими двумя подходами нет, то может существует какой-нибудь хороший стиль написания ? 
Например, я вижу различие, только в том, что ссылка, в отличие от указателя не может быть NULL, поэтому те параметры (объекты), существование которых обязательно, должны всегда передаваться по ссылке.
Еще что-нибудь?
PM MAIL   Вверх
Damarus
Дата 21.9.2006, 10:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 671
Регистрация: 6.5.2006

Репутация: 6
Всего: 29



ИМХО, передавать по указателю надо только тогда, когда нет другого выхода. Во всех остальных случаях - по ссылке.
PM MAIL ICQ Jabber   Вверх
Romikgy
Дата 21.9.2006, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 8
Всего: 146



все зависит от того что передаешь! 


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Damarus
Дата 21.9.2006, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 671
Регистрация: 6.5.2006

Репутация: 6
Всего: 29



Цитата(Romikgy @  21.9.2006,  11:13 Найти цитируемый пост)
все зависит от того что передаешь! 

И какая разница smile 
PM MAIL ICQ Jabber   Вверх
vinter
Дата 21.9.2006, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



ИМХО по ссылке удобнее при передаче по ссылке, переменную внутри ф-ии можно исп. с именем какое ей дано
пр.
Код

 f(int &n)
{
   n=6;
}

а указатель надо разыменововать
Код

 f(int *n)
{
   *n=6;
}



--------------------
Мой блог
PM MAIL WWW   Вверх
itan
Дата 21.9.2006, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 3.7.2006

Репутация: нет
Всего: нет



Вот, для примера, создаю я объекты класса
Код

class Alpha{}

class Betta{}

Alpha a();
Betta* b = new Betta();


Как лучше оформить функции принимающие объекты классов Alpha и Betta в качестве параметров ?
Так:
Код

void fun (const Alpha& a, Betta* b)

или так:
Код

void fun(Alpha* a, const Betta& b)


или еще как ?

PM MAIL   Вверх
vinter
Дата 21.9.2006, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Код

void fun (const Alpha& a, Betta* b)

кстати а зачем const??

Это сообщение отредактировал(а) vinter - 21.9.2006, 10:56


--------------------
Мой блог
PM MAIL WWW   Вверх
EvgenZ
Дата 21.9.2006, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Freedom in me
**


Профиль
Группа: Участник
Сообщений: 407
Регистрация: 3.8.2006

Репутация: 1
Всего: 11



Цитата(vinter @ 21.9.2006,  10:55)
Код

void fun (const Alpha& a, Betta* b)

кстати а зачем const??

Затем что const не даст изменять объект а.


--------------------
<удалено администрацией форума>
PM MAIL   Вверх
Daevaorn
Дата 21.9.2006, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



itan, если в функции ты не собираешься освобождать указатель или ещё что-то с ним делать, а тебе нужен только объект, тогда зачем передавать указатель? Ссылки(особенно константные) скорей всего проще оптимизировать компилятору. Хотя всё зависит от ситуации и от результата который ты хочешь получить.
PM MAIL WWW   Вверх
vinter
Дата 21.9.2006, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Цитата

Затем что const не даст изменять объект а.

что такое const я знаю smile 


--------------------
Мой блог
PM MAIL WWW   Вверх
EvgenZ
Дата 21.9.2006, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Freedom in me
**


Профиль
Группа: Участник
Сообщений: 407
Регистрация: 3.8.2006

Репутация: 1
Всего: 11



Ну а что тогда не понятно, если тебе не требуется изменять объект, то ставится const. Это идет как показатель, что объект изменяться не будет и защитит от неумышленного изменения...


--------------------
<удалено администрацией форума>
PM MAIL   Вверх
0x07L
Дата 21.9.2006, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 10.6.2006
Где: Москва

Репутация: нет
Всего: 5



Указатель надо использовать тогда, когда может быть передано какое-нибудь специальное значение. Вместо реального указателя можно передать ноль, ссылка такое осуществить не позволяет. Например, в MFC:

CWnd* SetParent(
   CWnd* pWndNewParent 
);

Здесь указатель, а не ссылка, для того чтобы мог быть передан ноль.

PM MAIL   Вверх
vinter
Дата 21.9.2006, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



просто вообще не вижу смысла передачи константных ссылок..


--------------------
Мой блог
PM MAIL WWW   Вверх
EvgenZ
Дата 21.9.2006, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Freedom in me
**


Профиль
Группа: Участник
Сообщений: 407
Регистрация: 3.8.2006

Репутация: 1
Всего: 11



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


--------------------
<удалено администрацией форума>
PM MAIL   Вверх
maxim1000
Дата 21.9.2006, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



слышал такой аргумент:
при передаче по неконстантной ссылке возможно (и, обычно, предполагается) изменение объекта
однако, в точке вызова это никак не отражено
т.е. человек посмотрит на func(a,b) и для того, чтобы сказать, будут ли изменены объекты a и b, нужно лезть смотреть описание функции
а когда вместо неконстантной ссылки всегда используется передача по указателю, то & уже обращает на себя внимание, а если его нет, то можно быть уверенным, что передаваемый объект не изменится...

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


--------------------
qqq
PM WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0940 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.