& ?

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

  1. Shimomochi

    Shimomochi New Member

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

    Asvald New Member

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

    Booster New Member

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

    Shimomochi New Member

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

    Booster New Member

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

    Nouzui New Member

    Публикаций:
    0
    угу
    int &p= *(int*)NULL;

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

    Booster New Member

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

    Asvald New Member

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

    Booster New Member

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

    _DEN_ DEN

    Публикаций:
    0
    Booster

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

    Valery New Member

    Публикаций:
    0
    ну можно напороться и менее экзотическим способом, я например грешу так:

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

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

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

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

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

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