LINUX.ORG.RU

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

 , ,


0

2

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

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

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

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

Лучше константная ссылка. :)

А если передается объект? И в каких случаях используется первый пример, или это совсем неправильно?

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

Для простых небольших объектов (int, char, long, doble) лучше передача по значению, для остальных по константной ссылке. Если объект нужно изменять внутри функции (лучше этого избегать), то ссылка (или указатель в случае, который я выше описал).

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

А так вообще не пишут void NiceMethod(int number);? И почему стоит избегать изменения переданного объекта в функции, это каким-то образом может фаберже защимить или что?

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

А так вообще не пишут void NiceMethod(int number);

Не тупи, это как раз и есть передача по значению.

И почему стоит избегать изменения переданного объекта в функции

Такой код сложнее для восприятия. Почитай Боба Мартина.

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

А так вообще не пишут void NiceMethod(int number);? И почему стоит избегать изменения переданного объекта в функции, это каким-то образом может фаберже защимить или что?

При передаче по значению, происходит копирование объекта. Для простейших типов int, char и т.п., это ок. А вот если у тебя развесистый объект, то копировать его может быть глупо или вообще не нужно.

P.S. Почитай про конструктор копирования и когда он вызывается.

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

Если объект нужно изменять внутри функции (лучше этого избегать), то ссылка

Готов ломать пальцы тем, кто делает аргументы-ссылки. В вызывающем коде это крайне неочевидно. А вот явная передача указателя как бы намекает читателю: а этот аргумент походу in-out.

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

Лучше константная ссылка.

Ну нет же.

Константная ссылка нужна для объектов в c++03. Для примитивных типов не нужна совсем и «есть варианты» для объектов в c++11 и дальше.

Указатель - если нужна возможность передать nullptr.

Мне у Маерса понравилось объяснение: «если объект обязательно должен быть – используйте ссылку, если объекта может не быть (nullptr) – используйте указатель». Тоже самое, но, имхо, очевиднее.

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

Готов ломать пальцы тем, кто делает аргументы-ссылки. В вызывающем коде это крайне неочевидно. А вот явная передача указателя как бы намекает читателю: а этот аргумент походу in-out.

В смысле? Тебе не очевидно, что неконстантная ссылка скорее всего in-out?

Stil ★★★★★ ()

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

&i + &j
в основном для перегрузки операторов, нет?

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

В смысле? Тебе не очевидно, что неконстантная ссылка скорее всего in-out?

struct XXX x;
foo(x);

Не очевидно.

struct XXX x;
foo(&x);

Наводит на мысль.

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

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

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

И постоянно проверять на nullptr?

Если аргумент обязательный in-out, то можно и не проверять (невалидную ссылку/указатель ведь все равно не проверишь). Если аргумент опциональный, то проверить конечно нужно (опциональную ссылку ты не сделаешь вообще).

Ну уж дудки.

Это лучше бардака в вызывающем коде.

staseg ★★★★★ ()

труп страуса

гениталенгениален

Язабан этого клоуна.

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

vim'о-проблемы и отсутствие-документации-проблемы. IDE по ctrl-q все покажет.

Отсутствие опыта работы с кодом-проблемы. Здоровый человек пробежится по коду взглядом и потыкает ctrl-q в двух действительно интересных местах. Курильщик протыкает весь исходник. Что будет делать курильщик, если нужно что-то исправить/посмотреть быстро и решительно без доступа к своей любимой IDE, даже подумать страшно.

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

Готов ломать пальцы тем, кто делает аргументы-ссылки.

Боюсь, надолго тебя не хватит.

DarkEld3r ★★★★★ ()

C++ это не твоё. Пиши на похапешечке.

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

Страуструп, насколько помню, в предисловии пишет что читатель должен знать С перед чтением книги, и все что в С и С++ одинаково либо не описывается либо описывается бегло. Ссылки и указатели пришли из С, вот и не задерживается автор на них. ИМХО, Страуструпа стоит читать только после K&R

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

IDE по ctrl-q все покажет.

Хорошо, скажу иначе. Без ctrl-q не видно. Ты код вообще не читаешь что ли? Только пишешь?

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

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

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

Ссылки и указатели пришли из С

Опять врешь. В Си нет ссылок. Совсем.

Страуструпа стоит читать только после K&R

Ты, похоже, не читал ни то, ни другое.

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

vim'о-проблемы и отсутствие-документации-проблемы.

Это проблемы тех, кто vim только на картинках видел.

IDE по ctrl-q все покажет.

Вот прямо любая ide по этому хоткею покажет?

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

Вот прямо любая ide по этому хоткею покажет?

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

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

Так тебе о том и говорят.

std::string value;
auto s = db->Get(read_opt, key, &value);
vs
std::string value;
auto s = db->Get(read_opt, key, value);

Что понятнее?

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

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

Значит vim и есть «любая нормальная ide», а вы его даже на картинках не видели.

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

Тут как минимум непонятно, что за 's'. А так в обоих случаях одинакого понятно, иначе зачем вообще передавать в get пустую строку.

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

Видел, видел, даже ctags прикручивал. Более убогого автокомплита придумать трудно.

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

andreyu ★★★★★ ()
Ответ на: Re: Что понятнее? от anonymous

Re: Что понятнее?

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

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

Автокомплит в виме как минимум не хуже большинства других ide

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

Прежде чем вякать про вим, разберитесь в теме.

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

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

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

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

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

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

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

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

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

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

Вот вы опять ляпнули несусветную чушь

Воот, эта та же ситуация что с вимом, только доведеная совсем до абсурда. Вимом конечно еще как-то можно пользоваться. При желании и хороших способностях к самообману.

А зря, нужно было молчать

Ну вот на это:

А если большинство других ide не умеет комплит на базе clang - то комплит у них и вовсе говно.

я предпочел промолчать. Что тут сказать еще — типичный синдром утенка и фанбойство.

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

Ну допустим, «много» это раз 5, значит будет 5 ссылок:

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

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

Ты правильно сделал, что добавил «походу».

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

Что тут сказать еще — типичный синдром утенка и фанбойство.

Синдром утенка у вас. Вы снова говорите о том, в чем совершенно не понимаете.

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

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

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

текстовый редактор

не предназначен для написания кода

Святая толстота.

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

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

И много инструментов вы выбрали? Сколько инструментов вы вообще использовали в своей жизни? :)

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