Решён
Как правильно изучать язык программирования C++?

Игорь Белоусов C/C++
11k
7

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

Сам пробовал по книжке Страуструпа, застрял где то на шаблонах и умных указателях. Код компилируется но я не понимаю ЗАЧЕМ так писать, в чем смысл всех этих move-семантик.

Хочу дойти до уровня когда смогу писать нормальные проекты, а не лабораторные. Может кто поделится рабочим планом? Какие ресурсы реально помогли вам, а не просто "прочитай Страуструпа"?

Решение
94
Эксперт • 3 ответа

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

Вот что работает:

  1. Начни с книги "A Tour of C++" (того же Страуструпа, но тонкая, 200 страниц). Она дает обзор языка без закапывания в детали. На русском есть перевод "Язык программирования C++. Краткий курс".

  2. Параллельно решай задачи на leetcode, но ТОЛЬКО easy уровень. Не для собеседований, а чтобы привыкнуть думать на С++. Контейнеры, итераторы, строки. По 2-3 задачи в день.

  3. После месяца задач возьми книгу Скотта Мейерса "Effective Modern C++". Там как раз move-семантика, умные указатели, auto, лямбды. Каждый пункт - конкретный совет с объяснением ЗАЧЕМ.

  4. Сделай пет-проект. Что угодно: змейка на SDL2, чат на сокетах, парсер JSON. Суть в том чтобы столкнуться с реальными проблемами компоновки, утечек памяти, сегфолтов.

  5. Когда пет-проект заработает, вернись к Страуструпу. На этом этапе книга начнет "щелкать".

Про шаблоны: не пытайся их понять абстрактно. Напиши свой vector, свой shared_ptr. Когда руками реализуешь, все встает на место.

Из видео: канал Jason Turner (C++ Weekly на ютубе). Короткие выпуски по 10-15 минут, каждый про одну фичу. На английском, но с субтитрами нормально.

Аватар Игорь Белоусов

Спасибо огромное за план! Про "A Tour of C++" не слышал вообще, уже нашел pdf. И идея написать свой vector звучит страшно но интересно)

37
Участник • 4 ответа

Мейерс, Страуструп, Александреску...

Все эти книги бесполезны без одной вещи: ты должен ЧИТАТЬ ЧУЖОЙ КОД. Иди на гитхаб, форкни какой нибудь небольшой проект на C++ (не хромиум, а что то на 5-10к строк), и просто читай. Ставь брейкпоинты, запускай в дебаггере, смотри как данные текут.

Я 15 лет пишу на плюсах. Научился не из книг а из ревью на работе и чтения исходников boost когда он еще был хедер-онли.

19
Участник • 3 ответа

Не начинай с C++.

Серьезно. Если ты сейчас не понимаешь move-семантику, это не потому что ты тупой. Это потому что C++ - это 40 лет наслоений совместимости с Си, комитетных компромиссов и исторических костылей. Язык объективно перегружен.

Выучи сначала Rust. Там ownership и borrowing объясняются на уровне компилятора, он тебя ЗАСТАВИТ понять управление памятью. После Rust вернешься к плюсам и move/unique_ptr/RAII встанут на место за неделю.

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

Аватар Мария Боязливая

Человек спросил как учить C++, а не "какой язык выбрать". У него учебная программа на плюсах, куда ему Rust?

Аватар Данил

Параллельно можно. Я не говорю бросать C++, я говорю что Rust как учебный инструмент для понимания ownership лучше.

3
Эксперт • 5 ответов

Позволю себе уточнить, что правильно писать не "move-семантика", а "семантика перемещения". Если уж изучаете C++, то и терминологию используйте корректную. В стандарте языка (ISO/IEC 14882) используется термин "move semantics", и устоявшийся русский перевод именно "семантика перемещения".

Также "умные указатели" - это калька с "smart pointers". Более точный термин - "интеллектуальные указатели" или просто используйте оригинальные названия: std::unique_ptr, std::shared_ptr, std::weak_ptr.

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

12
Участник • 2 ответа

Бро, у тебя на втором курсе шаблоны? Жесть. У нас их на четвертом давали.

Ладно, по делу. Мне зашел курс на Stepik "Программирование на языке C++" от Computer Science Center. Бесплатный, на русском, с задачами. Там как раз от базы до шаблонов и STL.

Еще канал The Cherno на ютубе, у него серия C++ для начинающих. Объясняет на пальцах, без академической мути.

56
Участник • 2 ответа

Если ты "не понимаешь ЗАЧЕМ так писать", значит ты еще не столкнулся с проблемами, которые эти механизмы решают. И это нормально.

Напиши программу, которая обрабатывает файл на 500 мегабайт построчно. Просто считай строки и выведи самую длинную. Сначала сделай через std::string и копирование. Потом профилируй через valgrind или perf. Ужаснись количеству аллокаций. Потом перепиши с std::string_view и move. Сравни.

Когда ты УВИДИШЬ разницу в цифрах, мотивация изучать move-семантику появится сама.

1
Участник • 2 ответа

а я вот после универа так и не осилил плюсы, ушел в питон и норм)) зп не хуже, нервы целее. 10 лет назад начинал с turbo c++ в досе, вот были времена

Написать ответ

Премодерация гостей

Вы отвечаете как гость. Ваш ответ будет скрыт до проверки модератором. Чтобы ответ появился сразу и вы получали репутацию — войдите в аккаунт.

Будьте вежливы и соблюдайте правила платформы.