& ?

Тема в разделе "LANGS.C", создана пользователем Shimomochi, 5 мар 2007.

  1. Shimomochi

    Shimomochi New Member

    Публикаций:
    0
    Регистрация:
    21 фев 2007
    Сообщения:
    9
    Кто-нибудь сможет мне объяснить четко и ясно, что есть ссылка(&) в С++?
     
  2. Asvald

    Asvald New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2006
    Сообщения:
    58
    Тоже самое что указатель, но с более упрощенным синтаксисом использования(упрощение происходит за счет того, что компилятор сам выполняет часть работы по разыменовыванию ссылки, то есть для программиста все происходит совершенно прозрачно, ему кажется, что ссылка это просто второй идентификатор объекта).
     
  3. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Ну впринципе это не существующая на самом деле вещь. Была придумана чтобы не работать с указателями. Указателю можно приравнять NULL или любое другое значение, а это опасно. Со ссылками такого нельзя, компилятор не даст. Вот IMHO и вся прелесть этого.
    В функцию лучше передавать ссылку, так как компилятор в этом случае поможет найти ошибку.
     
  4. Shimomochi

    Shimomochi New Member

    Публикаций:
    0
    Регистрация:
    21 фев 2007
    Сообщения:
    9
    а почему тогда ссылка очень похожа на указатель и при этом называется альтернативным именем объекта?
    Если функция возвращает ссылку на объект, то что на самом деле возвращается?
     
  5. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Как почему. Asvald же обяснил, что это указатель работа с которым при помощи компилятора происходит как с объектом.
    Есть адрес и содержимое памяти по этому адресу. Как ты думаешь что возвратиться?
     
  6. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    угу
    int &p= *(int*)NULL;

    ну, правда, эта строка как правило вызывает исключение в рантайме
     
  7. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Nouzui
    Круто. Объект NULL. Даже С++ с его более жёсткой проверкой типов, прикалывает. Интересно это все компиляторы поддерживают?
     
  8. Asvald

    Asvald New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2006
    Сообщения:
    58
    Booster
    Чего же это С++ прикалывает? Если тут сознательно происходит приведение типа. По этому поводу Эккель писал: "Язык C++ помогает предотвращать ошибки, но не защитит вас от самого себя, если вы сознательно хотите разрушить механизмы безопасности."
     
  9. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Asvald
    Да, но ссылки IMHO и задумывлись как более безопасная альтернатива указателям, а тут такое. Хотя конечно фраза Эккеля очень верна, и ссылки лишь помогают, но не защищают на 100%.
     
  10. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Booster

    Комрад Страуструп решил ввести ссылки в первую очередь для того, чтобы можно было красиво перегружать операторы.
     
  11. Valery

    Valery New Member

    Публикаций:
    0
    Регистрация:
    31 июл 2003
    Сообщения:
    75
    Адрес:
    Russia
    ну можно напороться и менее экзотическим способом, я например грешу так:

    Код (Text):
    1. some_constructor(const some_object& obj = some_object()){ }
    даже если obj должен быть взаправду настоящим, а не чем-то раз и навсегда определенным, вроде allocator.

    имхо, риференс лучше пойнтера, кроме следующих случаев (первые что вспомнились):

    1) указатели на функции ( даже не знаю можно ли чем заменить?)

    2) внутренности классов, где можно позволить себе сишный стиль. Кто против реализаций stl-ских контейнеров с node*, но где-то глубоко внутри - ведь все равно наружу торчит только изящный итератор?

    3) еще случай. Вам нужна небольшая структура, по сути дела aggregate type. Если в ней будет риференс вместо указателя, то придется писать копи-констр. и присваивание. Есть ли замена указателямм в этой ситуации?

    4) экономия параметров :) если пойнтер NULL то можно проигнорировать. Истинно плюсовый стиль наверное предполагает какое-либо иное решение.