LINUX.ORG.RU

Лучшая книга по C++


1

9

Решил взяться за изучение C++, серьезное (а не ради развлечения) изучение, с целью последующей работы прогером C++. Не могу выбрать книгу, их очень много, на разного уровня подготовки изучающего. На форумах конкретики по тому или иному автору не дают, в духе «этот автор плох тем-то, тем-то», а лишь флуд и взаимное кало-метание друг в дружку.

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



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

для начального обучения вроде бы слишком сложна, не?

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

gamedev на С или C#? видео/аудио плееры/редакторы, 3d-редакторы, браузеры на чем писать?

Многие вещи пишут на Си++ по привычке, да и в силу нежелания писать на чем-то другом. Также этому способствует наличие бесплатных хороших компиляторов. Вон, попробуй-ка попиши бесплатно коммерческий продукт на аде, а ведь она почти ни в чем не устапает плюсам. Self-reinforcing loop.

Кстати, C# очень неплох. 3-d редактор написать вполне возможно. Не вижу препятствующих этому причин.

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

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

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

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

Понимание крестов, явно предполагает понимание хотя бы поверхностное работы железа

Шел 2012 год, а кресты всё называли высокоуровневым ЯП...

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

Кстати, C# очень неплох. 3-d редактор написать вполне возможно. Не вижу препятствующих этому причин.

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

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

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

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

Попробуй сделать то же самое с любым другим ЯП.

пишем критичные части на C, лепим при помощи FFI: профит.

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

Шарпы _уже_ умеют гораздо больше, чем енти ваши фреймворки

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

это проблема не языка, а его реализации

О да, давайте писать на шарпе. А запустим потом, когда нормальная реализация появится.

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

это проблема не языка, а его реализации

В шарпе как раз реализация хорошая, но как вы написали - анально завязана на оффтопик.

А вот язык - говно. Тащат в него каждый год всё больше и больше, как Страуструп в свое время.

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

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

Редактор 3d почти всегда будет привязан к системе. Qt - не решение. На маках я бы не стал использовать приложения Qt, а предпочел бы родные на Cocoa.

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

Редактор 3d почти всегда будет привязан к системе.

А разрабы блендера то и не знали!

На маках я бы не стал использовать приложения Qt, а предпочел бы родные на Cocoa.

А кривой моно для до-диеза стал-бы?

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

А кривой моно для до-диеза стал-бы?

Передергиваешь. На маках вместо Си++ есть Objective-C. Соответственно, вместо C# будет Obj-C.

Что касается блендера, то там есть выбор?

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

Передергиваешь

Нет ты. Дискуссия про до-диез, а ты про кути.

Что касается блендера, то там есть выбор?

Выбор чего?

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

а ведь она почти ни в чем не устапает плюсам

Если считать метапрограммирование на шаблонах почти ничем - то верно, а так в системе типов Ады не выразить кортежей и итерации по ним, контейнеров типов, expression templates.

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

В принципе, платформы типа .NET (managed-среда с обширной стандартной библиотекой и стандартными же интерфейсами взаимодействия) Линуксу не хватает.

А чем это лучше jvm?

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

Если считать метапрограммирование на шаблонах почти ничем - то верно, а так в системе типов Ады не выразить кортежей и итерации по ним, контейнеров типов, expression templates.

Там с 83 года есть генерики. А метапрограммирование в плюсах иногда бывает таким, что лучше его не видеть :) (да, Александреску читал, и мне даже где-то понравилось)

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

А в других мейнстримовых языках и того нет, занимайтесь кодогенерацией на руках. Если конечно не считать Haskell, Racket, CL мейнстримом.

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

но как вы написали - анально завязана на оффтопик.

дык, в этом и проблема :)

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

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

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

Там с 83 года есть генерики

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

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

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

Тот же притянутый за уши linq совершенно ортогонален синтаксису С#, да и семантике во многих случаях тоже. По сути целый язык в языке.

Тот же F# вполне мог бы стать заменой, но увы.

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

Что я слишком много «тот же» стал употреблять.

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

Тот же притянутый за уши linq совершенно ортогонален синтаксису С#, да и семантике во многих случаях тоже.

а, это есть, да

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

Тот же притянутый за уши linq совершенно ортогонален синтаксису С#, да и семантике во многих случаях тоже. По сути целый язык в языке.

Ортогональность синтаксисов LINQ и C# это мелочь, по сравнению с тем удобвством, что даёт LINQ(и скоростью, местами).

Norgat ★★★★★
()
Ответ на: комментарий от dave
declare
-- the user construct his own matrix type
type Range3 is range 0 .. 2;
type Matrix33 is array (Range3, Range3) of Integer;
-- then he build a specification package for his matrix,
-- this package will be used later when building high order
-- operations on matrices.
package Matrix33_Spec is new Matrix_Type (Values => Integer,
Height_Range => Range3,
Width_Range => Range3,
Array_Type => Matrix33);
-- Define two dummy matrices.
B : Matrix33 := ((1, 0, 0), (0, 1, 0), (0, 0, 1));
C : Matrix33 := ((0, 1, 0), (0, 0, 1), (1, 0, 0));
-- Instanciate a package for the B matrix
-- (we map an object to a package)
package B_Inst is new Matrix_Instance (Matrix33_Spec, B);
-- the above package can the be used as a Matrix_Expression,
-- it defines a Expr subpackage for this purpose.
package B_Expr renames B_Inst.Expr;
-- idem with the second matrix
package C_Inst is new Matrix_Instance (Matrix33_Spec, C);
package C_Expr renames C_Inst.Expr;
-- Build the expression B*5
package B5_Inst is new Scalar_Binary (B_Expr, 5, "*");
package B5_Expr renames B5_Inst.Expr;
-- Build the expression B*5+C
package Res_Inst is new Binary (B5_Expr, C_Expr, "+");
package Res_Expr renames Res_Inst.Expr;

A : Matrix33; -- where the result will be stored
begin
[...]
Res_Expr.Assign (To => A);
end;

Это код для записи выражения B * 5 + C, Ада рулит теперь С++ точно капец.

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

c другой стороны, можно вспомнить тот же loop в CL :)

Я loop тоже не очень жалую. Iterate, хоть может местами и послабее, более композабельный и понятный (мне).

unlog1c ★★★
()

Р. Лафоре - Объектно-ориентированное программирование на C++. Серия «Классика Computer Science». Правда, в 4м издании в конце каждой главы есть тесты, в которых допущены некоторые ошибки(исходя из ответов на тесты, получаются взаимоисключающие параграфы между содержанием главы и ответами теста). А в целом - книга понравилась, небольшая, страниц 600-800 всего, есть задания, которые несложно выполнить, зато хорошо «набивают руку». Говорят, там даже диск с листингами и откомпиленными прогами в комплекте должен быть, правда, мне он не достался.

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

Бугага. Ты сначала хотя бы погуглил, кто такой mv, где он живет и где работает и главное на чем пишет, а потом уже рассказывай о том как у тебя чего то там получается


Ну и кто он такой?

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

Ну, меня тоже размер удивил :) Тут можно сказать, что успешно работает парадокс Блаба. Можно писать на Аде и оставаться в счастливом неведении относительно expression templates и traits class (без понятия, что это такое).

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

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

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

Можно знать C и Python, и они оба вместе перекроют нишу C++.

fixed

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

C++ - это не язык который можно профессионально освоить за пару месяцев, большинству требуется минимум месяцев 6-12 практики .

ололо, 3-5 лет практики не хочешь? (это если в нормальной команде)

а допрежь этого срока - это всё личинка разработчика

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

Я осведомлен о его сложности, но всеже, чем он так сложен то?

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

Я например C# знаю на хорошем уровне, это будет плюсом или минусом в изучении C++?

будешь спотыкаться об управление ресурсами на каждом шагу и набьёшь «шышек», но зато станешь лучше понимать C# (если запала хватит)

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

Можно знать C и C#, и они оба вместе перекроют нишу C++.

ага, особенно под Solaris или AIX :)

shty ★★★★★
()

книга должна быть на русском

Рано тебе C++ учить. Сначала английский освой. Те, кто на английском свободно читать не могут, программировать не имеют права.

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

ЗЫ Если освоить кресты, то подавляющее большинство ЯП после него осваиваются с пол пинка.

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

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

Ты, видимо, так и не допер.

фу-фу, переход на личности, беее

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

Я осведомлен о его сложности, но всеже, чем он так сложен то?
Я например C# знаю на хорошем уровне, это будет плюсом или минусом в изучении C++?

Начнем с того, что C++ - очень громоздкий язык. Один только стандарт языка, ЕМНИП, занимает тысячи полторы страниц текста. Конечно разработчику не нужно знать досконально все тонкости стандарта от корки до корки, но представление хорошее нужно иметь. Что-бы знать о возможных подводных камнях, равно как и иметь возможность реализовать оптимальное решение.

C++ предоставляет кучу возможностей, отсутствующих в многих других production level языках (кроме Ada пожалуй, хотя то, что умеет C++11 в Ada тоже не скоро появится). И такая смесь имеет кучу подводных камней возможных «на стыке возможностей». Среди таких фич, можно указать хотя-бы:

1. перегрузка операторов, в том числе такие вещи как операторы приведения типа (вроде «operator std::string») 2. STL, именно в том виде как он есть - с кучей своих концепций: итераторов, алгоритомв, функторов итп. 3. множественное наследование 4. заморочки с дефолтными конструкторами копирования итп. 5. шаблоны.В Java/C# есть конечно Generics (не помню как оно в C# точно зовется), но по факту - синтаксис шаблонов куда обширнее, и по сути - шаблоны в C++ сами по себе - обладают Тьюринг полнотой, и если хорошо постаратся, то можно компилятор заставить выполнять довольно сложные и продолжительные вычисления на стадии компиляции и развертывания шаблонов (ну или простой школьный пример - посчитать факториал заданного аргументом числа). 6. различные заморочки с приведениями типов: dynamic_cast<B>(a), static_cast<B>(a), reinterpret_cast<B>(a), const_cast<B>(a), - все это вместо одного универсального b = (B)a;

итп, итп, много мелких деталей, все надо знать хорошо.

P.S. Да, меня в детстве, когда пытался начать осиливать глубоко C++, будучи еще школьником, сломало мозг наличием указателей и ссылок в языке - я тогда не понял, зачем нужно два похожих но отличных понятия в языке, зачем нужны ссылки, когда есть указатели, и наоборот, злобно захлопнул книгу, и принялся глубоко изучать чистый C, а к C++ вернулся только через несколько лет.

Что касательно будет ли толк от C++ - если работать продолжите C# разработчиком - то C++ лучше не трогать и не забивать им голову.

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