LINUX.ORG.RU

Посоветуйте толковые книги на русском/английском по Си++ (Cxx11)

 ,


13

11

Посоветуйте толковые книги на русском/английском по Си++.
Чтобы был нормальный перевод и содержание.
У меня где-то лежит каталог с O'Reilly, надо бы посмотреть среди них. Ещё что-то брал по акции «книга за 1 рубль» в books.ru

В двух словах - я старпёр, который изучал Си/Си++ в 1996-1997 году по книжкам:
* В.В.Подбельский Язык Си++ (Финансы и статистика)
* Беляков М.И., Рабовер Ю.И., Фридман А.Л. Мобильная операционная система
* немного смотрел русский перевод Керниган-Ритчи в бумажном виде в библиотеке когда интернетов не было, а свою книгу купить - стипендия не позволяла
* в 2004-2005 году читал книгу Страуструп Б. Дизайн и эволюция С++

Все эти книги читал в бумажном варианте.

По работе писал только на Си с классами и на Паскале с классами (+Делфи). Сейчас хотел бы по-изучать Си++, чтобы понимать современный код. Какие книги посоветуете? Интересует компактное изложение фундаментальных основ, желательно - на русском языке. Или что-то не очень тяжёлое на английском (чтобы не надо было переводить каждое слово со словариком). Надеюсь, понятно объяснил. Спасибо.

Просто я встретил на днях код вида

A::B::C::D ...
, и понял, что пора догонять поезд. На университетских знаниях 20-летней давности сейчас делать почти нечего. Хочу перестать заниматься быдлокодерством, и начать осваивать современные знания.

Ещё - есть ли краткая табличка с основными различиями в стандартах (Comparison table/list)? Или лучше просто прочитать для начала Wikipidia:C++11, и составлять такую таблицу самому?

За что браться не следует однозначно новичку, что освоить для быстрого JFF-эффекта, если хорошо знал в своё время Си с классами? Нравится концепция namespaces. Ещё хотелось бы впоследствии плавный переход на какую-то функциональщину, чтобы знания по современному Си++ пригодились. Какие концепции/подходы есть общие?

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

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

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

так кто мешает-то

А мешать должен обязательно «кто»? Мешает «что» - то, что в таком стиле писать довольно неудобно.

tailgunner ★★★★★
()

Если C++11 то Стивен Прата Язык программирования C++ лекции и упражнения. По C++17 какая то книжка Яцека Галовича недавно вышла, но она больше как сборник рецептов, а не учебник.

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

в том же Rust функциональнщины куда больше, чем в C++

Немудрено, если там повсюду торчат уши всяких ML'ей. Option, например, еще в Standard ML используется.

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

На шаблонах даже примитивные dependent types наворотить можно.

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

Покажите что ли живой код на раст в функциональном стиле. Система типов вообще-то ортогональна ФП, даже динамическая параша может быть функциональной (erlang, elixir).

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

Одни futures-rs из Rust чего стоят с явным закосом под монаду. Чистой монадой не называю только по тому, что вычисления Future надо постоянно заново создавать после применения, тогда как в Haskell любое грамотно написанное вычисление можно использовать повторно. Зато не нужен сборщик мусора.

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

Немудрено, если там повсюду торчат уши всяких ML'ей.

Грейдон - старый окамльщик, первая версия компилятора Rust (хотя никто не узнал бы в том Rust нынешний) была написана на Ocaml. Так что Rust - это Ocaml с закосом под C++ («Ocaml in C++ clothing», как сказал Грейдон).

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

Таблица самых важных нововведений: rvalues

Было ещё в C, куда пришло из какого-нибудь Алгола 58.

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

Таблица самых важных нововведений: rvalues

Было ещё в C

Как доступного для программных манипуляций типа - не было.

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

Мои определения из стандарта.

А ты просто малограмотен.

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

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

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

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

В C++11 стало возможным переопределять семантику rvalues?

Я то думал, сейчас закат солнца вручную какой покажут

К чему ты это вообще написал?

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

это вообще не про типы.

«An rvalue reference is a compound type very similar to C++'s traditional reference.»

Howard E. Hinnant, Bjarne Stroustrup, and Bronek Kozicki

Сейчас ты начнешь вилять, что rvalue reference - это про типы, а rvalues - таки нет?

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

Сейчас ты начнешь вилять, что rvalue reference - это про типы, а rvalues - таки нет?

Это ты начал вилять, лол.

И таки нет, rvalues — это не про типы. Тебе мало было цитаты из драфта 1996-го года? Ну так открой свежий драфт. С тех пор в принципе ничего не изменилось. rvalues — это выражения (expressions).

http://eel.is/c draft/expr#basic.lval-1

Expressions are categorized according to the taxonomy in Figure

expression: glvalue, rvalue (лень рисовать ascii-артом).

В общем, ты безграмотен. Не отличаешь Гоголя от Гегеля.

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

Одни futures-rs

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

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

Таблица самых важных нововведений: rvalues

Было ещё в C, куда пришло из какого-нибудь Алгола 58.

Дык, в той же работе «Fundamental Concepts in Programming Language» от 1967 года, ссылку на которую я приводил выше (продублирую, https://www.itu.dk/courses/BPRD/E2009/fundamental-1967.pdf), автор оперирует терминами L-values и R-values.

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

Её вообще не было. Как можно сказать, можно что-то переопределить или нет, если этого чего-то нет?

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

По сравнению с тобой любая PHP-макака хорошо знает C++.

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

Чем? ООП vs типажи, темплэйты vs. генерики, исключения vs. Result как АлгТД. В чем сходство, любопытства ради?

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

ООП vs типажи

темплэйты vs. генерики

ООП никто не заставляет использовать, трейты - те же интерфейсы. Шаблоны позволяют делать практически всё, что генерики (или даже совсем всё).

исключения vs. Result как АлгТД

Никто не запрещает использовать Result. Недавно читал статью по std::outcome - как оказалось, в совершенно диком количестве случаев (47%, ЕМНИП) использование исключений запрещено полностью или частично.

В чем сходство, любопытства ради?

Всё, что можно выразить на Rust, можно очень похоже выразить на Си++. Кроме контроля компилятора, конечно.

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

Так это вы на раст посмотрели и такие: опа, так можно было! И теперь у тебя раст похож на C++, хаха. В то время как в старом коде либо си с классами, либо закос под жаву. Ниче похожего на раст.

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

в совершенно диком количестве случаев (47%, ЕМНИП) использование исключений запрещено полностью или частично.

Случаем, не объясняется ли, почему?

Тот же гугел в своих гайдлайнах пишет, что вот мы в эксепшны не очень, потому что часть кода писалась изначально не exception-safe, так что теперь это дело вводить боязно (а переписывать не берутся)

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

(т.е. мотивация именно не в платформенных или перфоманс-ограничениях, а именно из-за небезопасного легаси)

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

ООП никто не заставляет использовать

Ну да, можно и на Расте писать в структурном стиле. Но обычно-то ООП используют.

трейты - те же интерфейсы

Опять же, принятая ли это практика в реальных проектах, использование интерфейсов в пику наследованию реализации?

Шаблоны позволяют делать практически всё, что генерики (или даже совсем всё).

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

Никто не запрещает использовать Result. Недавно читал статью по std::outcome - как оказалось, в совершенно диком количестве случаев (47%, ЕМНИП) использование исключений запрещено полностью или частично.

Исключения хотя бы являются каким-никаким продуманным механизмом для решения очень важной задачи, а что взамен предлагают лучшие СИ++ умы? Кроме кодов ошибок?

Всё, что можно выразить на Rust, можно очень похоже выразить на Си++. Кроме контроля компилятора, конечно.

Шутки за 300 про тьюринг-полноту.

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

Случаем, не объясняется ли, почему?

Потому что сборная солянка под названием «C++» не гарантирует, что исключения будут всегда работать как в какой-нибудь джаве или питоне, предсказуемо и безопасно для программы. Это же всё описано и не раз. Даже я что-то слышал).

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

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

Virtuos86 ★★★★★
()

А еще в Си++ хотят try operator. Народ хардкорно упоролся по Расту %)

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

Ну да, можно и на Расте писать в структурном стиле. Но обычно-то ООП используют.

Rust - это облегченный Си++, без исторических напластований и бессмысленных TIMTOWTDI, но сделанный людьми с профильным образованием и на современной компиляторной технологии.

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

Я же сказал: std::outcome. И std::expected тоже.

Шутки за 300 про тьюринг-полноту.

Это было ожидаемо.

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

rvalue это конкретная фича C++, ещё в драфте 96-го года.

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

Случаем, не объясняется ли, почему?

В документе есть глава об этом. И я ошибся - не 47%, а 32%.

Если интересно: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0709r0.pdf

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

TIMTOWTDI

В расте та же срань. Просто цпп совсем уже адова помойка после всех цппох, но для незамутненного крестами разума раст — это трындец.

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