LINUX.ORG.RU

Какую книгу по C++ выбрать?

 ,


5

2

Какую книгу по с++ выбрать

  1. Герберт Шилдт. C++ для начинающих. Шаг за шагом
  2. Стивен Прата. Язык программирования C++. Лекции и упражнения
  3. Предложите свой вариант (учил джаву, с++ смотрел видео ну можно сказать не с нуля учу)

Перемещено hobbit из general

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

На мой взгляд ориентироваться на стандарт до C++11 - пустая трата времени.

Очевидно, новичок сразу начнет использовать семантику перемещения, variadic templates и variadic macros. Что за бред-то?

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

Во-первых я думаю, что новичку не следует изучать C++, если только он не хочет потратить на это месяцы, а то и годы :-)
Если же хочется чего-то низкоуровнего, то изучить plain C - это относительно быстро. Но раз ТС выбрал C++ (Как выбрать язык программирования? (комментарий)), то ...
Во-вторых ТС не совсем новичок (как следует из темы, на которую я давал ссылку выше)
В-третьих C++11 это не cтолько move-семантика. Это uniform (brace) initialization, shared/unique_ptr, auto, range-based «for» loop и т.п. В относительно свежих книгах всё это подается с первых же страниц.
Что же касается move семантики, то она присутствует повсюду, даже если не использовать её явным образом :-)
Банальный vector.push_back или просто возврат объекта из функции (N/RVO).

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

Человек должен сам научиться писать это сначала. Все выше перечисленное, также можно использовать из Boost и в C++98 (опять таки, после того, как человек научится ручками это писать).

Если человек использует range-based for, есть вероятность, что что обычный std::vector<T>::iterator и std::vector<T>::const_iterator его приведет в шок потом. (Он его ни разу не увидит из-за range-based for и из-за возможности использовать operator[] или метода at.)

Но даже это неправильно, пусть человек сначала научится писать template<class T> class Vector. Узнает про шаблоны, про malloc, calloc, realloc, free, про placement new, про ручной вызов деструктора, про catch(...). Это базовые вещи, которые любой C++ программист обязан знать и можно очень долго топтаться на месте, если сразу пользоваться обертками из STL.

Человек, который сможет самостоятельно написать какой-нибудь класс вроде template<class T> class Treap, который будет корректно обрабатывать исключения и правильно копировать/перемещать данные, освобождать их, гораздо ценнее человека, который ничего дальше STL контейнеров не видел. Ну а для того, кто умеет такое писать, использовать чужие классы (в т.ч. STL, Qt, Boost.Container и т.п.) не составит никакого труда.

zx_gamer ★★★
()

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

Да, если тебе будут советовать Visual Basic, гони их ссаными тряпками. Это застрявшие в 90-х эникеи, не умеющие hello world написать, но мнение имеющие.

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

Некоторые вкатываются, изучив Java, Kotlin, Objective C или что там сейчас на айфонах, C#, PHP или JS и начав пилить пет-проекты.

Если всё это для тебя недостаточно настоящее или амбициозное, начни с каноничной сишечки. Но она местами контринтуитивна, и нужно хорошее пособие для начинающих.

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

Но даже это неправильно, пусть человек сначала научится писать template<class T> class Vector. Узнает про шаблоны, про malloc, calloc, realloc, free, про placement new, про ручной вызов деструктора, про catch(...).

Не всем это дано, не всем это нужно, и не у всех на это есть время.
Полагаю, что значительная часть программистов в работе в основном как раз используют чужие классы (STL, Qt, Boost.Container), а не свои шаблоны для Декартовых деревьев пишут.

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

Декартовые деревья никто не использует в проде. Это некий маркер. Если человек может такое написать, то он НОРМАЛЬНО знает C++. Человек, который этого не может, не знает C++ совсем.

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

Начинать с C очень плохая идея. Этот язык (особенно в текущем виде) требует понимать что такое UB и знать указатели и их арифметику. (Попробуйте написать scanf без &, и объяснить новичку строки)

А вот Паскаль, да, сначала научиться писать простые вещи, а потом постепенно начинать использовать указатели, динамичесеую память (явно) и т.п.

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

Начинать с C очень плохая идея.

Но идея начинать с C++ ещё более ужасна. А сложности с пониманием работы C без базы, как мне кажется, со скрипом преодолимы. Если человек в принципе отвергает «учебный», компилируемый в байт-код или интерпретируемый язык, то лучше уж так.

Этот язык (особенно в текущем виде) требует понимать что такое UB и знать указатели и их арифметику.

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

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

Хотелось бы высказаться в защиту Паскаля, тезисно:

  • Многословность не мешает: набор текста составляет лишь малую часть программирования, а чтение преобладает ознакомительное и поисковое. Это вам не стихи. И вообще, вы ещё COBOL не видели.
  • Паскаль - удивительно стройный и предсказуемый язык.
  • Он не навязывает ООП или функциональщину, как некоторые.
  • Начинать с языка со строгой статической типизацией, который различает функции и процедуры и при желании позволяет работать с памятью - хорошая идея.
  • Паскаль жив: есть популярное СПО на нем, есть история успеха Ильхамки, который задолбал все форумы, но таки сделал и продал стартап, есть легаси-проекты на сабже и истории успеха вкатунов в легаси.
  • А там, где Паскаль-легаси переписывают на другие языки, вам придется уметь читать исходники.
  • Программирование - не столько про языки, сколько про формализацию задач. Сосредоточьтесь на этом, чтобы не присоединиться к армии неосиляторов или к армии прочитавших толстую книжку в мягкой обложке на газетной бумаге и просящих подсказать идею для программы у каждого встречного, кто носит очки.
Vidrele ★★★★
()

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

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

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

backend бывает разный.

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

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

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

Я полагаю останется.

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

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

water_closed
()
Последнее исправление: water_closed (всего исправлений: 1)
Ответ на: комментарий от s-warus

Он регулярно (раз в три года?) переиздает две свои книги: одна это введение в С++ (кто хочет научиться программировать), вторая это современные возможности С++ (тем кто хочет узнать что нового и зачем появилось в С++).

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

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

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

У него же отличный хомяк:

https://www.stroustrup.com/

A Tour of C++ (Third edition) Addison-Wesley. ISBN-10: 0-13-681648-7. September 2022.

The ``tour'' is a quick (254 pages + index, historical information, etc.) tutorial overview of all of standard C++ (language and standard library) at a moderately high level for people who already know C++ or at least are experienced programmers. It covers C++20 plus a few likely features of C++23.

Programming – Principles and Practice Using C++ (3rd Edition) Addison-Wesley ISBN 978-0-13-830868-1. April 2024.

«Programming: Principles and Practice using C++ (3rd Edition)», aka PPP3, is an introduction to programming for people who have never programmed before. It will also be useful for people who have programmed a bit and want to improve their style and technique - or simply learn modern C++. It is designed for classroom use, but written with an eye on self study. Ealier versions of this book have been used as the basis for first programming classes for electrical engineering, computer engineering, and computer science students at Texas A&M University and in many other places.

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

Только ты предлагаешь Tour, про который сам автор книги пишет:

for people who already know C++ or at least are experienced programmers.

(отсюда Какую книгу по C++ выбрать? (комментарий))

На амазоне про книжки Страуструпа отзывы не особо хорошие (и глядя на его «Programming Principles and Practice Using C++» 2024 года издания я с ними скорее согласен)

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

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

На амазоне про книжки Страуструпа отзывы не особо хорошие

Это js-макаки-неосиляторы пишут. Бьёрн, конечно, не мастер пера, но пишет качественно. Это цэпэпэ, а не худлит.

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

Во-первых я не говорил о том, что надо писать на С++ в С стиле. Я говорю, что С++ это нашлёпка над С. Это не на 100% верно, но процентов на 99 - верно.

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

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

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

Я говорю, что С++ это нашлёпка над С.

Ну т.е. мордобитие начнётся ещё до код-ревью, ок. Сравнил макро-ассемблер и язык высокого уровня с кучей фич. Раст тогда тоже нашлёпка над сишкой, там же FFI есть?

твой личный негативный опыт

Это industry best practices.

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

Эти многие обойдутся чистой сишкой или GTFO. Использовать мощный С++ как Си с классами будет только идиот.

В-третьих к изучению языка это всё отношения не имеет, язык везде одинаковый, а какой стиль от тебя требуют - расскажут на работе

Сишный стиль – небезопасное легаси для неосиляторов, его вообще надо выпилить нахер. Хочешь си стиль, пиши на сишке, а ко взрослым дядям не лезь.

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

Раст тогда тоже нашлёпка над сишкой, там же FFI есть?

Нет. Код на языке C не является валидной программой на Rust, не скомпилируется компилятором Rust. Но является валидной программой на C++ и скомпилируется компилятором C++ (в 99% случаев, не забываю уточнять для буквоедов).

Это industry best practices.

Да what are your talking?

Эти многие обойдутся чистой сишкой или GTFO. Использовать мощный С++ как Си с классами будет только идиот.

Им видней, чем обходиться.

Сишный стиль – небезопасное легаси для неосиляторов, его вообще надо выпилить нахер.

Ну вот как выпилят, так приходите.

Хочешь си стиль, пиши на сишке, а ко взрослым дядям не лезь.

Ох уж эти wanna be взрослые дяди. Взрослые дяди делают как считают нужным. А невзрослые дяди постоянно ищут одобрения от окружающих, industry best practices и всё такое. Если бы эта industry ещё имела эти самые best practices.

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

C++ это нашлёпка поверх C

Вбили в горизонтальную доску гвоздь-сотку наполовину. На шляпку гвоздя путем сложной эквилибристики поставили 32-х килограммовую гирю.

В этой кривой аналогии, но очень похожей на реальность, гвоздь – это Си, а 2-пудовая гиря – та самая нашлепка под названием С++.

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

Как бы то ни было, если ты учишь C++, почти всё, что входит в C, выучить всё равно придётся. За исключением каких-то редко-используемых фич вроде _Generic функций. Раз придётся - почему бы и не выучить в виде целостного языка, который всё равно выделен и формализован, и вообще на практике встречается достаточно часто.

Про гирю согласен, ну если человек хочет выучить именно C++, придётся всю гирю осваивать после гвоздя.

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

Как бы то ни было, если ты учишь C++, почти всё, что входит в C, выучить всё равно придётся.

Я просто не очень понимаю, что значит «учить Си». Именно каких-то языковых сущностей там с гулькин нос. Что реально нужно понять, так это указатели, указатели на указатели и указатели на указатели на указатели.

ИМХО, «изучение Си» – это прежде всего обретение навыков писать на Си более-менее надежно. Например, используя идиому goto cleanup.

И вот с этой точки зрения пути изучения C++ и Си очень быстро расходятся в самых разных направлениях.

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

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

Что такое C:

  1. Основы структурированного программирования: переменные, условия, циклы, арифметика, битовые операции, функции.

  2. Указатели.

  3. Структуры, массивы.

  4. Препроцессор.

  5. Некоторое подмножество стандартной библиотеки.

  6. Практика применения всего вышеописанного для небольших программ.

  7. Я бы ещё добавил сюда базовые POSIX API. Сеть, пайпы, fork/exec. Это, конечно, напрямую с C не связано, но всё же юникс и C штуки достаточно близкие.

Это достаточно большой объём знаний для начинающего. Причём знаний концептуальных. Я видел начинающих программистов, которые закапывались в сложных концепциях, при этом не понимая простых, просто цикл с массивом - они этого не понимали, а указатели это и вовсе для многих выворот мозга, но при этом они пытаются освоить ООП. Какой тебе ООП, если ты никогда не поймёшь виртуальную таблицу функций, не понимая, что такое указатель на функцию, не говоря уже про массив указателей на функции. А ведь в С++ есть множественное наследование, там всё ещё интересней. Для усвоения С в моём университете отводился полугодовой курс. #5 и #6 для C++ могут быть избыточны и может быть даже вредны, поэтому тут особый упор делать может и не стоит, но тем не менее что-то знать надо, например что такое strcpy, хотя бы для того, чтобы потом показать, какие у него есть проблемы и как их можно решать в C++.

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

Так я и говорю, что самих языковых сущностей там с гулькин нос:

Основы структурированного программирования: переменные, условия, циклы, арифметика, битовые операции, функции.

Указатели.

Препроцессор.

Уже даже массивы и структуры желательно изучать в C++, а не их примитивные варианты из C.

Хотя, если посмотреть на те же «функции» из вашего списка, то опять же в C++ к функциям относится и перегрузка, и аргументы по умолчанию, и передача аргументов по ссылке.

Так что если хочется изучать С++ с полного нуля, не имея никакой базы за плечами, то и здесь надобность идти от чистого Си в современном мире вызывает бОООльшие вопросы.

Практически всю эту базу можно и на C++изучать. Да еще и с правильными практиками, без попыток имитировать ООП на структурах с указателями, чистки ресурсов через goto cleanup и управления динамической памятью врукопашную через malloc/free.

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

Тем не менее goto cleanup это валидный код на C++ (пусть и не особо нужный, при наличии RAII). Структура с указателями это валидный код на C++. malloc/free это валидный код на C++. Поэтому изучать это надо. От этого никуда не уйти. Невозможно знать подмножество C++ и этим ограничиться. Я так считаю по крайней мере.

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

vbr ★★★★★
()
Последнее исправление: vbr (всего исправлений: 2)