S>Подскажите, в какой последовательности изучать С++ и все что с ним напрямую связано?
1. Классы, их организация, поля и методы классов.
2. Наследование.
3. Полиморфизм, виртуальные функции.
4. Шаблоны.
5. Исключения.
6. А уж потом и STL, и boost и что угодно.
И по каждому пункту — практика, практика и практика. Пока не уверен, что пункт i хорошо понимаешь — к пункту i+1 не переходить.
Здравствуйте, Vamp, Вы писали:
S>>Может что-то еще посоветуете? Какую-то литературу с примерами и т.п. V>Четырехкнижие. 2 книжки Мейерса, а потом две книжки Саттера.
Саттера и Мейерса нужно читать после некоторого опыта программирования на плюсах, т.к.
на начальном этапе даже описываемые проблемы не совсем понятны, не то что рекомендации по избавлению от них.
Хочется уточнить насчет проблем, возникающих у автора при "втягивании" в open-source проект. А какого рода трудности испытываете? Не понятно что как работает и что для чего нужно? Или непонятны языковые конструкции? Опять же, какого рода конструкции не понятны.
Довольно сомнительно, что человек, достаточно программировавший в других областях, не справляется с синтаксисом языка. Хотелось бы примеры тогда, что конкретно не понятно, может, все так хитро наверчено, что и знатоки С++ не разбирутся?
С другой стороны, если трудности вызывает само построение проекта, то что в этом странного? Новая большая система, да еще на этапе строительства, да еще,поди, коллективное творчество. Я с трудом представляю гения, который сразу же втянется и сможет запросто включиться в разработку. В любом деле нужно время, чтобы вникнуть. А на сложных проектах, это месяцы, а то и годы. Так есть ли повод для сомнений?
Страуструп — великолепно.
На начальном этапе изучения програмирования так же советую макконнела "совершенный код". Там не С++ а общие рекомендации. После этого можно сатера и маерса и дальше boost
Здравствуйте, savgur.
Вы писали:
S>Всем добрый день.
S>Подскажите, в какой последовательности изучать С++ и все что с ним напрямую связано?
S>На C++ перехожу с С, раньше читал пару бесполезных книжек по С++, сейчас дочитываю Страуструпа, затем думаю учить STL и boost, т.к. это вроде первоочередные библиотеки для изучения. S>Может что-то еще посоветуете? Какую-то литературу с примерами и т.п.
Если я правильно понял, Вы собираетесь профессионально заниматься C++.
Тогда Вам лучше всего быстро пройти все эти beginners tutorials (я имею в
виду "бесполезные книжки по С++", а отнюдь не Страуструпа) и как можно скорее
приступить к освоению мастерских техник, стандартов кодирования и вообще
навыков "выживания" в мире кодинга.
Как ни странно, первоклассных книг по C++ совсем немного (думаю, что наберется
не более 15-20, в остальных придется тщательно выискивать "граммы радия среди
тонн руды"). На мой взгляд, примеры, которыми изобилует соответствующая литература,
особенно для начинающих, не дают почти никакого представления о реальных проблемах,
с которыми встречается программист, и только закрепляют плохие привычки, от которых
позже будет невозможно избавиться. Осознание этого факта приходит не сразу — как
правило, при встрече с первым большим проектом. C++ — слишком гибкий и опасный
для того, чтобы изучать его вот так, по главам. К тому же многие концепции,
которые были актуальными, скажем, в 90-ые, сейчас во многом устарели.
Очень рекомендую прочесть книгу "C++ для профессионалов" (Н. Солтер, С. Клепер),
затем попытаться осилить "Imperfect C++" (М. Уилсон). После этого можно смело
переходить на труды классиков — Саттера, Мейерса, Александреску, Бека, Эллисона,
Страуструпа, Макконнелла, Джосаттиса и других.
Здравствуйте, 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++)
{
...
}
, потому что первая форма, как правило, реализуется более эффективно.
В итоге вторая форма закрепляется на уровне автоматизма и со временем
перекочевывает в большие разработки, что мы с вами можем наблюдать повсеместно.
Повторю, это только мое мнение.
Подскажите, в какой последовательности изучать С++ и все что с ним напрямую связано?
На C++ перехожу с С, раньше читал пару бесполезных книжек по С++, сейчас дочитываю Страуструпа, затем думаю учить STL и boost, т.к. это вроде первоочередные библиотеки для изучения.
Может что-то еще посоветуете? Какую-то литературу с примерами и т.п.
Здравствуйте, savgur, Вы писали:
S>Всем добрый день.
S>Подскажите, в какой последовательности изучать С++ и все что с ним напрямую связано?
S>На C++ перехожу с С, раньше читал пару бесполезных книжек по С++, сейчас дочитываю Страуструпа, затем думаю учить STL и boost, т.к. это вроде первоочередные библиотеки для изучения. S>Может что-то еще посоветуете? Какую-то литературу с примерами и т.п.
Я б рекомендовал начать с книжки Стенли Липпмана из красной серии С++ IN Depth/ Липпман ее специально писал для программеров, которые работали на других языках, но потребовался С++.
А далее — по вкусу.
Классы, шаблоны, STL — в таком порядке.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
За авторов и ответы спасибо, но т.к. пол книги осилил(хотя поняд 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. на выходе получаем довольно качественный проект+код, который уже можно использовать в реальных приложениях. (Наверняка, конечно, потребуется небольшая доработка)
okman wrote:
> Как ни странно, первоклассных книг по C++ совсем немного (думаю, что > наберется > не более 15-20, в остальных придется тщательно выискивать "граммы радия > среди
Есть такая книга. Дейтел + Дейтел. Хороший учебник по С++, я считаю.
Но это именно учебник, это как язык работает, а не как им надо пользоваться
(в стиле Меерса).
Приветствую, igna.
Вы писали:
I>Удивительно, что Imperfect C++ оказался на 2-ом месте в порядке чтения. Это ведь и не учебник вовсе, скорее сборник взаимосвязанных статей про довольно сложные вещи написанный сложным языком. И кстати, есть русский перевод? В оригинале там еще и английский более сложный чем обычно в технических книгах.
I>PS. Или надо понимать буквально: только "попытаться осилить"?
Я считаю, что во многие аспекты языка лучше "въезжать" как можно раньше, иначе
будут проблемы. Обе рекомендованные книги, на мой взгляд, в наивысшей степени раскрывают C++
во всей его вопиющей красе. Русский перевод "Imperfect C++" есть. Кажется, "Практический
подход к решению проблем программирования C++" или что-то вроде того.
То, что сложная — да. Я раза 3 или 4 перечитывал, только после этого (и определенной практики)
многое стало проясняться.
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>Просто он в стадии разработки, вот я и плаваю в нем. Разработчики конечно помогают, но что-то тяжеловато дается пока. Может стоит с рабочими проектами поработать, скажем плагины сделать, баги пофиксить?
Как раз с этого обычно и начинают — чтобы написать что-то свое, надо посмотреть и попользоваться другими аналогами. Чтобы знать предметную область. С этим опытом проще будет.