2010-06-24 5 views

ответ

6

Потому что C был изобретен первым. Я не знаю, не думали ли они о ссылках в то время (в большинстве случаев не нужны), или если есть какая-то особая причина не включать их (возможно, сложность компилятора). Они, безусловно, гораздо полезнее для объектно-ориентированных и генерических конструкций, чем процедурный стиль C.

1

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

0

Я предполагаю, что C родился с минималистской шляпой, а ссылки - это просто синтаксический сахар для указателей.

+1

Это очень упрощенный вид ссылок и, хотя технически (на очень низком уровне), правда, не является точным описанием каких ссылок. –

5

Сводные аргументы были первоначально изобретены AFAIK, с одной стороны: семантика перегрузки оператора. Например, оператор [] должен просто вернуть ссылку.

Это была тема большой дискуссии, следует ли использовать «скрытый указатель» для чего-либо еще.

Многие документы о разработке многих фирм говорят, что «никогда не используйте ссылки. Если вам нужен указатель, скажите так».

Однако было обнаружено, что ссылки имеют одно важное преимущество (нет, не синтаксический сахар). Это так: ссылка будет действительна, если вы не будете работать очень тяжело, чтобы ее сломать.

Лично я до сих пор не понимаю, почему я не могу сделать это в C++:

int a1, a2; 
int &b = a1; 
&b = a2; // Error. address of referenced is not an lvalue. Why?! 
+0

Этот код не имеет смысла. Вторая строка пытается инициализировать целое число из указателя; третий пытается назначить целое число временному указателю. Оба они дают несоответствие типа. Ошибка сообщает вам, что вы не можете назначить временное; даже если бы вы могли, то это не имело бы никакого эффекта, поскольку временное уничтожение немедленно. Что вы хотите сделать? –

+0

Третья строка пытается присвоить адрес 'b', который (в некотором смысле) аналогичен попытке переместить переменную' b' на указанный адрес. Я не могу придумать случай, когда вы захотите это сделать. Если вам нужна переменная, связанная с определенной ячейкой памяти, используйте «void *» для указания адреса памяти.Если разрешить что-то подобное, это также означает, что допустимо '& b = & a2', что приведет к тому, что обе (уникальные) переменные' b' и 'a2' будут совпадать с одним адресом, что не имеет смысла. Произвольное «перемещение» такой переменной приведет к испорчению смещений памяти, сгенерированных компилятором. – bta

+0

извините меня, идиот. фиксированный код. пожалуйста, игнорируйте все, что вы думаете, что я имел в виду. –

1

Как вы знаете, C предшествует C++ примерно десять лет. Ссылки - это функция, введенная на языке C++. Некоторые особенности языка C++ были приняты в последующих версиях стандарта C (например, const и // comment). Концепции ссылок пока не было.

Можно предположить, что их полезность в объектно-ориентированном программировании не переводим как с пользой для процедурного программирования C.

1

Я думаю, что я согласен с идеей Павла, что они были изобретены, чтобы перегруженные операторы работают должным образом. Довольно ясно, что первые версии C++ (C с классами) не имели ссылок, как если бы они делали, this был бы ссылкой вместо указателя.

Смежные вопросы