LINUX.ORG.RU

C++: Указатели, ссылки, компиляторы.


1

1

Цитата:

Ссылки часто путают с указателями, вероятно, потому, что компиляторы C++ часто реализуют ссылки как указатели.

C++: Священные знания - Стивен С. Дьюхерст

Как далеки они от народа... Это он что, серьезно так считает?

То есть, он не понимает, что ссылки с указателями путают из-за ублюдочного контекстно-зависимого синтаксиса? Он не понимает, что человек путает использование «&» перед именем переменной для описания ссылки, и использование «&» перед именем переменной для получения адреса, передаваемого в указатель? Он этого, блин, не замечает? И он учит других людей C++?

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

★★★★★

ссылки с указателями путают из-за ублюдочного контекстно-зависимого синтаксиса?

Все верно.

что компиляторы C++ часто реализуют ссылки как указатели

Ну, я бы посмотрел эту фразу в оригинале.

no-such-file ★★★★★
()

То есть, он не понимает, что ссылки с указателями путают из-за ублюдочного контекстно-зависимого синтаксиса?

Ты настолько идиот, что путаешь ссылку и and и взятием адреса? А ты говно с кофеткой не путаешь?

Ниразу в жизни не путал ничего ни с чем, да и просто не представляю каким идиотом надо быть, чтобы что-то там путать. А значения слов ты не путаешь из-за контекстно зависимого и синтаксиса и семантики? Мб у тебя слабоумие - дак есть другие места, где решат твою проблему. Месяц-два и тебя ничего в это жизни волновать не будет.

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

Ты путаешь человека и ущербана. Перед ссылкой всегда стоит тип и каким надо быть тупым и слепым, чтобы спутать взятие адреса и ссылку.

Эти идиоты наверное = и == путают? Ну дак коли ты такой тупой - для тебя есть пускалятинка.

Он этого, блин, не замечает? И он учит других людей C++?

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

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

Угу, в конпелятор и он там 100% в лексическом анализаторе найдёт «реализацию указателей» - инфа сотка.

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

«Я тут у вас посмотрел, у вас ссылка как указатель реализована. Поэтому и попутал ссылку с указателем. Ах, какой я невнимательный, пойду дальше C++ учить, мне ведь еще столько предстоит освоить и понять».

Нет, идиот. Вменяемый человек не путает ссылку с указателем - он просто не понимает что и для чего оно надо и чем они различны, ибо цели у них одинаковые для рядового плюсовика. Он путает из семантически, а не синтаксически, идиот ты обоссанный.

Ты выдал такую херню, что я просто не представляю насколько ты туп - бомбит от плюсов - иди в делфятники и не пиши говно в разделе девелопмент.

anonymous
()

А я не знаю C++!!!11

А что такое «ссылка»? В C & значит только взятие адреса (логические/побитовые операции не в счет)

vonenij
()

дело в том, что ссылки == синтаксический сахар, и подсказка компилятору. Компилятор часто сам делает ссылки, т.е. называет одну переменную другим именем. Особенно gcc любит так делать, если ты эту переменную не меняешь. В этом случае, очевидно, нет нужды копировать даже тогда, когда копирование положено по синтаксису(operator=(), вызов функции). Т.о. сами по себе ссылки в C++ существуют сами по себе, и & только способ явного указания того, что ссылка _нужна_ _обязательно_.

Когда ты возвращаешь переменную, компилятор пытается вернуть ссылку если это возможно. И копию, если нет. Если ты вернёшь ссылку явно, но она умрёт до того, как ты её заюзал, то это будет UB.

Указатель — совершенно другая сущность.

То есть, он не понимает, что ссылки с указателями путают из-за ублюдочного контекстно-зависимого синтаксиса? Он не понимает, что человек путает использование «&» перед именем переменной для описания ссылки, и использование «&» перед именем переменной для получения адреса, передаваемого в указатель? Он этого, блин, не замечает? И он учит других людей C++?

это не баг,а фича. Да и вообще, в C++ любая закорючка может иметь любое значение. Привыкай. Пхп --> там

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

есть другой путь: посмотреть выхлоп ассемблера. И ты увидишь, что ссылка == указатель. А в лексическом анализаторе они как раз разные. Просто результат одинаковый часто получается, потому и путают.

Суть в том, что ссылка == другое имя. А указатель — совсем другая сущность.

emulek
()
Ответ на: комментарий от no-such-file

что компиляторы C++ часто реализуют ссылки как указатели

Ну, я бы посмотрел эту фразу в оригинале.

не совсем верный. В данном случае «реализуют» значит, что результат кода с указателем обычно совпадает с результатом со ссылкой. ИМХО слово «реализуют» тут переводчик применил неверно, ибо не в теме.

emulek
()
Ответ на: комментарий от anonymous

А дебилы потому, что пишут на плюсах[/thread]

дебил == ты.

Доказательство: ты пишешь в тему про плюсы, на которых по твоему пишут только дебилы.

emulek
()
Ответ на: комментарий от anonymous

Ниразу в жизни не путал ничего ни с чем

потому-что ты ничего не делал в своей жизни, только срал. Вот и сейчас одна срань.

emulek
()

По-моему путают ссылки и указатели только дебилы. Но не будешь же об этом писать в книгах. Вот и выдумывают.

anonymous
()
Ответ на: А я не знаю C++!!!11 от vonenij

А что такое «ссылка»?

int x = 17;// переменная x равная 17
int &y = x;// другое имя переменой x, которое совершенно эквивалентно x.

в таком простом коде нет никакой разницы. Разница есть здесь:

void f1(int x);
void f2(int &x);
в первом случае вызывается конструктор копий(в данном случае тривиальный, встроенный) и создаётся новое x; во втором случае создаётся другое имя для x. Никаких копий не создаётся.

Разница таки есть, если написать f1(22), то ВР, а если f2(22), то invalid initialization of non-const reference of type «int&» from an rvalue of type «int», нужно void f3(const int &x), тогда тоже ВР, путём создание временного константного объекта.

emulek
()
Ответ на: комментарий от vonenij

да. Можешь его пост сразу распечатать на туалетную бумагу. Поможет от запора (:

emulek
()
Ответ на: комментарий от anonymous

По-моему путают ссылки и указатели только дебилы.

там неправильный перевод. Не в том смысле «путают», как ты, тупо не в том месте ставят &.

emulek
()
Ответ на: А я не знаю C++!!!11 от vonenij

Ссылка - синоним объекта. Введено для перегрузки операторов(по другому не сделать в языке с передачей по значению).

anonymous
()

То есть, он не понимает, что ссылки с указателями путают из-за ублюдочного контекстно-зависимого синтаксиса?

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

mashina ★★★★★
()
Ответ на: комментарий от anonymous

Введено для перегрузки операторов

не только и не столько. Перезагрузку можно было-бы накостылить и указателями.

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

всё равно новый ЯП (C++) делали.

emulek
()

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

Одно дело - определение переменной, другое - взятие адреса. Кто даже это путает, тот лох!

yoghurt ★★★★★
()
Ответ на: комментарий от emulek

Так Страуструп в D&E пишет, что ввёл для перегрузки операторов. Так что не вводит людей в заблуждение.

anonymous
()

...ну а автор (не ТС) наверняка имел в виду, что ссылки с указателями путают, потому что служат они одной цели.

yoghurt ★★★★★
()
Ответ на: комментарий от yoghurt

Одно дело - определение переменной, другое - взятие адреса. Кто даже это путает, тот лох!

да. Но ИМХО в книжке речь о другом: это было очень давно, когда РОНов почти не было. Потому соглашались, что функция/метод C/C++ засирает все РОНы. И потому передавали значения через память. По умолчанию через стек, используя push РОН, в C++ ввели синтаксис ссылки, и их передачу реализовали как указатель — передавая адрес ячейки памяти со значением. Потому их и путали, а вовсе не из-за &.

emulek
()
Ответ на: комментарий от anonymous

Так Страуструп в D&E пишет, что ввёл для перегрузки операторов.

он «перегрузку» понимает не так как ты. Это не только cout << "я лох";, такую «перегрузку» реализовать можно и без ссылок. Но если ты перезагружаешь ->, или скажем *, [], то возникают проблемы.

не вводит людей в заблуждение.

ты сам заблуждаешься.

emulek
()
Ответ на: комментарий от yoghurt

ссылки с указателями путают, потому что служат они одной цели.

ты очевидно очень слабо знаешь C++. Подумай о том, что если-бы это было так, то зачем плодить лишние сущности?

emulek
()
Ответ на: комментарий от yoghurt

Перезагрузка, она у конвейера, у операторов - перегрузка. Так уж повелось

да мне пофиг, как повелось. Уже обсуждалось: если 95% макак называют каталоги «папками», то это не повод уподобляться.

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

emulek
()
Ответ на: комментарий от emulek

ты очевидно очень слабо знаешь C++

Если ты думаешь, что я не знаю отличия ссылок от указателей, ты ошибаешься :)

Подумай о том, что если-бы это было так, то зачем плодить лишние сущности?

Для пущей безопасности же.

yoghurt ★★★★★
()

То есть, он не понимает, что ссылки с указателями путают из-за ублюдочного контекстно-зависимого синтаксиса?

Книга не предназначена для тех, кто не осилил синтаксис. Книга предназначена для тех, кто синтаксис осилил, но заплутал в семантике.

Для тех, кто путает ссылки с указателями из-за ублюдочного контекстно-зависимого синтаксиса, предназначена «Освой С++ за 21 день».

залезает в дебри исходников компилятора, разгребает правила лексического анализатора, находит реализацию ссылок как указателей

Речь идёт о сгенерированном компилятором коде. Уж ассемблерный листинг *собственной* программы нормальный программист посмотреть вполне в состоянии.

LamerOk ★★★★★
()

Я прям так и вижу начинающего программиста C++, который залезает в дебри исходников компилятора…

Нет. Он заглянет в асемблерный листинг, увидит там косвенный переход и подумает «Ха! Ссылка — синтаксический сахар для указателя! Какой я умный, пойду напишу об этом на ЛОРе^W^Wв бложике!».

KblCb ★★★★★
()
Ответ на: комментарий от yoghurt

Если ты думаешь, что я не знаю отличия ссылок от указателей, ты ошибаешься

я думаю, что ты знаешь недостаточно хорошо это отличие.

Подумай о том, что если-бы это было так, то зачем плодить лишние сущности?

Для пущей безопасности же.

ЧЕГО? От КОГО?

emulek
()
Ответ на: комментарий от LamerOk

Для тех, кто путает ссылки с указателями из-за ублюдочного контекстно-зависимого синтаксиса, предназначена «Освой С++ за 21 день».

эта книга предназначена для тех, кто хочет «лишится яиц за первый рабочий день». А 21 день нужен для того, что-бы такого мудака на эту работу взяли, и доверили что-то написать на C++.

emulek
()
Ответ на: комментарий от emulek

ЧЕГО? От КОГО?

Программиста от самого себя

я думаю, что ты знаешь недостаточно хорошо это отличие.

Блажен кто верует

yoghurt ★★★★★
()
Ответ на: комментарий от emulek

Тот пруф из гугла ниуя не стоит , потому что в выдачи словосочетаний презезагрузка компьютера/сервера и тп попадается чаще чем всё остальное. Если искать с кавычками `«перезагрузка функции»` cpp то: Результатов: примерно 5 240 против Результатов: примерно 1 Я думаю ты уже догадался в чью пользу перевес?

anonymous
()
Ответ на: комментарий от emulek

Ладно, раз ты такой умный, приму вызов. Давай, выкладывай, что там у тебя.

И на затравку? Нафига в плюсах классы, когда в плюсах всё то же можно сделать структурами? Почему опять лишние сущности? Как Страуструп допустил такое? Улюлюл

yoghurt ★★★★★
()
Ответ на: комментарий от yoghurt

Программиста от самого себя

ИМХО это самый худший вид безопасности.

Блажен кто верует

я точно не в курсе, это предположение. Опровергни, если делать нечего...

emulek
()
Ответ на: комментарий от emulek

ИМХО это самый худший вид безопасности.

Вообще-то наоборот. Это тренд сейчас, помощь от самого компилятора в проверке корректности на уровне типов, хаскеллисты подтвердят.

Опровергни, если делать нечего...

Доказывать что-либо кому-либо в Интернете, особенно о себе самом - последнее дело, так что нет!

yoghurt ★★★★★
()
Последнее исправление: yoghurt (всего исправлений: 1)
Ответ на: комментарий от yoghurt

Нафига в плюсах классы, когда в плюсах всё то же можно сделать структурами?

ты просто называешь «безопасностью» совсем другое. А именно — удобство. Всё делать структурами тупо неудобно. Например неудобно, когда у тебя срабатывает operator=() тогда, когда это тебе не нужно. Или какие-то другие методы. Именно потому, в C++ все методы private. Если ты конечно явно это не изменил.

Удобство тут в том, что ты пишешь x=y+z;, а компилятор называет тебя мудаком, потому что ты не сделал публичным operator= и/или operator+. В этом, и только в этом смысле можно трактовать твою «безопасность». Хотя вообще, AFAIK это называется инкапсуляция. Конечно ссылки и для инкапсуляции необходимы, т.к. позволяют скрывать внутренности класса.

Т.е. если метод принимает ссылку, то в функцию можно передать что угодно, лишь-бы это можно было переделать в ссылку. Копию тоже можно, но придётся делать копию. Можно указатель, но только указатель НА ЭТО. Число 22 передать не получится, ибо указатель на константу не имеет смысла. А вот константную ссылку — можно.

emulek
()
Ответ на: комментарий от yoghurt

Это тренд сейчас

ага. Это было трендом во времена Страуструпа...

помощь от самого компилятора в проверке корректности на уровне типов, хаскеллисты подтвердят.

утиная типизация рулит и педалит. Главное — чтоб крякала. На тип насрать. Вот это == тренд. И ничего твои 3.5 хаскелиста не сделают супротив легиона сишарпиков и прочего пхп-быдла.

Увы.

emulek
()
Ответ на: комментарий от emulek

при получении операнда функйией да блин var int a - то биш с++ сcылка безопасней чем ptr on int a - то биш с++/с указатель ибо в первом случае в теле функции синтаксически программист работает с локальным именем, во втором же в ручную(и следовательно дополнительное удлинение той верёвки которой при достаточно длине выстреливают в ногу.) т.е ссылка - эдакий обезопасеный(ибо цели применения ограниченей в сравнении с ) указатель.

в правильных наследниках Алгола ереси с разничением ссылок|указетелей нет ибо .

qulinxao ★★☆
()
Ответ на: комментарий от qulinxao

т.е ссылка - эдакий обезопасеный(ибо цели применения ограниченей в сравнении с ) указатель.

я не запрещаю тебе думать так. И это действительно так. В первом приближении.

в правильных наследниках Алгола ереси с разничением ссылок|указетелей нет ибо .

что остановился? Продолжай: ибо указателей не осилили.

emulek
()
Ответ на: комментарий от emulek

ты просто называешь «безопасностью» совсем другое

В последнее время для меня безопасность больше всего заключается в контроле сайд-эффектов. Пойди заставь ссылку ссылаться на другой объект? То то же.

Всё делать структурами тупо неудобно

Абсолютно так же, как и классами, главное спецификаторы доступа в нужных местах расставить.

Например неудобно, когда у тебя срабатывает operator=() тогда, когда это тебе не нужно.

В большинстве случаев он нужен больше, чем не нужен. Когда он не нужен, его надо закрывать явно как для классов, так и для структур, вручную.

operator=() (...) Или какие-то другие методы. Именно потому, в C++ все методы private.

Я не хочу тебя расстраивать, но по-умолчанию генерируемый компилятором operator= в плюсах - в public. Как и конструктор по-умолчанию, конструктор копирования (если их можно сгенерировать, конечно), и деструктор.

Как ты это приплёл к теме классов и структур в контексте лишних сущностей, я не знаю :)

В этом, и только в этом смысле можно трактовать твою «безопасность»

«Безопасность» тут в том, что ты не сложишь строку с числом, например. Не, ну ты конечно можешь нарисовать соответствующий оператор, но это уже поломает семантику.

Но это только примитивные отголоски той безопасности, которую предоставляют нынче типобезопасные языки вроде хаскеля. Если в типе твоей функции зафиксированы одни сайд-эффекты (может читать из окружения данные типа А, писать данные типа Б), в никаком другом ты её не запустишь - компилятор не даст.

Т.е. если метод принимает ссылку, то в функцию можно передать что угодно, лишь-бы это можно было переделать в ссылку.

Ты ничего не переделываешь в ссылки, ты лишь получаешь ссылки на это «что угодно».

Копию тоже можно, но придётся делать копию.

В метод пойдет только ссылка на эту копию

Можно указатель, но только указатель НА ЭТО.

Указатель в метод, ожидающий ссылку, ты не впихнёшь. И не надо петь про *ptr, это уже не указатель.

Число 22 передать не получится, ибо указатель на константу не имеет смысла. А вот константную ссылку — можно.

22, конечно, константа, вернее литерал. Но не каждая константа - литерал.

yoghurt ★★★★★
()
Последнее исправление: yoghurt (всего исправлений: 1)
Ответ на: комментарий от emulek

ты упоролся «не осилили указатели».

не об этом же речь

ссылки реально облегчили некоторым жизнь, усложнив жизнь другим.

вот я чёт книжэчку «Фостер.Обработка списков» форсю , ну вот там как бе псевдо алгол( что -то дилино подобное на 25 лет раньше дилана)со списачками , а код отформотирован так что увидилась мне крипто гипотеза обьясняюща кста почему в паскале как то особо не различают (вообще такой концепции нет) в отличии от С-языков lvalue и Rvalue.

ну так вот если инорировать возможные вызовы процедур/функций то в строке кода возможно либо оператор языка(if , goto и подобный сахар ), либо имя(которое либо метка_имя_в_коде, либо метка_имя_в_данных) в обоих случаях больше двоеточие ,

если у нас " = выражение" эт оказывется было имя переменной, если же код то метка для гоуты.

забавно , как приёмы облегчения парсинга с одной стороны и привычка кодером в строке_кода (для сей) a=a+1 по разному распарсивать имя в левой части и в правой части .

а ведь это тоже самое что ссылки/указатели ведь по честаку(не будь это просто не экономично так как можно иниоматичней) mem[addr(a)]=read_value_on_adr(a)+1 или как в кой каком предшественики С

a=.a+1

qulinxao ★★☆
()
Ответ на: комментарий от yoghurt

Пойди заставь ссылку ссылаться на другой объект?

на уровне машинного кода? Легко. На уровне исходного? Ещё проще.

Абсолютно так же, как и классами, главное спецификаторы доступа в нужных местах расставить.

я в курсе. Кстати я их по любому всегда расставляю, т.ч. могу поменять s/class/struct/, без разницы (:

Я не хочу тебя расстраивать, но по-умолчанию генерируемый компилятором operator= в плюсах

это говно нужно только как костыль для совместимости с сишечкой.

и деструктор.

который ничего не делает? Кстати, фишка в том, что он действительно НИЧЕГО не делает, и даже не наследуется. Такие очень милые грабли для любителей «удобных умолчаний» (:

«Безопасность» тут в том, что ты не сложишь строку с числом, например.

не. Это очень хорошо конечно, просто мы называем одно и то же разными именами. И да, ты слышал про оператор преобразования? Например строки в число. Или числа в строку... Попробуй, всё очень классно будет крякать (:

emulek
()
Ответ на: комментарий от qulinxao

усложнив жизнь другим.

пример?

вот я чёт книжэчку

я рад. Что, ничего поновее не нашлось? Ну страдай с синтаксисом из 50х...

emulek
()
Ответ на: комментарий от emulek

На уровне исходного? Ещё проще.

О да, я ждал этого момента. Код в студию!

И да, ты слышал про оператор преобразования? Например строки в число

Вот честно, за те пять лет, что пишу на плюсах за деньги, в определении операторов преобразования типов необходимость ни разу не вставала. Уж лучше явный метод написать.

yoghurt ★★★★★
()
Ответ на: комментарий от qulinxao

забавно , как приёмы облегчения парсинга с одной стороны и привычка кодером в строке_кода (для сей) a=a+1 по разному распарсивать имя в левой части и в правой части .

парсинг тут не при чём. Ты понимаешь, почему есть разница между 27 и 5 здесь:

27 / 5;
ы?

emulek
()
Ответ на: комментарий от emulek

мелко про синтаксис из 50ых , ты ещё скажи , что буквы которыми мы сейчас тут тред наполняем уже не модные.

листани всёж книженцию - в ней плотность полезной инфы в разы больше чем в современых мануалах пту-подобных.

qulinxao ★★☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.