LINUX.ORG.RU

C++ ссылки и указатели

 , ,


0

2

Читаю труп страуса и не могу понять вот что(видимо автор для меня слишком гениталенгениален): в каких конкретно случаях блин предпочтительнее указатели а в каких ссылки? Из его книги я лишь понял что можно делать и то, и другое, но ни слова о том, в каких случаях что предпочтительнее использовать... Герберт Шилдт и тот доходчивее объясняет чем создатель, и эту книгу тут лоровцы еще новичкам тычут, троллинга ради видимо...

Допустим, есть некий метод с аргументом int, как его правильнее объявить, что бы потом юзать в других классах, варианты: 1.

void NiceMethod(int number);
2.
void NiceMethod(int *number);
3.
void NiceMethod(int &number);
???



Последнее исправление: ioexception (всего исправлений: 1)

Ответ на: комментарий от backburner

Достаточно, чтобы судить о синдроме утенка.

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

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

Синдром утенка у вас, а вы этого не замечаете

Все уже сказал про наличие у меня синдрома утенка. Я же не так просто пишу про синдром утенка, тред про разработку под android в vim'е я хорошо помню.

которые вы в лучшем случае видели на картинке

Додумать что-то о собеседнике конечно иногда работает, но в основном годится только для самообмана. Как в этом случае.

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

Все уже сказал про наличие у меня синдрома утенка.

Забавно, про синдром вспоминаете постоянно вы, а виноват в этом я.

Я же не так просто пишу про синдром утенка,

Вот опять.

тред про разработку под android в vim'е я хорошо помню.

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

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

а виноват в этом я.

в том что сразу отвечаете в духе «сам такой». хотя контр-пример был приведен сразу же.

не понимая, какой смысл несет эта аббревиатура.

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

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

в том что сразу отвечаете в духе «сам такой». хотя контр-пример был приведен сразу же.

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

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

Судя по вашей реакции, я оказался прав.

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

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

Назвал говном IDE без clang'а — это называется «указал»? Плохо указал. Пока всё выглядит банально — задета священная корова «vim», и в расстроенных чувствах пошла бестолковая демагогия и приписывание собеседнику неких отрицательных качеств. К тому же я вижу непонимание того, что такой «синдром утёнка».

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

Кстати да, тут я ошибся, это другой вимер был.

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

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

1. При передаче объекта по значению, объект копируется в стек. Соответственно, любые манипуляции с этой копией объекта не приведут к изменению исходного объекта. Но если объект большой (т. е. больше встроенного типа char, int, double и т. д., например объект класса, структура или массив), то передача по значению занимает много времени, а главное может быстро привести к переполнению стека и к краху программы.

2. При передаче объекта по ссылке (&) в стек передаётся не копия объекта, а адрес исходного объекта. При этом если в прототипе функции стоит что-то вроде func(int& a), то в вызове функции надо писать func(a) (без амперсанда). Равно в теле функции к a обращаются, как будто она передана по значению (см. 1-ый пункт), но при этом реально передаётся адрес исходной переменной, а значит любые манипуляции могут изменить её. Передача по ссылке проще и безопаснее, чем передача по указателю, но вызов функций выглядит так же, как вызов функций, принимающих аргументы по значению, что иногда может запутать (об этом здесь уже писали), но всё равно, имхо, в большинстве случаев это лучше, чем указатели. Если объект, передаваемый по ссылке, функция не модифицирует, то следует в прототипе функции написать ключевое слово const: func(const type &a). Тогда при попытке модификации компилятор выдаст ошибку.

3. При передаче обекта по указателю (*), в стек, как и при передаче по ссылке, передаётся адрес исходного объекта. В этом случае прототип функции выглядит как func(int* a), а при вызове надо писать func(&a), где & указывает на то, что мы передаём адрес объекта, а не сам объект (в варианте 2, по ссылке, этого делать было не надо, т. е. это делалось, но не программистом, а компилятором). В теле же функции для получения или изменения значения переданной переменной мы пишем *a, если же мы напишем a, то мы получим адрес этой переменной. В большинстве случаев указатели хуже ссылок, но есть 2 случая, когда они необходимы:

а.) Как здесь уже говорили, если мы допускаем возможность передачи пустого указателя (NULL), то через ссылки это сделать невозможно. Кстати, из этого следует, что при передаче указателей их всегда надо проверять на NULL, а при передаче ссылок - не надо.

б.) При передаче по указателю мы можем обратиться не только к *a, но и к *(a+1), *(a+2) и т. д., что эквивалентно a[1], a[2] и т. д. Мы можем даже обратиться к *(a-1) (т. е. к a[-1]). Т. о. мы можем передавать указатели на массивы. При передаче же по ссылке мы ограничены только переданным адресом и не можем его индексировать. Это, кстати, одна из причин, почему надо пользоваться ссылками, когда объект не является массивом: уменьшается вероятность трудно обнаружимых логических ошибок, а ошибки, связанные с неправильной работой с указателями/массивами наиболее типичны для новичков в Си/Си++ (а порой и для не новичков).

Что касается того, следует ли в вызываемых функциях менять передаваемые по указателю/ссылке переменные, то всё зависит от задачи. Если без этого можно обойтись, то не следует. Например, функция, умножающая аргумент на 2, не должна его модифицировать, а должна возвращать результат return'ом. В то же время, иногда функция должна возвратить сразу несколько значений. В этом случае без модификации параметров, переданных по ссылке/указателю, не обойтись. То же касается случаев, когда надо модифицировать переданный объект/структуру. Впрочем, для перемещения и возврата таких объектов без создания лишних копий введены так называемые rvalue-ссылки (обозначаются &&), о которых в этом треде тоже уже упоминали.

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

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

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

совершенно необходим гуй для дебаггера: чтобы содержимое памяти можно было смотреть в графическом виде.

дай ссылку на хороший интуитивный GUI для настройки вима

еще нужна графическое меню для выполнения всех команд (особенно рефакторингов)

еще нужны всплывающие подсказки при наборе кода (хелпы итп), графический навигатор по структуре классов, построитель диаграмм классов

переход по ctrl+click тоже нужен

еще хочу графический навигатор по файлам проекта

и чтобы все окна (код, выхлоп программы, навигатор по файлам проекта, итп) можно было таскать мышкой

и вообще чтобы команды не надо было набирать с клавиатуры, а щелкать по кнопочкам на тулбаре: например кнопочки для запуска программы и хождения в дебагере

надеюсь в виме всё это есть? это только первое что пришло в голову...

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

Вы говорите об инструменте не зная его

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

Иногда вижу как люди ищут _хоть какие-то_ плагины для vim'а чтобы выполнить нужную им задачу.

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

совершенно необходим гуй для дебаггера: чтобы содержимое памяти можно было смотреть в графическом виде.

Увы, дебаггер есть только в вижле. Во всех остальных ide только кривая морда поверх gdb или lldb - что хочу, то и показываю (тут я передаю пламенный привет отладчику в xcode).

дай ссылку на хороший интуитивный GUI для настройки вима

Какое отношение наличие или отсутствие gui (да еще и для конфигурации) имеет к ide?

еще нужна графическое меню для выполнения всех команд (особенно рефакторингов)

«А с перламутровыми пуговицами у вас есть?»
При чем тут гуи?

еще нужны всплывающие подсказки при наборе кода (хелпы итп),

Да пожалуйста.

графический навигатор по структуре классов,

Вот поясните мне, что значит графический навигатор и чем он отличается от не графического?

построитель диаграмм классов

Это задача ide?

переход по ctrl+click тоже нужен

А если переход будет по <ladder>jd то не считается?

еще хочу графический навигатор по файлам проекта

А чем графический навигатор отличается от не графического?

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

Я понял, что бы получить лэйбл ide нужно умение реагировать на мышку.

надеюсь в виме всё это есть?

Хочу что бы асфальтоукладчик ездил со скоростью болида.

это только первое что пришло в голову...

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

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

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

Вы из тех танцоров, которым пол мешает.

Иногда вижу как люди ищут _хоть какие-то_ плагины для vim'а чтобы выполнить нужную им задачу.

Ага, смотрю на вижло-пользователей и вижу как они ищут плагины для комплита и рефакторинга.

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

тред про разработку под android в vim'е

Ссылочку, пожалуйста.

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

в предисловии пишет что читатель должен знать С перед чтением книги

Нет. Врешь. Он как раз считает, что Си знать для изучения C++ не нужно.

Попутал немного. У него вот такая формулировка:

Данная книга в первую очередь рассчитана на профессиональных программистов, желающих изучить новый язык

На чистом С я действительно ни разу не писал

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

При передаче же по ссылке мы ограничены только переданным адресом и не можем его индексировать.

Это C++, «не можем», только если не хотим:

#include <iostream>

void func(int &a)
    {
    for(int i = -2; i <= 2; ++i)
        std::cout << (&a)[i] << std::endl;
    }

int main()
    {
    int array[5] = {11, 22, 33, 44, 55};

    func(array[2]);

    return 0;
    }
cdslow ★★
()
Ответ на: комментарий от cdslow

Это C++, «не можем», только если не хотим

Век живи - век учись! Никогда не использовал таких конструкций. Хотя мог бы и догадаться. :-) Но в любом случае, случайно обратиться не к той ячейке памяти при использовании ссылок сложнее, чем при использовании указателей. Спасибо за поправку.

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

Тащем-то ссылки — синтаксически сахарок, чтоб не писать что-то типа

как ты без ссылок сделаешь функцию lvalue?

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

но элементарно посмотреть сигнатуру можно в любой нормальной IDE.

в т.ч. в VIM ☺

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

Ну я ж не знал что кто-то делает из редактора конфигов полноценную среду разработки, да еще испытывает к нему религиозные чувства.

просто вим БЫСТРЕЕ. Но только если осилить. Ты не осилил.

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

Да ты и sed не видел походу.

я и не сомневаюсь, что он мадайщик, который два хелловорлда в MSVS навоял.

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

совершенно необходим гуй для дебаггера: чтобы содержимое памяти можно было смотреть в графическом виде.

дебагер не нужен.

и вообще чтобы команды не надо было набирать с клавиатуры, а щелкать по кнопочкам на тулбаре: например кнопочки для запуска программы и хождения в дебагере

тыкать МЕДЛЕННЕЕ. В виме кстати поддержка мыши есть.

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

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

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

В виме его нет, полноценный гуй есть только у имакса. Попробуй в виме пдф с картинками открыть.

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

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

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

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

На самом деле нужна IDE с редактором уровня vim или emacs. Не понимаю, почему до сих пор такой нет(режимы vim'а в некоторых IDE совсем не то).

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

а иначе их уделает любая кодеблокс

Не уделает. Скажу как пользователь vim-а, CB и Visual Studio. Но тебе пока рано в IDE, судя по твоим постам на ЛОРе, иначе веб-макака может получиться.

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

Emacs крут, конечно. Но вот для того же C++ его полноценно настроить просто нереально. Будет отваливаться то тут, то там.

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

Попробуй в виме пдф с картинками открыть.

Каким образом это относится к гуи? Судя по этому пассажу, твоя компетенция в программировани нулевая.

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

На самом деле нужна IDE с редактором уровня vim или emacs. Не понимаю, почему до сих пор такой нет(режимы vim'а в некоторых IDE совсем не то).

Потому, что есть vim. Да и половина «программистов» (скажу по огромному секрету) сами боятся консоли и ничего, кроме мышковозанья не умеют, а код пишут двумя или даже одним пальцем.

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

Я сам пишу в emacs, как правило. В vim разве что конфиги правлю и скрипты простенькие пишу, на серверах.

Но вот в чужом коде, особенно если это C++ или, не дай бог, ява, без IDE тяжеловато разбираться. Решение для C++ и в vim и в emacs слабоваты.

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

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

10 пальцами. И какой смысл дергать мышку на каждый сих мне не ясно. Это же долго и бесит.

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

Это же долго и бесит.

Объясняю идиотам раз и навегда: хоткеев на все возможности не хватит, и тут либо неделю править конфиг, либо щелкнуть пару раз мышкой изменив параметры в меню.

ioexception
() автор топика
Ответ на: комментарий от Freyr69

В нано нет гуя и графики, в имаксе есть.

в emacs есть всё, кроме текстового редактора.

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

Лучше неделю поправить конфиги, чем годами мышкодрочить.

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

Потому что его нет в виме, или потому что ты не нашел нужный плагин?

потому что ошибки проще искать смотря в текст программы.

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

Каким образом это относится к гуи?

А ты можешь без гуя картинку открыть? Ascii? Ну открой png в vimе без гуя, я посмотрю.

В виме гуй — просто окошко терминала с запущеным вимом, имакс же рисует полноценный гуй.

твоя компетенция в программировани нулевая.

Сказал человек, который не осилил указатели и заголовки.

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

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

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

Emacs крут, конечно. Но вот для того же C++ его полноценно настроить просто нереально.

А чего тебе не хватает?

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

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

А ты можешь без гуя картинку открыть?

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

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