Почему ссылочные переменные не присутствуют/используются в C?Справочные переменные в C++
Почему они предназначены для C++?
Почему ссылочные переменные не присутствуют/используются в C?Справочные переменные в C++
Почему они предназначены для C++?
Потому что C был изобретен первым. Я не знаю, не думали ли они о ссылках в то время (в большинстве случаев не нужны), или если есть какая-то особая причина не включать их (возможно, сложность компилятора). Они, безусловно, гораздо полезнее для объектно-ориентированных и генерических конструкций, чем процедурный стиль C.
Они не присутствуют на C, потому что они не требуются. C имеет очень мало «посторонних» функций. Вы можете писать любую программу без использования ссылок, поэтому они просто не включены. C++ был разработан намного позже, чем C, поэтому его дизайнеры бросили всевозможные вещи, которые изначально не присутствовали в C.
Я предполагаю, что C родился с минималистской шляпой, а ссылки - это просто синтаксический сахар для указателей.
Сводные аргументы были первоначально изобретены AFAIK, с одной стороны: семантика перегрузки оператора. Например, оператор [] должен просто вернуть ссылку.
Это была тема большой дискуссии, следует ли использовать «скрытый указатель» для чего-либо еще.
Многие документы о разработке многих фирм говорят, что «никогда не используйте ссылки. Если вам нужен указатель, скажите так».
Однако было обнаружено, что ссылки имеют одно важное преимущество (нет, не синтаксический сахар). Это так: ссылка будет действительна, если вы не будете работать очень тяжело, чтобы ее сломать.
Лично я до сих пор не понимаю, почему я не могу сделать это в C++:
int a1, a2;
int &b = a1;
&b = a2; // Error. address of referenced is not an lvalue. Why?!
Этот код не имеет смысла. Вторая строка пытается инициализировать целое число из указателя; третий пытается назначить целое число временному указателю. Оба они дают несоответствие типа. Ошибка сообщает вам, что вы не можете назначить временное; даже если бы вы могли, то это не имело бы никакого эффекта, поскольку временное уничтожение немедленно. Что вы хотите сделать? –
Третья строка пытается присвоить адрес 'b', который (в некотором смысле) аналогичен попытке переместить переменную' b' на указанный адрес. Я не могу придумать случай, когда вы захотите это сделать. Если вам нужна переменная, связанная с определенной ячейкой памяти, используйте «void *» для указания адреса памяти.Если разрешить что-то подобное, это также означает, что допустимо '& b = & a2', что приведет к тому, что обе (уникальные) переменные' b' и 'a2' будут совпадать с одним адресом, что не имеет смысла. Произвольное «перемещение» такой переменной приведет к испорчению смещений памяти, сгенерированных компилятором. – bta
извините меня, идиот. фиксированный код. пожалуйста, игнорируйте все, что вы думаете, что я имел в виду. –
Как вы знаете, C предшествует C++ примерно десять лет. Ссылки - это функция, введенная на языке C++. Некоторые особенности языка C++ были приняты в последующих версиях стандарта C (например, const и // comment). Концепции ссылок пока не было.
Можно предположить, что их полезность в объектно-ориентированном программировании не переводим как с пользой для процедурного программирования C.
Я думаю, что я согласен с идеей Павла, что они были изобретены, чтобы перегруженные операторы работают должным образом. Довольно ясно, что первые версии C++ (C с классами) не имели ссылок, как если бы они делали, this
был бы ссылкой вместо указателя.
Это очень упрощенный вид ссылок и, хотя технически (на очень низком уровне), правда, не является точным описанием каких ссылок. –