![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Marlin |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 170 Регистрация: 20.2.2006 Репутация: нет Всего: 1 |
Есть по крайней мере два способа выполнения этой задачи. Результат один и тот же. Хотел бы узнать все же их различия, а также как работать правильнее.
Пример Вызов функции с передачей указателя
Передача объекта по ссылке
Это сообщение отредактировал(а) Marlin - 20.11.2006, 06:45 --------------------
Программист решает проблемы, о которых пользователь даже не задумывается,способами, о котороых он даже не подозревает. |
||||
|
|||||
| archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 58 Всего: 93 |
разницы практически нет. точнее говоря, на низком уровне её совсем нет. на уровне языка - не нужно писать * для ссылки, но в качестве ссылки нельзя передать нулевой указатель...хотя...возможно все:
-------------------- If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas. © George Bernard Shaw |
|||
|
||||
| Kuvaldis |
|
||||
![]() механик-вредитель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1189 Регистрация: 16.6.2006 Где: Минск Репутация: 11 Всего: 61 |
Marlin,
Не знаю, специально получилось у тебя или нет, но:
не есть гуд. Ты нарушаешь концепцию ООП: даные должны быть скрыты (в секции private) и должен быть предоставлен интерфейс (методы) для доступа и (если надо) изменения этих данных. archimed7592, Надеюсь, что это не злостный оффтопик
Давно хотел узнать, да забывал: как РЕАЛЬНО физически реализуется механизм ссылок. Пользоваться умею, плюсы и минусы, нюансы знаю. Но помнится, преподы, кроме слов, что "ссылка - это псевдоним", больше ничего не говорили. Да и в книжках подробно не встречал... В общем был бы рад услышать ответ или link на ресурс... (я не нашел) Это сообщение отредактировал(а) Kuvaldis - 20.11.2006, 09:42 -------------------- Помни - когда ты спишь, враг не дремлет Спи чаще и дольше, изматывай врага бессоницей |
||||
|
|||||
| SergeCpp |
|
|||
![]() ![]() ![]() Профиль Группа: Участник Сообщений: 955 Регистрация: 8.8.2005 Где: At Home Репутация: 15 Всего: 124 |
![]() 5.5 References The obvious implementation of a reference is as a (constant) pointer that is dereferenced each time it is used. It doesn’t do much harm thinking about references that way, as long as one remembers that a reference isn’t an object that can be manipulated the way a pointer is. In some cases, the compiler can optimize away a reference so that there is no object representing that reference at runtime. Это сообщение отредактировал(а) SergeCpp - 20.11.2006, 10:32 |
|||
|
||||
| UnrealMan |
|
||||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
Как и указатель, ссылка тоже может быть невалидной.
Зависит от реализации и места использования. Например, внутри класса
это, вероятно, будет то же самое, что и указатель, только операции с таким указателем будут иметь семантику ссылок. А, скажем, где-нибудь внутри функции
вместо ref, вероятно, будет подставлено само n. Вообще реализация ссылок, скорее всего, будет такой же, как и у указателей: там, где в принципе оптимизация позволяет напрямую использовать объект, либо указатель на него, ссылка, вероятно, будет заменена на прямое обращение, в противном случае вероятно ожидать реализации ссылки в виде отдельно хранящегося адреса. |
||||||||
|
|||||||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Ссылки реализуются через указатели.
Разница только на уровне семантики. Ссылка - это указатель и разыменование в одном флаконе. Т.е. передается как указатель, а используется (в вычислениях) как объект. Ссылка не может быть неинициализированной (компилятор не пропустит) и всегда связана с одним и тем же объектом (нельзя переставить на другой). А указатель, соответственно, можно. В смысле использования - в зависимости от вкуса\привычек\обстоятельств. Как уже было сказано, передавая ссылку, ты как бы гарантируешь, что объект обязан быть. Рекомендации, ИМХО, такие: использоваться ссылки везде, где это возможно. Если невозможно - заменять указателями. Хотя есть случаи, когда указателями пользоваться удобнее: скажем, при использовании шаблонов типа boost::bind: Компилятор не может отличить передачу ссылки от передачи объекта, так что во избежания лишних копирований приходится использовать boost::ref (если хочешь передать ссылку). А при передаче указателя - никаких проблем и лишних слов. -------------------- ... |
|||
|
||||
| Marlin |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 170 Регистрация: 20.2.2006 Репутация: нет Всего: 1 |
Это всего лишь учебный пример --------------------
Программист решает проблемы, о которых пользователь даже не задумывается,способами, о котороых он даже не подозревает. |
|||
|
||||
| Marlin |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 170 Регистрация: 20.2.2006 Репутация: нет Всего: 1 |
Короче подвожу итоги:
т.е в примере 1 "Вызов функции с передачей указателя" я могу передать в функцию все что угодно, любой из объявленных экземпляров класса, не инициализировать его и передать в функцию. В итоге в программе появиться "бяка", которую я долго и муторно буду искать. В примере два, если ссылки на конкретный объект не будет, бяки в программе тоже не будет, в функцию возможно передать непосредственно инициализированный объект, который в последствии будет разыменован. Я так понял, в создании классов лучше пользоваться ссылками, дабы обезопасить класс от ошибок, да и вообще, код лучше читаться будет. Earnest – все объяснил толково, в точку, без лишней воды не по теме. --------------------
Программист решает проблемы, о которых пользователь даже не задумывается,способами, о котороых он даже не подозревает. |
|||
|
||||
| archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 58 Всего: 93 |
угу. я даже показал пример, как этого можно добиться...только вот указатель намного проще сделать (сам того не подозревая) невалидным...
-------------------- If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas. © George Bernard Shaw |
|||
|
||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
объяснила |
|||
|
||||
| likehood |
|
|||
|
666 ![]() ![]() Профиль Группа: Участник Сообщений: 536 Регистрация: 21.12.2005 Репутация: 8 Всего: 24 |
||||
|
||||
| archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 58 Всего: 93 |
-------------------- If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas. © George Bernard Shaw |
|||
|
||||
| UnrealMan |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
Плохо показал... У тебя идёт разыменование нулевого указателя, результат выполнения которого не определён. Иными словами, не факт, что ты где-то сумеешь использовать такую «ссылку» – до этого дело может просто не дойти.
Ну, не знаю. Обычно причиной невалидности указателя является уничтожение объекта, на которого он указывает, но это верно и в отношении ссылок (т.н. «висячие» ссылки). Можно, конечно, ещё вспомнить выход за границы массива, но это уже будет связано с арифметикой указателей, поэтому проводить тут сравнения со ссылками бессмысленно. |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |