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

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

Ответы на вопрос(5)

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

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

 Oliver Charlesworth17 янв. 2011 г., 19:30
+1: это в основном причина.

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

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

Решение Вопроса

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

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

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

a = b - c;

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

a = &b - &c;

не является. Так или иначе,&b - &c уже имеет значение в C, и я не хотел это менять.

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

 Logan Capaldo17 янв. 2011 г., 19:28
+1, это «правильный ответ», возьми его изо рта лошади.
 fredoverflow17 янв. 2011 г., 20:05
Я добавил соответствующую цитату, надеюсь, вы не возражаете.
 Greg Hewgill18 янв. 2011 г., 04:24
@FredOverflow: Спасибо, у меня не было моей копии, когда я это написал. Я получил номер раздела из предварительного просмотра книги Amazon.

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

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

Ссылки чище, проще и безопаснее, чем указатели.

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

Ваш ответ на вопрос