Подтвердить что ты не робот

С++: зачем вам нужны ссылки, когда у вас есть указатели?

Возможный дубликат:
С++: когда использовать ссылки против указателей
Могла ли перегрузка операторов работать без ссылок?

Я не мог с этим поделать, но этот основополагающий вопрос был на мой взгляд: почему С++ имеет ссылки, когда вы могли бы сделать это с указателями?

Я знаю, что в некоторых ситуациях они немного безопаснее и чаще всего делают код более красивым, но технически нет никакой разницы, не так ли? Так есть ли ситуации, когда я не мог сделать с указателем, а ссылка - обязательная?
Я бы хотел, чтобы конкретные примеры использования ссылок были неизбежны.

Отказ от ответственности:
Я не нашел ответов на это в StackOverflow, это не вопрос о различиях в синтаксисе. Мне интересно, почему язык С++ ввел ссылки в первую очередь.

4b9b3361

Ответ 1

Перегрузка оператора. Использование указателей для "передачи через ссылку" даст вам неприемлемый синтаксис.

Ответ 2

  • Используя только указатели, вы не можете правильно pass-by-reference или return-by-reference.
  • Некоторые методы требуют ссылки. Как реализовать экземпляр-конструктор?
  • Иногда вам нужно принудительно применять псевдонимы. Вы не можете сделать это с помощью указателей - их можно изменить. Ссылки не могут связываться с чем-то другим. Поэтому, когда вы инициализируете ссылку, вы гарантируете, что она будет ссылаться на один и тот же объект в своей области.
  • Проблема безопасности
  • (const) Ссылки могут привязываться к временным объектам. Чтобы создать временный указатель, вам нужно освободить его внутри метода, которым вы его передаете. Но вы не можете сказать, временно ли это или нет.

Ответ 3

Если у вас есть указатель в качестве параметра, вы должны проверить, является ли он NULL. Со ссылками вы должны сделать эту проверку. Вот почему в С++ есть ссылки на самого человека - http://www.stroustrup.com/bs_faq2.html#pointers-and-references

Ответ 4

class A{
public:
    A(int i){}
};

void foo(const A& a){};
void foo2(const A* pa){};
int main (void)
{
  foo(1);
  foo2(1); //invalid
  return (0);
}

Один случай, который я знаю. Пользователю не нужно управлять ссылочным объектом, компилятор может его уничтожить. Поскольку указатель требует, чтобы пользователь удалял его явным. Для foo2 трудно управлять временным жизненным циклом.

Ответ 5

Пример:

my_type *get_some_data();
...
my_type *data = get_some_data();

позволяет делать delete data, пока

my_type &get_some_data();
...
my_type &data = get_some_data();

не дает возможности для удаления.