Подскажите, в какой последовательности изучать С++ и все что с ним напрямую связано?
На C++ перехожу с С, раньше читал пару бесполезных книжек по С++, сейчас дочитываю Страуструпа, затем думаю учить STL и boost, т.к. это вроде первоочередные библиотеки для изучения.
Может что-то еще посоветуете? Какую-то литературу с примерами и т.п.
S>Подскажите, в какой последовательности изучать С++ и все что с ним напрямую связано?
1. Классы, их организация, поля и методы классов.
2. Наследование.
3. Полиморфизм, виртуальные функции.
4. Шаблоны.
5. Исключения.
6. А уж потом и STL, и boost и что угодно.
И по каждому пункту — практика, практика и практика. Пока не уверен, что пункт i хорошо понимаешь — к пункту i+1 не переходить.
Здравствуйте, savgur, Вы писали:
S>Всем добрый день.
S>Подскажите, в какой последовательности изучать С++ и все что с ним напрямую связано?
S>На C++ перехожу с С, раньше читал пару бесполезных книжек по С++, сейчас дочитываю Страуструпа, затем думаю учить STL и boost, т.к. это вроде первоочередные библиотеки для изучения. S>Может что-то еще посоветуете? Какую-то литературу с примерами и т.п.
Я б рекомендовал начать с книжки Стенли Липпмана из красной серии С++ IN Depth/ Липпман ее специально писал для программеров, которые работали на других языках, но потребовался С++.
А далее — по вкусу.
Классы, шаблоны, STL — в таком порядке.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, savgur.
Вы писали:
S>Всем добрый день.
S>Подскажите, в какой последовательности изучать С++ и все что с ним напрямую связано?
S>На C++ перехожу с С, раньше читал пару бесполезных книжек по С++, сейчас дочитываю Страуструпа, затем думаю учить STL и boost, т.к. это вроде первоочередные библиотеки для изучения. S>Может что-то еще посоветуете? Какую-то литературу с примерами и т.п.
Если я правильно понял, Вы собираетесь профессионально заниматься C++.
Тогда Вам лучше всего быстро пройти все эти beginners tutorials (я имею в
виду "бесполезные книжки по С++", а отнюдь не Страуструпа) и как можно скорее
приступить к освоению мастерских техник, стандартов кодирования и вообще
навыков "выживания" в мире кодинга.
Как ни странно, первоклассных книг по C++ совсем немного (думаю, что наберется
не более 15-20, в остальных придется тщательно выискивать "граммы радия среди
тонн руды"). На мой взгляд, примеры, которыми изобилует соответствующая литература,
особенно для начинающих, не дают почти никакого представления о реальных проблемах,
с которыми встречается программист, и только закрепляют плохие привычки, от которых
позже будет невозможно избавиться. Осознание этого факта приходит не сразу — как
правило, при встрече с первым большим проектом. C++ — слишком гибкий и опасный
для того, чтобы изучать его вот так, по главам. К тому же многие концепции,
которые были актуальными, скажем, в 90-ые, сейчас во многом устарели.
Очень рекомендую прочесть книгу "C++ для профессионалов" (Н. Солтер, С. Клепер),
затем попытаться осилить "Imperfect C++" (М. Уилсон). После этого можно смело
переходить на труды классиков — Саттера, Мейерса, Александреску, Бека, Эллисона,
Страуструпа, Макконнелла, Джосаттиса и других.
За авторов и ответы спасибо, но т.к. пол книги осилил(хотя поняд 40%-50%, думаю не больше), надо закончить, дальше посмотрю что-то из того что посоветовали.
А вот на счет практитки вопрос: в работе всегда хватало чистого С и Ассемблера, т.к. специфика работы такая, а теперь вот собираюсь больше в software developing переходить, так вот, с практикой не знаю как быть, раньше толко простые, почти элементарные классы использовал в простых программках, недавно взялся за опенсорс проект, часть которого на C++, но пока не очень.
Может есть какая литература, с примерами, советами, методами, чтоб проникнуться возможностями C++, и закрепить их, а то без практики жевать книги всухую не очень полезно, часть плохо понимается, часть забывается.
Здравствуйте, okman, Вы писали:
O>Очень рекомендую прочесть книгу "C++ для профессионалов" (Н. Солтер, С. Клепер), O>затем попытаться осилить "Imperfect C++" (М. Уилсон). После этого можно смело O>переходить на труды классиков — Саттера, Мейерса, Александреску, Бека, Эллисона, O>Страуструпа, Макконнелла, Джосаттиса и других.
Удивительно, что Imperfect C++ оказался на 2-ом месте в порядке чтения. Это ведь и не учебник вовсе, скорее сборник взаимосвязанных статей про довольно сложные вещи написанный сложным языком. И кстати, есть русский перевод? В оригинале там еще и английский более сложный чем обычно в технических книгах.
PS. Или надо понимать буквально: только "попытаться осилить"?
I>Удивительно, что Imperfect C++ оказался на 2-ом месте в порядке чтения. Это ведь и не учебник вовсе, скорее сборник взаимосвязанных статей про довольно сложные вещи написанный сложным языком. И кстати, есть русский перевод? В оригинале там еще и английский более сложный чем обычно в технических книгах.
Здравствуйте, savgur, Вы писали:
S>Подскажите, в какой последовательности изучать С++ и все что с ним напрямую связано?
Вот так:
1. берёте хорошего программиста (или двух)
2. ставите перед собой небольшую задачу. (Раз вы хотите стать программистом, наверняка они у вас уже есть.) (возможно программисты вам её поставят)
Требования к задачи:
1. простая с точки зрения естественных наук (математика физика и т.п.)
2. сложная, или не очень — с точки зрения программирования (сложность сами выбирайте)
в качестве первой такой задачи может быть например копирование файла из одного места в другое с показом процента от скопированного
3. начинаете проектировать, никого не спрашивая и ничего не читая.
В этом пункте язык программирования не должен влиять на проектирование.
Например: применительно к данной задаче копирования файла будет выглядеть примерно так: первая штука спрашивает у пользователя имя файла, другая штука читает с диска, третья штука пишет файл на диск, четвертая перекладывает байты файла от читателя к писателю и т.п.
4. начинаете реализовывать.
тут у вас станет возникать куча вопросов т.к. вы не знаете как переложить спроектированное Вами на язык которому вы учитесь. Вот тут Вам пригодятся хорошие программисты из первого пункта. Вы их спрашивайте — они вам отвечают. Поначалу вы будете спрашивать их очень много и вам, возможно, будет казаться что задача невыполнима. Но она выполнима, даже быстрее чем вы думаете. (тут зависит еще от программистов, конечно. Они должны по пути минимального сопротивления вас вести к цели).
Во время реализации Вы должны внимательно прислушиваться к вашим внутренним позывам. Примеры таких позывов:
1. возьму ка я скопирую этот текст программы и так будет быстрее.
2. большая штука получается. ну я то в ней разбираюсь да и ладно.
3. как бы не забыть это действие
и т.п.
как только они встречаются зовите программистов из п.1 на помощь
После каждой реализованной мини-штуки (они могут быть очень маленькими) можно звать программистов из п.1 Пусть они её проверят и подскажут.
Итого:
1. учимся проектировать и писать код
2. не останавливаемся на лишних вещах которыми "обогащены" книги для новичков
3. на выходе получаем довольно качественный проект+код, который уже можно использовать в реальных приложениях. (Наверняка, конечно, потребуется небольшая доработка)
Здравствуйте, Vamp, Вы писали:
S>>Может что-то еще посоветуете? Какую-то литературу с примерами и т.п. V>Четырехкнижие. 2 книжки Мейерса, а потом две книжки Саттера.
Саттера и Мейерса нужно читать после некоторого опыта программирования на плюсах, т.к.
на начальном этапе даже описываемые проблемы не совсем понятны, не то что рекомендации по избавлению от них.
okman wrote:
> Как ни странно, первоклассных книг по C++ совсем немного (думаю, что > наберется > не более 15-20, в остальных придется тщательно выискивать "граммы радия > среди
Есть такая книга. Дейтел + Дейтел. Хороший учебник по С++, я считаю.
Но это именно учебник, это как язык работает, а не как им надо пользоваться
(в стиле Меерса).
Приветствую, igna.
Вы писали:
I>Удивительно, что Imperfect C++ оказался на 2-ом месте в порядке чтения. Это ведь и не учебник вовсе, скорее сборник взаимосвязанных статей про довольно сложные вещи написанный сложным языком. И кстати, есть русский перевод? В оригинале там еще и английский более сложный чем обычно в технических книгах.
I>PS. Или надо понимать буквально: только "попытаться осилить"?
Я считаю, что во многие аспекты языка лучше "въезжать" как можно раньше, иначе
будут проблемы. Обе рекомендованные книги, на мой взгляд, в наивысшей степени раскрывают C++
во всей его вопиющей красе. Русский перевод "Imperfect C++" есть. Кажется, "Практический
подход к решению проблем программирования C++" или что-то вроде того.
То, что сложная — да. Я раза 3 или 4 перечитывал, только после этого (и определенной практики)
многое стало проясняться.
Здравствуйте, MasterZiv, Вы писали:
MZ>okman wrote:
>> Как ни странно, первоклассных книг по C++ совсем немного (думаю, что >> наберется >> не более 15-20, в остальных придется тщательно выискивать "граммы радия >> среди
MZ>Есть такая книга. Дейтел + Дейтел. Хороший учебник по С++, я считаю. MZ>Но это именно учебник, это как язык работает, а не как им надо пользоваться MZ>(в стиле Меерса).
Да, хороший учебник. Хотя там и не рассматриваются шаблоны и STL.
Беда таких учебников в том, что в них обычно не делается попыток сразу
привить правильные "рефлексы", типа того, чтобы писать так:
for (iter_t it = it.begin(), iter_t itEnd = it.end(); it != itEnd; ++i)
{
...
}
а не так:
for (iter_it it = it.begin(); it != it.end(); it++)
{
...
}
, потому что первая форма, как правило, реализуется более эффективно.
В итоге вторая форма закрепляется на уровне автоматизма и со временем
перекочевывает в большие разработки, что мы с вами можем наблюдать повсеместно.
Повторю, это только мое мнение.
okman wrote:
> > Да, хороший учебник. Хотя там и не рассматриваются шаблоны и STL.
Рассматриваются. Его было 3 или 4 издания. В последних -- рассматриваются.
Естественно, брать надо последние издания.
> Беда таких учебников в том, что в них обычно не делается попыток сразу > привить правильные "рефлексы", типа того, чтобы писать так:
Там -- делается.
> , потому что первая форма, как правило, реализуется более эффективно.
Это всё брызги, пос сравнению со всеми остальными проблемами при изучении С++.
Это может и компилятор соптимизировать.
Здравствуйте, MasterZiv, Вы писали:
MZ>okman wrote:
>> >> Да, хороший учебник. Хотя там и не рассматриваются шаблоны и STL.
MZ>Рассматриваются. Его было 3 или 4 издания. В последних -- рассматриваются. MZ>Естественно, брать надо последние издания.
>> Беда таких учебников в том, что в них обычно не делается попыток сразу >> привить правильные "рефлексы", типа того, чтобы писать так:
MZ>Там -- делается.
Тогда книга и впрямь классная.
>> , потому что первая форма, как правило, реализуется более эффективно.
MZ>Это всё брызги, пос сравнению со всеми остальными проблемами при изучении С++. MZ>Это может и компилятор соптимизировать.
...Ни один компилятор не удержит меня от написания класса с открытыми данными,
кучей перегрузок, имеющего жесткие зависимости и виртуальные функции при
отсутствии виртуального деструктора...
Re: Последовательность изучения C++
От:
Аноним
Дата:
29.06.10 09:08
Оценка:
Здравствуйте, savgur, Вы писали:
S>Всем добрый день.
S>Подскажите, в какой последовательности изучать С++ и все что с ним напрямую связано?
S>На C++ перехожу с С, раньше читал пару бесполезных книжек по С++, сейчас дочитываю Страуструпа, затем думаю учить STL и boost, т.к. это вроде первоочередные библиотеки для изучения. S>Может что-то еще посоветуете? Какую-то литературу с примерами и т.п.
Здравствуйте, savgur, Вы писали:
S>Может есть какая литература, с примерами, советами, методами, чтоб проникнуться возможностями C++, и закрепить их, а то без практики жевать книги всухую не очень полезно, часть плохо понимается, часть забывается.
Здравствуйте, okman, Вы писали:
O>Беда таких учебников в том, что в них обычно не делается попыток сразу O>привить правильные "рефлексы", типа того, чтобы писать так:
O>for (iter_t it = it.begin(), iter_t itEnd = it.end(); it != itEnd; ++i) O>{ O> ... O>}
O>а не так:
O>for (iter_it it = it.begin(); it != it.end(); it++) O>{ O>... O>}
Кстати, в Imperfect C++ тоже используется вторая форма, хотя Wilson утверждает, что в работе повсеместно использует первую.
Здравствуйте, rm822, Вы писали:
R>Вы озвучьте для начала свой опыт, область в которой специализируетесь и область в которую хотите перейти
Опыт: системное программирование, для архитектуры MIPS, т.е. это читсый Си и Ассемблер. Более-менее знаю как работать в *nix с файлами, сокетами, сигналами, памятью, потоками. Также есть совсем маленький опыт в ООП, т.е. немного работал с классами в одном проекте, где получил начальное представление что такое классы и наследование. Пару тройку простеньких приложений учебных студентам делал с классами. В KDevelop сделал как-то простенький проект с GUI на Qt, тест с вопросами для студентов, правда GUI сделал с помощью Qt Designer'а, т.е. руками почти ничего не разрабатывал. С STL пока дела не имел.
В плане системного программирования хотелось-бы работать на более высоком уровне, чем биты, байты, драйвера, т.е. работать с ОС: потоки, разделение памяти, сигналы, сокеты и т.п. В плане прикладного программирования, хотелось-бы заниматься всем, что не является чистым Web, т.е. все кроме HTML, PHP и т.д., но не исключая использование БД, mysql например. Т.е. в основном планы работать над прикладным и системным(но не на уровне драйверов) ПО. Кроме того по-возможности хотелось-бы в первую очередь выучить платформенно независимые вещи, типа Qt, т.е. чтоб можно было применять независимо от ОС, ну или хотябы с уклоном в *nix сначала, ну а потом уже специфику и инструментарий.
Сейчас пытаюсь в одном opensource проекте поучавствовать: www.lumiera.org, но пока не очень получается, довольно непросто разобраться как что работает, но разработчики отзывчивые, подсказывают.
В плане литературы, всем большое спасибо за советы, чтоб не напарываться на бесполезные книги и не тратить на них драгоценное время, и в плане последовательности изучения, чтоб не наоборот.
А вот с практикой пока куча сомнений: где? как? как лучше и эффективней?
тогда вам в основном нужна постановка мозгов на новые рельсы + избавление от изобретений велосипедов
1е — стандартные контейнеры. см документацию sgi.com/tech/stl, примеров более чем достаточно. пока не начнете применять их вместо сишных велосипедов нихрена из вас не выйдет.
2е — элджер С++ for real programmers, это даст базу по RAII + базу по замене свитчей на полиморфизм.
3е — быстрая разработка за авторством мартина — для постановки мозгов и упорядочения того что вы уже должны знать
Изучал Паскаль, С++ в институте, потом на работе много писал на Delphi, теперь снова приходится возвращаться на С++.
Выражу свое мнение. Нужно смотреть, чем конкретно предстоит заниматься. Я вот в оборонке тружусь, у меня задачи сугубо прикладные. 90% тех языковых изысков, которые описывет Страупструп и другие искушенные авторы реально для меня не востребованы. Востребовано понимание алгоритма, процесса обработки информации. Все остальное есть в MSDN, в RSDN, книжках и т.д. Это и есть основные источники. STL очень обширная библиотека, но нужно ли знать все ее особенности единовременно? Лично мне хватает наиболее распространенных строковых функций, да кое-чего еще, освежаемого в MSDN по мере необходимости. Когда работал с COM/DCOM/OPC — пришлось вникать в этонаправление, читать книжки, статьи, форумы, когда работал с графикой — усиленно налегал на GDI и т.д. Вот такое мнение...
Здравствуйте, savgur, Вы писали:
S>Всем добрый день.
S>Подскажите, в какой последовательности изучать С++ и все что с ним напрямую связано?
S>На C++ перехожу с С, раньше читал пару бесполезных книжек по С++, сейчас дочитываю Страуструпа, затем думаю учить STL и boost, т.к. это вроде первоочередные библиотеки для изучения. S>Может что-то еще посоветуете? Какую-то литературу с примерами и т.п.
Насчет практитки непонимаю: как сопровождать чтение практиткой, участие в open-source проекте, примеры из книг, задачники, помощь студентам на форумах?
Самому генерить задачи и идеи не вижу смысла: сложный проект не сделать, а простой будет Си-подобным. Нужна грамотная постановка задачи, желательно с постоянным контролем.
Как лучше, посоветуйте пожалуйста.
Забавно, т.е. вполне возможно сейчас появлюсь умный я из будующего и заменю сам себя, 10 баллов.
Но пока этого не произошло, хотелось бы поконкретней и словами а не картинками.
Так как быть с практикой, объясните пожалуйста, как на ваш взгляд правильно закреплять книжные знания, и жедательно поближе к реальным проектам.
Open-source лучший вариант?
Здравствуйте, savgur, Вы писали:
S>Так как быть с практикой, объясните пожалуйста, как на ваш взгляд правильно закреплять книжные знания, и жедательно поближе к реальным проектам. S>Open-source лучший вариант?
Скажем так — не лучший, а нормальный. Опять же качество Open-source очень разное. Попробовать стоит, многие с этого начинают.
Здравствуйте, Guard_h4s, Вы писали:
G_>Здравствуйте, savgur, Вы писали:
S>>Так как быть с практикой, объясните пожалуйста, как на ваш взгляд правильно закреплять книжные знания, и жедательно поближе к реальным проектам. S>>Open-source лучший вариант? G_>Скажем так — не лучший, а нормальный. Опять же качество Open-source очень разное. Попробовать стоит, многие с этого начинают.
А чтоже тогда лучший на ваш взгляд? Просто я вот взялся за проект www.lumiera.org, но довольно долго в него вьезжаю, чтоб хоть понять как работает.
Просто он в стадии разработки, вот я и плаваю в нем. Разработчики конечно помогают, но что-то тяжеловато дается пока. Может стоит с рабочими проектами поработать, скажем плагины сделать, баги пофиксить?
okman wrote:
> ...Ни один компилятор не удержит меня от написания класса с открытыми > данными, > кучей перегрузок, имеющего жесткие зависимости
Это уже не вопрос программирования на конкретном языке С++.
Это -- вопрос проектирования ПО вообще.
и виртуальные функции при > отсутствии виртуального деструктора...
А это вот ни разу не криминал. Виртуальный деструктор нужен, только
если предусматривается полиморфное удаление объекта.
Например, удаление объекта может производится из той же виртуальной
функции, определяемой в каждом классе.
Здравствуйте, MasterZiv.
Вы писали:
MZ>и виртуальные функции при >> отсутствии виртуального деструктора...
MZ>А это вот [виртуальные функции при отсутствии виртуального MS>деструктора] ни разу не криминал. Виртуальный деструктор нужен, только MZ>если предусматривается полиморфное удаление объекта. MZ>Например, удаление объекта может производится из той же виртуальной MZ>функции, определяемой в каждом классе.
Согласен, хотя у каждого свои понятия криминала.
Но мы удалились от темы, Вы не считаете ?
Здравствуйте, savgur, Вы писали:
S>А чтоже тогда лучший на ваш взгляд? Просто я вот взялся за проект www.lumiera.org, но довольно долго в него вьезжаю, чтоб хоть понять как работает.
Сложно сказать что лучше. Опять же разные проекты совершенно разной сложности. Надо пробовать — если не идет, браться за что нибудь полегче.
S>Просто он в стадии разработки, вот я и плаваю в нем. Разработчики конечно помогают, но что-то тяжеловато дается пока. Может стоит с рабочими проектами поработать, скажем плагины сделать, баги пофиксить?
Как раз с этого обычно и начинают — чтобы написать что-то свое, надо посмотреть и попользоваться другими аналогами. Чтобы знать предметную область. С этим опытом проще будет.
Хочется уточнить насчет проблем, возникающих у автора при "втягивании" в open-source проект. А какого рода трудности испытываете? Не понятно что как работает и что для чего нужно? Или непонятны языковые конструкции? Опять же, какого рода конструкции не понятны.
Довольно сомнительно, что человек, достаточно программировавший в других областях, не справляется с синтаксисом языка. Хотелось бы примеры тогда, что конкретно не понятно, может, все так хитро наверчено, что и знатоки С++ не разбирутся?
С другой стороны, если трудности вызывает само построение проекта, то что в этом странного? Новая большая система, да еще на этапе строительства, да еще,поди, коллективное творчество. Я с трудом представляю гения, который сразу же втянется и сможет запросто включиться в разработку. В любом деле нужно время, чтобы вникнуть. А на сложных проектах, это месяцы, а то и годы. Так есть ли повод для сомнений?
Страуструп — великолепно.
На начальном этапе изучения програмирования так же советую макконнела "совершенный код". Там не С++ а общие рекомендации. После этого можно сатера и маерса и дальше boost