Что именно послужило основанием для введения ссылок в c ++? - PullRequest
1 голос
/ 17 января 2011

Из обсуждения, которое произошло в моем недавнем вопросе ( Почему ссылка на c ++ считается более безопасной, чем указатель? ), у меня возникает другой вопрос: каково было обоснование введения ссылок в C ++?

Ответы [ 5 ]

12 голосов
/ 17 января 2011

Раздел 3.7 из Страуструпа Дизайн и эволюция C ++ описывает введение ссылок на язык. Если вы заинтересованы в обосновании какой-либо функции C ++, я настоятельно рекомендую эту книгу.

Ссылки были введены в первую очередь для поддержки перегрузки операторов. Даг Макилрой вспоминает, что однажды я объяснял ему некоторые проблемы с предшественником существующей схемы перегрузки оператора. Он использовал слово ссылка с поразительным эффектом, который я пробормотал «Спасибо», и покинул свой кабинет, чтобы вновь появиться на следующий день, когда текущая схема по существу завершена. Даг напомнил мне об Алголе68.

C передает каждый аргумент функции по значению, и когда передача объекта по значению будет неэффективной или неуместной, пользователь может передать указатель. Эта стратегия не работает там, где используется перегрузка оператора. В этом случае удобство нотации является существенным, поскольку нельзя ожидать, что пользователи будут вставлять операторы адресов, если объекты большие. Например:

a = b - c;

является приемлемой (то есть обычной) нотацией, но

a = &b - &c;

нет. В любом случае, &b - &c уже имеет значение в C, и я не хотел его менять.

Невозможно изменить то, на что ссылается ссылка после инициализации. То есть после инициализации ссылки на C ++ ее нельзя повторно связать. Раньше меня укусили ссылки Algol68, где r1 = r2 может либо назначить через r1 объект, на который ссылаются, либо присвоить новое значение ссылки r1 (повторное связывание r1) в зависимости от типа r2. Я хотел избежать таких проблем в C ++.

2 голосов
/ 17 января 2011

Ссылки привязываются к объектам неявно.Это имеет большие преимущества, когда вы рассматриваете такие вещи, как привязка к временным файлам или перегрузка операторов - программы на C ++ будут полны & и *.Когда вы думаете об этом, основной вариант использования указателя на самом деле ведет себя как ссылка.Кроме того, намного сложнее испортить ссылки - вы сами не выполняете арифметику с указателями, не можете автоматически преобразовывать массивы (это ужасно) и т. Д.чем указатели.

Это интересно, потому что большинство других языков не имеют ссылок, как у C ++ (псевдонимы), они просто имеют ссылки в стиле указателей.

2 голосов
/ 17 января 2011

Они нужны вам для перегрузки операторов (теперь, конечно, мы можем перейти к кроличьей норе «зачем было вводить перегрузку операторов?»)

Как бы вы набрали std::auto_ptr::operator*() без ссылок? Или std::vector::operator[]?

0 голосов
/ 17 января 2011

Для учета перегрузки оператора. Они хотели, чтобы операторы были перегружены как для объектов, так и для указателей, поэтому им нужен был способ ссылки на объект с помощью чего-то другого, кроме указателя. Отсюда и ссылка была введена. Это в "Дизайн и эволюция C ++".

0 голосов
/ 17 января 2011

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

В итоге все становится немного «сломанным» из-за того, что C ++ позволяет коду брать адрес ссылки. Эта возможность была предоставлена ​​для обеспечения совместимости со старыми процедурами, которые ожидали указатели, а не ссылки. Если ссылка передается подпрограмме, которая берет свой адрес и сохраняет его где-то, все ставки отменяются. С другой стороны, если в соответствии с политикой кто-либо запрещает использовать адрес ссылки каким-либо образом, который может быть сохранен, можно получить уверенность, которую предоставляют ссылки.

...