Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Как выучить С++ на столько, чтобы его полюбить.


Автор: Tobuk 22.11.2009, 22:59
Знаю С++ на уровне классов, шаблонов перегрузок и прочего.
Знаю наследование const ссылки и прочее, но пользоваться ими не умею. (ни как не найду где их использовать)
Не люблю С++. Люблю Си.
Так бы и писал на Си, но все вокруг пишут на С++. Хвалят его. Любят его. Это не дает мне покоя.

Как же выучить С++ на столько, чтобы полюбить его?
Как найти применение всяким mutable и наследованию?
Как делать такие же вещи, как Александреску и чувствовать себя крутым программистом С++?

Автор: Void 22.11.2009, 23:55
Судя по всему, это нормально.
Цитата(http://harmful.cat-v.org/software/c++/)
If you like C++, you don't know C++. There's a mutual exclusion going on here, and I've yet to see a counter-example other than possibly a few of the members of the standards committee.

Автор: Abyx 22.11.2009, 23:56
Цитата(Tobuk @  22.11.2009,  22:59 Найти цитируемый пост)
ни как не найду где их использовать

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

Автор: niXman 22.11.2009, 23:58
А ты в своих программах попробуй использовать STL. Вот тогда поймешь что такое С++. И увидишь на сколько упрощается код программы.
Наследование - оно везде наследование. ничего нового в нем нет.
mutable - такое же г* как и const_cast<>().
Александреску - нерд.

Автор: nerezus 23.11.2009, 04:24
Tobuk, попробуй написать программу >500кб исходников ) Поймешь, что такое ООП и почему он делает мир проще ;)

Автор: Леопольд 23.11.2009, 08:59
Посмотри в сторону библиотек для С++. Boost, Ogre и т.д. на любой вкус и цвет. Напиши что нибудь с их использованием. Например Boost Asio...

Автор: Lazin 23.11.2009, 12:47
Цитата(Tobuk @  22.11.2009,  22:59 Найти цитируемый пост)
Знаю С++ на уровне классов, шаблонов перегрузок и прочего.
Знаю наследование const ссылки и прочее, но пользоваться ими не умею. (ни как не найду где их использовать)
Не люблю С++. Люблю Си.
Так бы и писал на Си, но все вокруг пишут на С++. Хвалят его. Любят его. Это не дает мне покоя.

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

Цитата(Tobuk @  22.11.2009,  22:59 Найти цитируемый пост)
Как же выучить С++ на столько, чтобы полюбить его?
Как найти применение всяким mutable и наследованию?
Как делать такие же вещи, как Александреску и чувствовать себя крутым программистом С++?

главное, нужно заниматься этим не для того, что-бы чувствовать себя крутым программистом
лично я пишу на определенном подмножестве с++, это сильно упрощает дело
пример, код на Си:
Код

// вызов А
int a = 0;
Foo(a);
// вызов Б
Foo(&a);

что можно сказать о значении переменной a, после вызова А (речь идет о Си)? то, что оно не изменится
после вызова Б, значение переменной может измениться, так-как по вызову видно, что в ф-ю передается указатель на int
теперь аналогичный код на С++:
Код

// вызов А
int a = 0;
Foo(a);
// вызов Б
Foo(&a);

теперь о значении переменной после вызова А ничего нельзя сказать, потому-что в С++ есть ссылки, и Foo вполне может принимать не константную ссылку в качестве параметра и изменять значение переменной. Поэтому, я не пользуюсь не константными ссылками в сигнатурах функций/методов, в этом случае, я могу с уверенностью сказать, изменится ли значение переменной после вызова А или нет, глядя на вызов smile 
ну и таких мелочей достаточно много

Автор: kemiisto 23.11.2009, 15:43
Цитата
выучить С++ на столько, чтобы его полюбить

Это страшный сон, товарищи! smile 

user posted image

Автор: Abyx 23.11.2009, 18:45
Lazin, проще смотреть на сигнатуру Foo
или писать
Код

// вызов А
const int a = 0;
Foo(a);
// вызов Б
Foo(&a);

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

Автор: niXman 23.11.2009, 19:06
Abyx, Да нет, не проще. Сам пользуюсь таким же принципом. Если в функцию нужно передать объект(при условии что сам объект не модифицируется), то по константной ссылке. А если предполагается изменение объекта вне самой функции, то по указателю.

Добавлено через 2 минуты и 39 секунд
kemiisto, Вам http://forum.vingrad.ru/index.php?showtopic=280599&view=findpost&p=2024764

Автор: Abyx 23.11.2009, 19:18
указатель != ссылка, такая замена только для повышения читабельности кода, в общем случае неравноценна.
конечно, если в коде ссылки можно безболезненно заменить на указатели, это другое дело, но это действительно очень узкое подмножество С++

Добавлено через 9 минут и 57 секунд
и да, редко бывают правила одинаково хорошо подходящие ко всем ситуациям.

вот например сегодня читал документацию spirit2, там сделали
Код

template <typename Iterator, typename Expr>
inline bool
parse(
    Iterator& first
  , Iterator last
  , Expr const& expr);


имхо это гораздо лучшее решение, чем было в 1.8
Код

    template <typename IteratorT, typename DerivedT>
    parse_info<IteratorT>
    parse
    (
        IteratorT const&        first,
        IteratorT const&        last,
        parser<DerivedT> const& p
    );

Автор: powerfox 24.11.2009, 00:29
Цитата(Abyx @  23.11.2009,  20:18 Найти цитируемый пост)
указатель != ссылка, такая замена только для повышения читабельности кода, в общем случае неравноценна.

В чём разница, кроме неявного приведения типов в случае константной ссылки?
Стиль, который использует Lazin, рекомендуют, наверное, в любой книге по ++. Во всяком случае Страуструп точно.

Автор: PRF 24.11.2009, 03:07
я считаю, что этот вопрос "выучить чтобы полюбить" это бред... 
вы можете полюбить жигули когда узнали все о ней полностью?)) ну грубое сравнение , но все же)) 
таких примеров можно много написать) но я не могу)) хз) я просто хотел сказать, что чтобы полюбить, точно не поможет знание о нем все, вот вы любите СИ чистый, так же наверно как я люблю С++ )) и не потому что он предоставляет там ух как много всего) но я просто получаю удовольствие если пишу на нем, + функционал))

Автор: mes 24.11.2009, 10:11
Цитата(powerfox @  23.11.2009,  23:29 Найти цитируемый пост)
В чём разница, кроме неявного приведения типов в случае константной ссылки?

1. ссылка легко оптимизируется компилятором
2. не надо проверять на нуль (или какие то дополнительные (условные) гарантии заменяющие проверку)
3. явно видно что функция не может принимать ноль как аргумент

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


Автор: Lazin 24.11.2009, 10:44
Цитата(Abyx @  23.11.2009,  18:45 Найти цитируемый пост)
azin, проще смотреть на сигнатуру Foo

не проще, вызов в одном месте, сигнатура - в другом

Цитата(Abyx @  23.11.2009,  18:45 Найти цитируемый пост)
или писать
Код

// вызов А
const int a = 0;
Foo(a);
// вызов Б
Foo(&a);

ну и как константу передать в ф-ю, принимающую не константную ссылку? smile 

Цитата(mes @  24.11.2009,  10:11 Найти цитируемый пост)
1. ссылка легко оптимизируется компилятором

указатель - то-же

Цитата(mes @  24.11.2009,  10:11 Найти цитируемый пост)
2. не надо проверять на нуль (или какие то дополнительные (условные) гарантии заменяющие проверку)

Цитата(mes @  24.11.2009,  10:11 Найти цитируемый пост)
3. явно видно что функция не может принимать ноль как аргумент

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

Автор: Luyan 24.11.2009, 21:04
Цитата(Tobuk @  22.11.2009,  22:59 Найти цитируемый пост)
Не люблю С++. Люблю Си.

думаю ты на си писал то, что тебе было интересно. имхо смотри в сторону того, что тебе нравиться, просто так себя ломать и насиловать изучая си++ не стоит.
Цитата(Tobuk @  22.11.2009,  22:59 Найти цитируемый пост)
Как делать такие же вещи, как Александреску и чувствовать себя крутым программистом С++?

"крутым" - зачем? каждый берёт от си++ своё. Посмотри вокруг себя, попробуй описать какой-нибудь процесс юзая си++, короче - попробуй программировать для души. И смотри в сторону UML.

Автор: Lazin 24.11.2009, 22:24
Цитата(Luyan @  24.11.2009,  21:04 Найти цитируемый пост)
программировать для души
вот в этом и состоит главная проблема многих программистов smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)