Курс «Продвинутый C++»


Оглавление (нажмите, чтобы открыть):

Окончательное руководство и список книг на С++

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

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

Пожалуйста, отредактируйте принятый ответ, чтобы обеспечить качественные книги и приблизительный уровень навыков — предпочтительно после обсуждения вашего добавления в С++ чат. (Регулярные люди могут беспощадно отменить вашу работу, если они не согласны с рекомендацией.) Добавьте короткую рекламу/описание каждой книги, которую вы лично читали/получали. Не стесняйтесь обсуждать качество, заголовки и т.д. В список будут добавлены книги, соответствующие критериям. Книги, которые имеют обзоры Ассоциации пользователей C и С++ (ACCU), имеют ссылки на обзор.

* Примечание. Часто задаваемые вопросы и другие ресурсы можно найти в теге С++ и в С++ — faq.Суб >

Начинающий

Вводный, без опыта программирования

C++ Учебник для начинающих * (Стэнли Липпман, Жозе Ладжои и Барбара Э. Му) (обновлено для C++ 11) На 1 тыс. Страниц это очень подробное введение в C++ это охватывает почти все на языке в очень доступном формате и очень подробно. Пятое издание (выпущено 16 августа 2012 г.) охватывает C++ 11. [Обзор]

Программирование: принципы и практика с использованием C++ (Бьярн Страуструп, 2-е издание — 25 мая 2014 г.) (обновлено для C++ 11/C++ 14) Введение в программирование с использованием C++ создателем языка. Хорошее чтение, которое не предполагает никакого предыдущего опыта программирования, но не только для начинающих.

* Не путайте с C++ Primer Plus (Стивен Прата) со значительно менее благоприятным обзором.

Вводный, с предыдущим опытом программирования

Тур по C++ (Бьярне Страуструп) (2-е издание для C++ 17) «Тур» — это краткий обзор (около 180 страниц и 14 глав) всех стандартных C++ (язык и стандартная библиотека, и использование C++ 11) на умеренно высоком уровне для людей, которые уже знают C++ или, по крайней мере, являются опытными программистами. Эта книга представляет собой расширенную версию материала, составляющего главы 2-5 языка программирования C++, 4-е издание.

Ускоренный C++ (Эндрю Кениг и Барбара Му, 1-е издание — 24 августа 2000 г.) Это в основном покрывает ту же почву, что и C++ Primer, но делает это на четвертой части своего пространства. Во многом это связано с тем, что это не попытка быть введением в программирование, а введением в C++ для людей, которые ранее программировали на каком-то другом языке. У него более крутая кривая обучения, но для тех, кто может с этим справиться, это очень компактное введение в язык. (Исторически сложилось так, что он первым открыл книгу, в которой использовался современный подход к обучению языку.) Несмотря на это, C++ он учит чисто C++ 98. [Обзор]

Лучшие практики

Эффективно C++ (Скотт Мейерс, 3-е издание — 22 мая 2005 г.) Это было написано с целью стать лучшей второй книгой C++, которую должны прочитать программисты, и это удалось. Предыдущие выпуски были нацелены на программистов, пришедших из C, третье издание изменило это и нацелено на программистов из таких языков, как Java. Он представляет

50 легко запоминающихся эмпирических правил вместе с их обоснованием в очень доступном (и приятном) стиле. Для C++ 11 и C++ 14 примеры и некоторые проблемы устарели, и следует отдать предпочтение Effective Modern C++. [Обзор]

Effective Modern C++ (Скотт Мейерс) Это в основном новая версия Effective C++, предназначенная для программистов C++, переходящих от C++ 03 к C++ 11 и C++ 14.

  • Effective STL (Скотт Мейерс) Это делается для того, чтобы сделать ту же часть стандартной библиотеки, исходящей от STL, что Effective C++ сделал с языком в целом: он представляет практические правила вместе с их обоснованием. [Обзор]
  • Промежуточное

    Более эффективный C++ (Скотт Мейерс) Даже больше практических правил, чем Эффективный C++. Не так важно, как в первой книге, но все же полезно знать.

    Исключительный C++ (Херб Саттер) Представленный в виде набора головоломок, он содержит одно из лучших и подробных обсуждений правильного управления ресурсами и безопасности исключений в C++ через Resource Acquisition is Initialization (RAII) в дополнение к всесторонний охват множества других тем, включая идиому pimpl, поиск имени, хороший дизайн класса и модель памяти C++. [Обзор]

    Подробнее Исключительный C++ (Херб Саттер) Охватывает дополнительные темы безопасности исключений, не охваченные в Исключительном C++, в дополнение к обсуждению эффективного объектно-ориентированного программирования в C++ и правильному использованию STL. [Обзор]

    Исключительный стиль C++ (Херб Саттер) Обсуждает общее программирование, оптимизацию и управление ресурсами; в этой книге также представлено отличное изложение того, как писать модульный код в C++, используя функции, не являющиеся членами, и принцип единой ответственности. [Обзор]

    C++ Стандарты кодирования (Херб Саттер и Андрей Александреску) «Стандарты кодирования» здесь не означают «сколько пробелов я должен сделать отступом для моего кода?» Эта книга содержит 101 передовой опыт, идиомы и распространенные ловушки, которые могут помочь вам написать правильный, понятный и эффективный код C++. [Обзор]

    C++ Шаблоны: Полное руководство (Дэвид Вандевурде и Николай М. Йосуттис) Это книга о шаблонах в том виде, в каком они существовали до C++ 11. Он охватывает все, от самых базовых до самых передовых метапрограммирования шаблонов, и объясняет каждую деталь того, как работают шаблоны (как концептуально, так и как они реализованы), и обсуждает много распространенных ошибок. Имеет отличные сводки по правилу единого определения (ODR) и разрешению перегрузки в приложениях. второе издание, охватывающее C++ 11, C++ 14 и C++ 17, уже опубликовано. [Обзор]

    C++ 17 — Полное руководство (Николай М. Хосуттис) В этой книге описаны все новые функции, представленные в стандарте C++ 17, охватывающие все, начиная от простых, таких как «встроенные переменные», «constexpr if» и все вплоть до «Полиморфных ресурсов памяти» и «Новых и удаленных с переподписанными данными».

    Расширенный

    Современный C++ дизайн (Андрей Александреску) Революционная книга о передовых общих методах программирования. Представляет дизайн на основе политик, списки типов и фундаментальные общие идиомы программирования, а затем объясняет, сколько полезных шаблонов проектирования (включая распределители небольших объектов, функторы, фабрики, посетителей и мульти-методы) могут быть реализованы эффективно, модульно и чисто с использованием универсального программирования., [Обзор]

    C++ Concurrency In Action (Энтони Уильямс) Книга, в которой описывается поддержка параллелизма C++ 11, включая библиотеку потоков, атомарную библиотеку, модель памяти C++, блокировки и мьютексы, а также вопросы проектирования и отладки. многопоточные приложения. второе издание, охватывающее C++ 14 и C++ 17, уже опубликовано.

    Продвинутый C++ Метапрограммирование (Давиде Ди Дженнаро) Предварительное C++ 11 руководство по методам TMP, сосредоточенное больше на практике, чем на теории. В этой книге содержится множество фрагментов, некоторые из которых устарели по типу черт, но методы, тем не менее, полезно знать. Если вы можете смириться с причудливым форматированием/редактированием, его легче читать, чем Александреску, и, возможно, это более полезно. Для более опытных разработчиков есть хороший шанс, что вы сможете найти что-то о темном angularке C++ (причуде), который обычно появляется только благодаря обширному опыту.

    Стиль ссылки — все уровни

    C++ Язык программирования (Бьярн Страуструп) (обновлено для C++ 11) Классическое введение в C++ его создателем. Написанный параллельно с классическим K & R, он действительно очень похож на него и охватывает практически все: от базового языка до стандартной библиотеки, от парадигм программирования до философии языка. [Обзор] Примечание. Все выпуски стандарта C++ отслеживаются по этому вопросу: Где найти текущий стандарт C++.

    C++ Учебное пособие и справочник по стандартной библиотеке (Николай Йосуттис) (обновлено для C++ 11) Введение и справочная информация по стандартной библиотеке C++. Второе издание (выпущено 9 апреля 2012 г.) охватывает C++ 11. [Обзор]

    C++ IO Streams и Locales (Анжелика Лангер и Клаус Крефт) Об этой книге очень мало что можно сказать, за исключением того, что если вы хотите что-то узнать о потоках и локалях, то это единственное место, где можно найти окончательные ответы, [Обзор]

    C++ 11/14/17/… Ссылки:

    C++11/14/17 Стандарт (INCITS/ISO/IEC 14882: 2011/2014/2020) Это, конечно, окончательный вариант арбитр всего, что есть или нет C++. Имейте в виду, однако, что он предназначен исключительно как справка для опытных пользователей, желающих посвятить значительное время и усилия для его понимания. Стандарт C++ 17 выпущен в электронной форме за 198 швейцарских франков.

    Стандарт C++ 17 доступен, но, по-видимому, не в экономичной форме — напрямую из ISO он стоит 198 швейцарских франков (около 200 долларов США). Для большинства людей окончательный вариант до стандартизации более чем достаточен (и бесплатен). Многие предпочитают еще более новый черновик, документирующий новые функции, которые, вероятно, будут включены в C++ 20.

    Обзор нового C++ (C++ 11/14) (только PDF) (Скотт Мейерс) (обновлено для C++ 14) Это презентационные материалы (слайды и некоторые лекции) примечания) трехдневного учебного курса, предложенного Скоттом Мейерсом, который является весьма уважаемым автором C++. Несмотря на то, что список товаров короткий, качество высокое.

    C++ Core Guidelines (C++ 11/14/17/…) (отредактированный Бьярном Страуструпом и Хербом Саттером) является развивающимся онлайн-документом, состоящим из набора руководств по использованию современных C++ Что ж. Руководящие принципы ориентированы на проблемы более высокого уровня, такие как интерфейсы, управление ресурсами, управление памятью и параллелизм, влияющие на архитектуру приложения и дизайн библиотеки. Проект был объявлен на CppCon’15 Бьярном Страуструпом и другими и приветствует вклад сообщества. Большинство руководств дополнены обоснованием и примерами, а также обсуждениями возможной поддержки инструмента. Многие правила специально разработаны для автоматической проверки с помощью инструментов статического анализа.

    C++ Super-FAQ (Marshall Cline, Bjarne Stroustrup и другие) — это попытка Фонда Standard C++ объединить часто задаваемые вопросы C++, которые ранее поддерживались индивидуально Marshall Cline и Bjarne Stroustrup, а также включение новых вкладов. Предметы в основном касаются вопросов на промежуточном уровне и часто написаны с юмористическим тоном. Не все элементы могут быть полностью обновлены до последней версии стандарта C++.

    cppreference.com(C++ 03/11/14/17/…) (инициированный Нейтом Колем) — это вики, в котором обобщены основные функции основного языка и имеется обширная документация стандартной библиотеки C++. Документация очень точная, но ее легче читать, чем официальный стандартный документ, и она обеспечивает лучшую навигацию благодаря своей вики-природе. Проект документирует все версии стандарта C++, а сайт позволяет фильтровать отображение для конкретной версии. Проект был представлен Нейтом Колем на CppCon’14.

    Классика/Старые

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

    Дизайн и эволюция C++ (Бьярне Страуструп) Если вы хотите узнать, почему язык такой, какой он есть, эта книга — то, где вы найдете ответы. Это охватывает все до стандартизации C++.

    Продвинутые C++ стили программирования и идиомы (Джеймс Коплиен) Предшественник движения паттернов, он описывает множество специфических для C++ «идиом». Это, безусловно, очень хорошая книга, и, возможно, ее стоит прочитать, если вы сможете сэкономить время, но она довольно старая и не в курсе текущих событий C++.

    Крупномасштабный C++ программный дизайн (Джон Лакос) Лакос объясняет методы управления очень большими C++ программными проектами. Конечно, хорошее чтение, если бы оно было актуальным. Он был написан задолго до C++ 98 и пропускает многие функции (например, пространства имен), важные для крупномасштабных проектов. Если вам нужно поработать над большим программным проектом C++, вы, возможно, захотите прочитать его, хотя вам нужно взять с собой больше, чем просто кусочек соли. Первый том нового издания ожидается в 2020 году.

    Внутри C++ объектной модели (Стэнли Липпман) Если вы хотите узнать, как обычно реализуются виртуальные функции-члены и как базовые объекты обычно размещаются в памяти в сценарии с множественным наследованием, и как все это влияет на производительность, Здесь вы найдете подробное обсуждение таких тем.

    Аннотированное C++ справочное руководство (Бьярн Страуструп, Маргарет А. Эллис) Эта книга довольно устарела, поскольку в ней рассматривается версия 1989 года C++ 2.0 — шаблоны, исключения, пространства имен и новые броски еще не были представлены, Однако, говоря, что эта книга проходит через весь стандарт C++ того времени, объясняя обоснование, возможные реализации и особенности языка. Это не книга для изучения принципов и шаблонов программирования на C++, но для понимания каждого аспекта языка C++.

    Ресурсы по C++

    Подборка справочников, курсов и видео по С++. Акцент сделан на англоязычный материал в силу предпочтений автора подборки. Имеется краткий анализ сред разработки. Если вам интересен материал по простому C, то обратитесь к первоначальному варианту статьи на . Позднее я сделала чистку обзора.

    cplusplus.com/doc — «These tutorials explain the C++ language from its basics up to the newest features introduced by C++11. Chapters have a practical orientation, with example programs in all sections to start practicing what is being explained right away.»
    cplusplus.com/reference — «Standard C++ Library reference»
    cplusplus.com/articles — Different articles

    en.cppreference.com — С++ reference

    The C++ Annotations (icce.rug.nl) — University of Groningen (Netherlands), 1994-2020

    GeeksforGeeks.org — один из разделов посвящён C++

    programiz.com/cpp-programming — «Learn C++ Programming». Есть небольшой обзор библиотек, нацеленный на начинающего программиста.

    ru.cppreference.com — Справка по С++, русский вариант

    .NET Code (netcode.ru) — «Официальный сайт справочников World C++, World C#, ASM World». Включает курс «C++ для начинающих», FAQ и множество статей. Сайт, похоже, уже давно не обновлялся.

    hackr.io — отзывы о курсах с прямыми ссылками на них

    курсы на сайтах

    w3schools.com — курс начального уровня с интерактивными упражнениями. Для тестирования своих знаний можете пройтись по упражнениям здесь.
    CodesDope (codesdope.com) — great resource for beginners. Include practice, discussion and blog with articles. — курс хороший, но огорчает большое количество опечатков в простых словах.
    TutorialsPoint.com/cplusplus — «Learn C++». Сайт наших индийских друзей. В уроках имеются песочницы. На сайте присутствует и отдельный online-компилятор, который можно держать загруженным в отдельном окне.
    LearnCpp.com — «Tutorials to help you master C++ and object-oriented programming» «LearnCpp.com is a free website devoted to teaching you how to program in C++. Whether you’ve had any prior programming experience or not, the tutorials on this site will walk you through all the steps to write, compile, and debug your C++ programs, all with plenty of examples. »
    CProgramming.com — «Your resource for C and C++» Turorials, References, Practice
    CS107: C++ Programming (learn.saylor.org) — курс, построенный на видео и статьях разных людей, которые можно найти и в других местах. Здесь это упорядочено. Возможно, что это перечень ресурсов для где-то идущих очных курсов.
    C9 Lectures: Stephan T. Lavavej — Core C++ (channel9.msdn.com, 2012) — курс в виде профессионального видеоподкаста на Channel 9 (Microsoft) На сайте можно найти и другие подобные подкасты
    DEV-HQ (C++ Tutorials) — нечто среднее между справочником и курсом
    WikiBooks (C++ Programming)
    C++ tutorial (w3schools.in) — объяснение короткое, только самая суть. Упор делается на самостоятельный разбор примеров. Лучше использовать как дополнение к какому-то другому курсу или чтобы быстро восстановить в памяти когда-то известное. Также хорошо подойдёт тем, кто уже имеет серьёзный опыт работы с другими языками и хочет быстро выучить С++ без чтения длинных мануалов.
    CForBeginners.com (С++) — сайт, похоже, в процессе наполнения. Кроме самого курса есть разделы, посвящённые алгоритмам, структурам данных, тестам и примерам программ.
    Computer Science: Introduction to Programming in C++ (mathbits.com) — статьи очень наглядны, по-максимуму используются все средства форматирования текста.
    C++ Tutorial – Learn C++ Programming with examples (beginnersbook.com)

    learn-cpp.org — курс включает в себя C++-песочницу online. Этот раздел сайта в данный момент только разрабатывается. К сентябрю 2020 готовы всего 2 первых урока и частично 3 последних. Песочница не работает. Курс пополняется силами разнозненных энтузиастов и поэтому медленно. Но к тому времени, когда вы читаете эти строки, возможно, там уже будет достойное содержимое.

    MIT Open Coureware > Introduction to C++ — level: Undergraduate, as taught in 2011
    From description: «This is a fast-paced introductory course to the C++ programming language. It is intended for those with little programming background, though prior programming experience will make it easier, and those with previous experience will still learn C++-specific constructs and concepts.»

    C++ Programming (1:10:32, 2014, Derek Banas)
    C++ Tutorials From Basic to Advance (9:13:04, 2020, Easy Programming). Среда CodeBlocks
    C++ Tutorial | Learn C++ programming (7:28:29, 2020, ProgrammingKnowledge). Среда CodeBlocks. В речи слышен сильный акцент.

    Learn C++ for Beginners — плейлист от littleblackbelt (9 видео, 2020). В качестве редактора используется Notepad++
    Eg Beginners C++ Series — плейлист от Ebonygeek45 (19 видео, 2012). Среда CodeBlocks
    C++ Programming Tutorials — плейлист от thenewboston (29 видео, 2008-09). Среда Dev-C++
    C++ Programming Tutorials — плейлист от thenewboston (73 видео, 2011). Среда CodeBlocks
    C++ GUI with Qt — плейлист от thenewboston (14 видео, 2012). Среда QT Creator
    C++ Programming Video Tutorials For Beginners — плейлист от LearningLad (143 видео, 2013). Среда CodeBlocks
    C++ Object Oriented Programming Video Tutorials For Beginners — плейлист от LearningLad (91 видео, 2014). Среда CodeBlocks
    C++ Tutorial for Beginners — плейлист от Cave of Programming (78 видео, 2014-15). Среда Eclipse
    C++ Programming Language — плейлист от Naresh i Technologies (индийский университет) (67 видео, 2020). Объяснения на доске
    C++ Tutorials in Animated Way — плейлист от Learn Programming In Animated Way (69 видео, 2020-17). Необычный подход. Теория объясняется на импровизированной доске в мультяшной форме. Под музыку но без озвучки. Для демонстрации примеров используется CodeBlocks.
    C++ Programming Tutorial for Beginners (For Absolute Beginners) — плейлист от ProgrammingKnowledge (57 видео, 2014-17). Среда CodeBlocks. В речи слышен сильный акцент.
    C++ Tutorial — Absolute n00b Spoonfeed — плейлист от antiRTFM (75 видео, 2008-09). Среда Visual Studio 2008. Разрешение видеороликов от 240 до 480p (попросту говоря, картинка размытая).

    Beginners C and C++ Video Tutorial — плейлист от Chris Efron (115 видео, 2013)

    О том, как можно программировать на C++ даже в Notepad++, можете посмотреть подборку видео на смежной странице.

    Интересная статья:
    The Ultimate Question of Programming, Refactoring, and Everything (software.intel.com) -42 практических совета для С++ разработчиков, которые помогут избежать типичных ошибок.

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

    edx.org
    — Introduction to C++ — Introductory, Microsoft, 4 weeks * 3-5 h/w, IDE Visual Studio
    From review: «This course gives a good introduction to C++ programming with Visual Studio and does not take a lot of time to finish, the content was not difficult to understand and there were some amusing moments.»

    Intermediate C++ — Intermediate, Microsoft, 4 weeks * 5-7 h/w, IDE Visual Studio
    From description: «This course is the second in a three-part series designed to teach students some of the most important C++ concepts. This part focuses on how C++ interacts with memory, featuring concepts like pointers/memory addresses, heap memory management, and writing/reading files.»

    Advanced C++ — Advanced, Microsoft, 4 weeks * 2-4 h/w, IDE Visual Studio

    — Programming Basics — Introductory, IITBombayX, 9 weeks, 8 hours/week, rating 3.5/5

    coursera.org
    C++ For C Programmers, Part A ( Part B) — 18 hours, taught by Ira Pohl, rating 4.4/5
    From description: » This course is for experienced C programmers who want to program in C++. The examples and exercises require a basic understanding of algorithms and object-oriented software.»

    udacity.com
    C++ For Programmers — Intermediate, taught by Catherine Gamboa, 3 weeks
    From description: «[The course] is designed for students who are familiar with a programming language and wish to learn C++.»

    Udemy (review page)
    === бесплатные ===
    C++ Tutorial for Complete Beginners — Beginner, instructor John Purcell, 2015, rating 4.3/5, IDE Eclipse
    [18 hours v >no exercises and quizes ]

    C++, Short and Sweet, Part 1 — Beginner, instructor Jeremy Siek, 2012, rating 4.3/5, IDE Eclipse
    From description: «This course is for beginners who want to get started writing programs in C++»
    [5,5 hours v >no exercises and quizes ]
    (О части 2 ничего не известно)

    Beginning C++ Templates — Beginner, instructor Umar Lone, 2020, rating 4.3/5, IDE Visual Studio
    From description: «C++ templates are used for creating high performance algorithms and classes. Most of the high performance libraries, such as Active Template Library, Windows Template Library, Adaptive Communication Environment, etc, have been implemented through C++ templates. Templates are a challenge for any novice C++ programmer. But, this course will help you understand the syntax of templates. It gently takes you through the basics and then slowly builds upon the advanced concepts such as specialization, variadic templates, etc.»
    [1,5 hours video, 4 articles, assignments]

    === коммерческие ===
    Beginning C++ Programming — From Beginner to Beyond — created by Tim Buchalka’s Learn Programming Academy, Frank J. Mitropoulos, 2020, rating 4.6, IDE CodeLight
    From description: «Obtain Modern C++ Object-Oriented Programming (OOP) and STL skills needed for game, system, and application development..»
    Некоторые темы: Pointers, Inheritance, Polymorphism, I/O Streams, STL. Чёткий голос. Прекрасная поддержка на форуме. По моему мнению, лучший курс по C++ на Udemy.
    [39.5 hours video, 3 articles, 37 coding exercises]

    Learn C++ Programming -Beginner to Advance- Deep Dive in C++ — created by Abdul Bari, 2020, rating 4.7, IDE Xcode (MaC)
    From description: «Classroom and Hands-on sessions- Features of C++ 11 , Exception Handling and STL — for Both Academics and Industry.»
    Основные объяснения у доски. К Xcode объяснения не привязаны, можно использовать любую другую IDE. Индийский анцент.
    Некоторые темы: OOP, Exception, Template functions and classes, Preprocessor directives, Destructors, I/O Streams, STL.
    [27.5 hours video, 48 coding exercises]
    +
    Mastering Data Structures & Algorithms using C and C++ — created by Abdul Bari, 2020, rating 4.7, IDE Xcode (MaC)
    From description: «Learn, Analyse and Implement Data Structure using C and C++.»
    [53.5 hours video, several quizes]

    C++ programming step by step from beginner to advance level — created by Shibaji Paul, 2020, rating 4.6, IDE Code Blocks
    From description: «Start with C++ basics then master on File I/O, Object Oriented Programming OOP, STL, Functors, Lambda with C++ 11/14.»
    Некоторые темы: Pointers, Dynamic memory allocation, Library vertor class, structure, mini-project, OOP, Exception, STL.
    [26 hours video, 1 articles, 43 coding exercises]

    Learn Advanced C++ Programming — created by John Purcell, 2020, rating 4.4, IDE Eclipse
    From description: «Discover intermediate to advanced C++, including C++ 11’s fantastic additions to the C++ standard.»
    [15 hours v >no exercises and quizes ]

    Learn C++ Programming from Beginner to Expert: 2020 — created by Harsh Kajla, 2020, rating 4.7, IDE Code Blocks
    From description: «Specially designed for people who don’t have any knowledge about programming & want to learn C++ from scratch»
    Серьёзных тем в курсе нет. Наиболее продвинутые: Sorting and searching algorithms, Pointers.
    [17 hours v >, 54 coding exercises ]

    C++: From Beginner to Expert — created by Arkadiusz Włodarczyk, 2020, rating 4.4, IDE Code Blocks
    From description: «Designed for people who don’t have any knowledge about the programming and want to program in C++.»
    Польский акцент. Некоторые темы: References, Pointers, project, OOP, templates, fstream library — working with files, mini database.
    [15 hours video, 5 articles, quizes]
    +
    C++ Working with Files — fstream I/O library — created by Arkadiusz Włodarczyk, 2020, rating 4.2, IDE Code Blocks
    From description: «Learn how to easily use the fstream library with the help of expert.»
    Материал этого курса включён в состав вышеуказанного. Так что брать этот курс отдельно смысла нет.
    [3 hours video, 1 article]

    Design Patterns in Modern C++ — created by Dmitri Nesteruk, 2020, rating 4.5, IDE CLion
    From description: «Discover the modern implementation of design patterns with С++.»
    [12 hours v >21 coding exercises ]

    Object Oriented Programming in C++ — created by Anand Mahajan, 2020, rating 4.7, IDE Code Blocks
    From description: «Master the skills in OOPs step by step .»
    [12 hours v >no exercises and quizes ]

    C/C++ Pointers & Applications — created by Umar Lone, 2020, rating 4.3, IDE Visual Studio
    From description: «Learn the applications of pointers such as usage in dynamic arrays, linked lists, function pointers, callbacks, etc.»
    [7 hours v >no exercises and quizes ]

    Functional Programming using C++ — created by Tobias Hermann, 2020, rating 4.6
    [ 1.5 hours video, several quizes]

    Advanced C++ Programming Training Course — created by Infinite Skills, 2020, rating 4.6, IDE Code Blocks
    Некоторые темы: Polymorphism, Generic programming, Exception handling, Stream I/O, Sequential and association Containers, Non-STL data structures and algorithms, Namespaces, String class.
    [6.5 hours video, 1 article, exercises]

    Data Structures and Algorithms in C++ For Coding Interview — created by Farouk Yasser, 2020, rating 4.6
    Ни к какой IDE курс не привязан, объясения на листе бумаги.
    [7 hours video, 6 articles, assignments]

    C/C++ for Intermediate Students — creaded by Randall Nagy, 2020, rating 3.8 (2 ratings)
    [7 hours video, no exercises and quizes]
    +
    C/C++ for Advanced Students — creaded by Randall Nagy, 2020, rating 3.8 (4 ratings)
    Ни к какой IDE курсы не привязаны.
    [7.5 hours video, no exercises and quizes]

    GeekforGeeks.org
    Fork CPP

    SoloLearn.com
    С++ Tutorial — Обучение представлено в виде игры. С одной стороны курс проходится легко и весело, с другой стороны он поверхностен.

    CaveOfProgramming.com
    C++ for Complete Beginners — instructor John Purcell

    Сайты с платными курсами:
    vtc.com (C++ Course) — курс на основе видео. Первые пару десятков видео можно посмотреть бесплатно.
    lynda.com
    caveofprogramming.com

    bestonlinecoursescoupon.com — ссылки на хорошие курсы по C++, сайт содержит различные промокоды

    Тема в наших обсуждениях, где мы периодически что-то выкладываем.

    ci-plus-plus-snachala.ru — курс, основа которого создана в 2011-12 годах. Поддерживается и дополняется новыми статьями.
    Уроки С++ (ravesli.com)
    C++ для начинающих (netcode.ru)

    === видео-уроки ===
    Наша подборка видеокурсов по C++ в vk
    Основы C++. Программирование для начинающих — плейлист от #SimpleCode (105 видео, 2020) — в качестве среды разработки используется Visual Studio 2020
    Основы С++ — плейлист от splincode wd (17 видео, 2020) — используется Qt Creator
    С++ программирование / Уроки C++ — плейлист от Гоши Дударь (26 видео, 2020) — используется XCode (работает только на MacOS)
    Изучение C++ в одном видео уроке за час! (1:14:32, 2020, Гоша Дударь)
    Создание игры на C++ / Змейка (3 видео, 2020)

    Подборка видеокурсов с YouTube на сайте tproger.ru.:
    «Основы C++» (для начинающих, 14 видео, 1ч 43мин, 2014)
    «Основы С++» (2) (для начинающих, 17 видео, 4ч 44мин, 2020)
    «Объектно-Ориентированное Программирование» (для начинающих, 14 видео, 2ч 52мин, 2015)
    «Углубленное программирование на C/С++» (для продолжающих, 9 видео, 24ч 09мин, 2014)
    «Многопоточный C++» (для продолжающих, 7 видео, 7ч 52мин, 2015)
    «Продвинутый C++» (для продолжающих, 40 видео, 8ч 54мин, 2020)
    «C++11 и продвинутый C++» (14 видео, 13ч 10мин, 2015)

    Курсы с зачислением:
    stepik.org
    — Введение в программирование (C++) — Академия Яндекса и Высшая школа экономики (НИУ ВШЭ), оцениваемая продолжительность 21 час, рейтинг 4.9/5

    — Программирование на языке C++ — Computer Science Center (CS центр), оцениваемая продолжительность 31 час, рейтинг 4.8/5

    — Углубленное программирование на C/C++ — Mail.Ru Group, оцениваемая продолжительность 24 часа, рейтинг 4.7/5

    — Подготовительная программа по программированию на С/C++ — Mail.Ru Group, оцениваемая продолжительность 19 часов, рейтинг 3.3/5

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

    10 отличий C от C++ (ru, psi-logic.narod.ru) — всем новичкам советую, как минимум, прочитать заключение
    Почему не лишено смысла писать код на C, а не на C++ (eax.me) — статья от 2020
    C++. Урок 5. Отличия С и C++ — видео на YouTube, 2020. Это один из уроков в ранее уже упомянутом плейлисте от splincode wd.
    C vs C++ 11 в одной странице (stableit.ru, 2020) — «Меня часто спрашивают, почему я не люблю, когда С используется для крупных проектов? Пожалуй, я нашел ответ.»

    === >Visual Studio Community 2020 (Wiki-eng, Wiki-ru) — Мощная IDE, которая даже в минимальной комплектации занимает несколько гигабайт. Может создавать код для различных ОС, однако сама может быть установлена только на Windows. Позволяет работать со множеством языков. Единственный бесплатный представитель линейки IDE Visual Studio. Если в интернете наткнётесь на заголовок «Full C and C++ IDE with Visual Studio», то это те же самые дистрибутивы VS.

    Qt Creator (Wiki-eng, Wiki-ru) — Прямой конкурент Visual Studio. Также занимает несколько гигабайт даже в минимальной комплектации. В отличие от Visual Studio, является кроссплатформенным. Другое отличие: специализируется только на С++. Кроме него имеет некоторый функционал только для JavaScript, QML, Python и Java. Разработан для работы с фреймворком Qt.

    Мастер Йода рекомендует:  Brute force Подробный анализ

    Code::Blocks (Wiki-eng, Wiki-ru) — Cамая популярная >* Главный минус: трудности с созданием графических приложений. Для использования WYSIWYG необходимо подключить внешний инструмент наподобие wxWidgets или GTK+, что требует определённых навыков. Программа имеет некоторое количество глюков, особенно в направлении создания графических приложений. Разрабатывается группой энтузиастов в свободное от основной работы время. Программа не заброшена, но официальные релизы выходят редко, последний полтора года назад. Существует линейка неофициальных релизов «Nightly builds», рекомендую, однако для них обязательно наличие в системе внешнего компилятора.

    P.S. Если используете Ubuntu/Mint и не хотите довольствоваться старой глючной версией в репозитории, то настраивайтесь на преодоление сложностей. Можете попробовать скомпилировать программу из исходного кода .

    CodeLite (Wiki-eng, Wiki-ru) — кроме C/C++ позволяет также писать код на PHP и JavaScript (с прицелом на Node.js). Использует инструментарий wxWidgets.

    Dev-C++ (Wiki-eng, Wiki-ru) — Относительно слабая IDE, разработка которой была прекращена в апреле 2015. Может использоваться только для учебных целей. Почти по всем параметрам проигрывает CodeBlocks.

    wxDev-C++ — форк Dev-C++. Устранён ряд багов, увеличена функциональность. И самое главное, хорошо интегрирован wxWidgets для разработки графических приложений.

    Eclipse (Wiki-eng, Wiki-ru) — >ьзуется. Нуждается в установка JVM (Java Virtual Machine), из чего следует кроссплатформенность. За поддержку С/С++ отвечает модуль CDT. Лучше не подбирать плагины самостоятельно, а скачать готовый пакет.

    NetBeans (Wiki-eng, Wiki-ru) — >о. Основная цель её создания — разработка кода на Java. Для работы с ней на PC должен быть установлен Sun JDK или J2EE SDK .

    CLion (Wiki-eng, Wiki-ru) — коммерческая >(159$ за 3-годовую подписку) .

    === полу- >Komodo Edit (Wiki-eng, Wiki-ru) — Облегчённая версия Komodo IDE. Создавать код на C++ в ней можно, но судя по информации с оф.сайта , она не даже производить его отладку. У программы другая специализация.

    Atom (Wiki-eng , Wiki-ru) — Позициорирует себя как редактор, но по своим возможностям ближе к IDE. Имеет красивую подсветку кода. Относительно своих возможностей воспринимается тяжеловатым.

    Visual Studio Code (Wiki-eng, wiki-ru) — Редактор кода с инструментом отладки и некоторыми другими продвинутыми технологиями. Но полноценной IDE его не назовёшь. Сходство между VS Code и VS Community примерно такое же, как между языками JavaScript и Java. Т.е. это совершенно разные вещи со своими специфическими плюсами и минусами. Плюсами VS Code являются кроссплатформенность и относительно маленький вес.

    Geany (wiki-eng, wiki-ru)
    Позиционируется как облегчённая IDE, но по сути представляет собой усовершенствованный текстовый редактор с некоторыми программистскими фичами. К примеру, прямая отправка кода на исполнение с автоматическим открытием внешней консоли. Лишён функции отладки (дебаггинга). В качестве программистского редактора удобен. Написан с использованием библиотек GTK+ (элементы интерфейса) и Scintilla (функционал редактирования текста). Поддерживает большое количество языков программирования. Если вы на Linux, то рекомендую воспользоваться неофициальными репозиториями. Версии в них могут быть немного ниже, чем последний релиз, но это сэкономит кучу нервов.

    Создавать код на языке C++ можно даже в простейшем текстовом редакторе. Необходимо только наличие в системе внешнего компилятора, который бы преобразовывал текст программы в исполняемый код. К примеру MinGW. В том числе некоторые из редакторов позволяют наладить прямой запуск создаваемого кода. Можете посмотреть нашу подборку видео на смежной странице о том, как такое можно наладить в Notepad++.

    === Онлайн-компиляторы ===

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

    Насколько важно учить Boost для разработчиков на C++?

    Мне интересно узнать Увеличение. Но я хотел спросить:

    • Насколько важно прилагать усилия для изучения Boost?
    • Какие предпосылки нужно иметь, прежде чем прыгать на Boost?

    Почему мне интересно знать о Boost, так это то, что многие люди говорят о Boost на каналах IRC и здесь, в StackOverflow.

    10 ответов

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

    Я думаю, что любой, кто серьезно рассматривает развитие C++ как карьеру, должен изучить Boost и выучить его хорошо. Когда вы начнете заниматься серьезным программированием, вы поймете, насколько полезными могут быть эти библиотеки и насколько продуктивнее они могут вас сделать. Мало того, что они кроссплатформенные, но как только вы начнете разбираться с большими числами данных, математические библиотеки особенно покажутся подарком сверху.

    Как разработчик игр, я был шокирован тем, как много людей не знают о Boost. Я упоминал об этом контактам в различных игровых студиях, и он не только часто не используется (это проблема лицензирования или портирования?), Но многие даже не слышали об этом. Это заставляет меня верить, что с точки зрения карьеры, на самом деле не важно изучать Boost, но с точки зрения личного развития, это, безусловно, жизненно важно. 🙂

    Что касается любых предварительных условий, вы должны быть знакомы с STL, и некоторый опыт работы с шаблонами не повредит. Я всегда удивляюсь тому, сколько программистов на C++ на самом деле не используют ни STL, ни шаблоны.

    Это очень важно, особенно с учетом того, что многие библиотеки из Boost переходят на стандарт C++ — с помощью Boost вы получите ранний взгляд на то, как будет выглядеть стандарт ( shared_ptr , кто угодно?).

    Более того, даже если вы их не используете, библиотеки Boost написаны очень хорошо и на них часто интересно смотреть; они делают действительно продвинутый C++.

    Я чувствую, что повышение — это такой улучшитель производительности, что я не думаю, что я бы согласился на работу с магазином C++, не использующим повышение.

    Язык — это инструмент. Используйте его, если это поможет вам чего-то достичь.

    Я так устал от этих религий. «Должен ли я использовать Boost? Если я не использую Boost, значит ли это, что я не настоящий программист на C++? Буду ли я похож на других программистов на C++?» Пожалуйста. Любой программист на C++, которому небезразлично, используете ли вы Boost или какую-либо другую библиотеку, — придурок, и вы не должны иметь с ним ничего общего.

    Скорее, найдите интеллектуального, непредубежденного человека, который может рассказать вам, как библиотека Boost и библиотека «кто знает, что такое» помогли ему в его собственной работе. Он даже признает, что иногда вам не нужны эти библиотеки.

    Альтернативный ответ: повторная реализация части Boost или STL самостоятельно — хороший способ сохранить ваши навыки программирования острыми. Другими словами, программист C++, который не может вернуться к C, потому что он не имеет своих библиотек, является слабым программистом.

    Boost имеет богатый набор библиотек, которые вы получаете бесплатно. Узнайте, какие библиотеки доступны в boost, чтобы вы могли использовать одну из них в случае необходимости. Об обучении выберите библиотеки, включенные в c ++ 0X, так что что вы можете использовать его, и скоро компиляторы будут поддерживать. Об определенной библиотеке изучите это, когда вам нужно.

    Помните, что boost — это просто набор библиотек, которые можно использовать для повышения производительности (прекратите изобретать велосипед).

    Они, по общему мнению, хорошо написаны и используют методы, которые вы не могли бы (то есть определенно не придумали) самостоятельно. Если вы намереваетесь просмотреть исходный код, чтобы изучить продвинутые методы с ++, то вырубитесь, но я думаю, что вместо этого я бы купил хорошую книгу.

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

    У нашей компании есть кроссплатформенные продукты, которые широко используют boost, но у нас также есть продукты только для Windows, которые используют некоторые boost, но по большей части полагаются на библиотеки Microsoft. Библиотеки MS хорошего качества и имеют (imo) отличную документацию (часть успеха MS заключается в том, чтобы максимально облегчить программирование окон для сторонних разработчиков). Я упоминаю MS конкретно, поскольку они предлагают широкий спектр библиотек для многих целей, таких как boost. Мы также используем многочисленные другие более специализированные сторонние библиотеки (то есть библиотеки, которые обеспечивают функциональность в одной области, такой как криптография).

    Судя (с научной точки зрения 🙂 по огромному количеству вопросов на SO о C++, ответы на которые имеют самые высокие оценки по принципу «Use Boost :: SomethingOrOther», я бы сказал, что это очень важно.

    То, что привело меня от C к Java вместо C++, было огромное количество поставляемых классов в Java. Boost почти удается убедить меня вернуться, за исключением того факта, что я сейчас сильно увлечен веб-сервисами, где Java является языком общения.

    Курс «Продвинутый C++»

    Практикум программирования на C++ под Windows
    comp.soft.prog.cppwin Выпуск #9A
    02/11/2000

    1983 (?)Объявлена Windows (т.е. работа над ней началась). В основном базировалась на идеях Xerox Parc и Mac, хотя Lisa также оказала некоторое влияние. 1984 Начата работа на Word for Windows 1.0
    Ноябрь 1985: Выпущена Windows 1.0 Окна не перекрывающеися (для простоты реализации механизма отсечения). Работа в реальном режиме (используется объем памяти до 1MB). Программы выполняются в общем адресном пространстве с кооперативной многозадачностью -GetMessage() позволяет переключать задачи -GlobalAlloc() хэндлы ссылаются на глобальгую таблицу хэндов, т.е размещенные буфера могут находиться где угодно. Окна диалога и обработку их событий необходимо полностью делать самому.Низкоуровневыe операции выполняются с помощью прерываний DOS.
    Инструменты разработки — Microsoft C и Assembler, выполняются в среде DOS и для запуски приложения надо сначала загрузить Windows. Отладка требует наличия второго монитора и видеокарты. Апрель 1987 Windows 2.0 Окна теперь могут перекрываться. На коммерческой основе поставляется SDK в качестве дополнения к MS C 5.0. Облегчается создание окон диалога — встроенная возможность создания и обработки.
    «Убойное приложение» — Excel. Практически это Windows поставляется в составе с Excel, так как занятый участок рынка еще очень мал
    В это же время объявляется о запуске проекта MS OS/2 1988 Опубликованна книга «Programming Windows». Чарльза Петцольда Теперь программисты могут писать работающие программы. Служба технической поддержки Microsoft помогает бесплатно решать проблемы, связанные с созданием ПО. 1988 Выпущена OS/2 1.1 с Presentation Manager Это _как_ Windows, но работает в защищенном режиме (т.е. требует 286 компьютера). Начало координат располагается слева внизу. Введен формат Device Independent Bitmap (BMP/DIB). 1988? Windows/286 + /386 Windows разивается до вересии 2.04, затем разделяется на Windows/286 и Windows/386. Последняя поддерживает несколько DOS окон. Программы могут адресовать память свыше 1MB через LIM/EMS BIOS интерфейс. Каждая софтина работает со своими собственными буферами в HMA, поэтому разделяемая память должна быть размещена до 640KB с установленным флагом GMEM_LOWER. Производительность программистов резко увеличивается, так как теперь можно запускать DOS компилятор из Windows. Ноябрь 1989: Наконец выходит в продажу Winword 1.0: прошло всего 4 года после той даты, на которую его выпуск был намечен первоначально Май 1990 : Выходит в продажу Windows 3.0 Это первая версия Windows, которая получила широкое признание. Она работает в 3 режимах -реальном (режим 8086 процессора как в Windows 2.x), защищенном (‘286) и расширенном (‘386, с DOS окнами и виртуальной памятью). Игнорируя реальный режим,16 битный- Windows API теперь ориентированн на сегментную модель памяти. Хэндл, возращаемый GlobalAlloc(), теперь возвращает что-то похожее на сегментный дескриптор 286 процессора. Так как трансляция сегмент:смещение в физическое положение в памяти выполняет CPU, то теперь приложения могут обращаться с памятью без опасений. Большое количество приложений аварийно завершаются с сообщением «Unrecoverable Application Error», так как они пытаются записать или прочитать из памяти, которой у них нет.User и GDI хэндлы все еще индексируют структуры данных внутри сегментов данных соотвествующих DLL; функции OS, которые используют эти хэндлы, должны доверять вызывающим программам — жертвуя таким образом надежностью ради скорости.
    Формат OS2 bitmap адоптирован для хранения изображений, и из-зи этого битмапы храняться «сверху вниз» в отличие от всего остального в Windows. Документация по SDK теперь состоит из 3 книг. В конце 1990 (?) поступает в продажу Microsoft C 6.0 Все еще являясь DOS приложением, теперь он содержит встроенную IDE, в которой при нажатии F1 появиться справка по ключевым словам и сообщениям об ошибках. Это фундаментальное улучшение на тот момент. В концеe 1990: пути MS и IBM расходяться . IBM хочет продолжать развитие OS/2 и использовать свои права на нее, чтобы уйти с рынка клонов. MS хочет увеличить свои доходы за счет продажи своей ОС всем подряд и предоставить удобный способ миграции с DOS. Они соглашаются идти своими путями. Конецe 1990/Начало 1991 Windows for Pens и Multimedia Windows Это специальные версии Windows 3.0. Так как мультимедийные расширения не являются частью стандартной поставки Windows, то добавляется новая DLL — MMSYSTEM.DLL-. Вот почему вы до сих пор должны прилинковать MMSYSTEM.LIB для использования функций типа PlaySound() Весна 1991: выходит в продажу Borland C++ Являясь первым компилятором Borland, который генерирует Windows код, эта DOS IDE становиться основным C++ компилятором для PC. Это не только сверхбыстрый компилятор, но и его отладчик работает без второго монитора. Потом выходит Borland C++ 2.0, который поддерживает более продвинутый C++.В качестве первого реального соперника продуктов Microsoft, он и его последователи стали той силой, которая подтолкнула создание семейства Visual C++. Лето 1991 (?) Visual Basic 1.0 Одна из первых RAD сред для Windows: примитивный, но вполне подходящий для создания прототипов и некоторых приложений. VBX архитектура стала самой успешной моделью программных компонентов. Конец 1991: Windows 3.1 Мультимедийные расширения становяться частью стандартной поставки , OLE 1.0 (очень труден для программирования) и исключение процессора #13 вызывают окно диалога «General Protection Fault». Toolhelp.DLL позволяет написание более продвинутых отладчиков.Хендлы User и GDI все еще ссылаются на структуры данных в сокрытых участках данных DLL, но теперь функции, которые принимают их в качестве параметров, проверяют их правильность. Стандартные окна диалога для открытия/сохранения файлов, выбора цвета и печати деляют эти стандартные задачи гораздо проще.
    Небольшие изменения существующих функци (например MoveTo() расширяется в MoveToEx()), заголовочный файл «windowsx.h» содержит более строгую проверку типов и макросов разбивки сообщений. Все это предназначено для упрощения перехода к Win32, когда придет время. Конец 1991: OWL 1.0 Это дополнение к Borland C++: библиотека классов, которая основывается на нестандартных расширениях языка C++ для привязки сообщений к членам класса и содержит smalltalk-подобную обертку вокруг некоторых стандартных Windows элементов (например вокруг самих оконо, но не вокруг контекстов устройства или GDI объектов) 1991? Quick C for Windows Это предшественник всех Visual продуктов: написанная для Windows IDE для C приложений. Выход ограничен консольными приложениями, но основы сегодняшних продуктов были заложены в нем. Начало 1992: Borland C++ 3.0 Первая из основанных на Windows IDE. OWL 1.0 поставляется в составе стандартной поставки. Достаточная глючная, но версия 3.1 была уже достаточна стабильная и быстрая. Середина 1992 (?): Microsoft C/C++ 7.0 Все еще основанная на DOS IDE, и это компилятор C++ Microsoft, который поставляется с первой версией библиотеки классов MFC. Как и 1.0 все написание кода выполняется вручную, но эта библиотека еще и добавляет объектную оболочку для GDI объектов. Середина 1992 (?) OLE2.0 бета Это первая версия OLE, которая использует COM в качестве своей основы. Конец 1992: Первоначальный Win32 API опубликован вместе с выпуском первой бета версии NT. Появдяются первые копии NT, встроенный в них API мало отличается от классического Windows API, так что перенос программ выполняется достаточно просто — особенно если вы пользовались STRICT макросами.Анонсирован Win32s — похоже, что Win3.1 была изначально разработана с возможностью распознавать 32-битные приложения и передавать их выполнение соотвествующим VxD. Win32 в NT предоставляет возможности для вытесняющей многозадачности, отделное адресное пространство для отдельных процессов и другие достаточно продвинутые возможности ОС. Хендлы памяти теперь указывают на адреса внутри памяти конкретного процесса, за исключением специальных ситуаций, когда ОС обрабатывает случаи, когда приложения считают, что они находяться в одной памяти.. Апрель 1993: Выпущен Visual C++ 1.0 Первый компилятор C++, который упрощает написание кода с помощью волшебников для создания приложений и обработки диалоговых окон. Хотя он и не является таким «Visual» каким является Visual Basic, он все равно более удобнее,чем что-либо еще. При разработке все равно используется старый компилятор командной строки, так что это довольно громоздкая среда разработки. Поддерживаются VBx расширения, что приводит к тому, что C++ приложения довольно долго приходится рихтовать, чтобы заставить выглядеть как VB среда.

    Этот продукт также заслуживает упоминания, как последняя среда разработки C/C++ от Microsoft, которая поставлялась с полной печатной документацией.

    Лето 1993: Выходит NT 3.1 Поддерживает только версия OLE 1.0, сама ОС достаточно медленная и громоздкая — требуется от 12 Мб ОЗУ, что стоит достаточно больших денег по тем временам. Она находит применение в качестве сервера, в основном за счет неограниченной клиентской лицензии. Кроме x86 CPUs, NT поддерживает MIPS и Alpha. В скоре выпускается Visual C++ для Windows NT — это 32-битная версия VC++1.0 IDE . Ноябрь 1993: Выходит Visual C++ 1.5. Он добавляет поддержку OLE2 в библиотеку классов и оказывается последним 16-битным компилятором Microsoft. Декабрь 1993: билд Chicago M5 Раздается бесплатно на Anaheim Windows Professional Developers Conference. Это первая бета версия того, что станет позднее Windows 95, и хотя она уже выполняет 32-битные приложения в вытесняющем режиме многозадачности, пользовательский интерфейс значительно изменится в релизе. Начало 1994: Выходит Borland C++4.x Мало работоспособный в начале, он является очень амбициозным проектом, так как может генерировать 16 или 32 битный код, содержит «Экспертов» ( аналог «Волшебников» в Visual C++). OWL 2.x практически полностью переписанная библиотека классов, так что приложения, написанные с использованием OWL 1.0 требуют коренной переделки. Лето 1994: Выходит NT3.5 Эта версия более оптимизированная по размеру и производительности, так что она получает большую популярность. Содержит 32-битный winsock стек, что является первой главной адаптацией Microsoft основанных на tcp/ip Internet протоколов. Конце 1994: Выходит Visual C++ 2.0 32-битная IDE, которая генерирует только 32-битный код, является частью стратегии, призванной принудить разработчиков перейти на Win32 API. Написание Win16 приложений требует использования VCC1.5 компилятора, который поставляется в составе дистрибутива. Начало продаж 32-битного компилятора до выхода главной 32-битной Windows было «убойным» предложением. Пока Windows 95 проходила этапы бета-тестирования, разработчики могли уже создавать приложения для нее. Начало 1995: Выходит Ole Control Developer Kit Это дополнение к VCC2.x, которое используется для перевода VBX’ов в 16- и 32-битный мир OCX’ов. Август 1995: Выходит Windows 95 Наиболее успешный выпуск ПО на сегодняшний день. Win32 становится главным API. Win32 API теперь содержит расширения для новых элементов управления и COM интерфейсы для обращения к оболчке. Другие части Win32 не реализованны. Сентябрь 1995: Windows NT3.51 Windows NT3.51 выпускается, чтобы обеспечить поддержку некоторых новых элементов управления и становится первой версией NT, которая работает на Power PC.До сих пор называемая самой стабильной версией NT для серверов, многие ориентированные на потребителя возможности следующих версий — DirectX, Explorer shell, интеграция Web браузера- просматриваются уже сейчас. Конец 1995: Выходит DirectX 1.0 DirectX API — развивающийся быстрее, чем ОС- разработан, чтобы сделать Windows идеальной платформой дял игр. Изначально направленный на обеспечение железо-независимого доступа к буферу фреймов и звуковым картам, сегодня этот API становится основой для 3D и приложений, связанных с трансляцией TB. Декабрь 1995: Объявлен ActiveX Объявление Microsoft Internet Strategy предварило возможность IE3 загружать OCX и показало то, что поддержка Internet станет важной частью ОС. Лето 1996: NT4.0 Это улучшенная NT с интерфейсом Windows 95 и большинством DirectX API. На низком уровне возможно использование Winsock 2 и Distributed COM для создания продвинутых сетевых приложений. API получили объекты Timer, которые имеют важное значение для приложений, реализующих свойство OnNow и обрабатывающих ситуации с нехваткой энергии. MIPS и PowerPC поддержка прекращена: Alpha становится единственной поддерживаемой не-x86 платформой. Лето 1996: Выпущен IE3.0 Опциональной расширении для Windows, расширяет рабочий стол новыми элементами управления, содержит web browser OCX и Wininet.DLL Конец 1996: Объявлена Windows CE 1.0 Доступность Win32 на palmtop компьютерах и встраиваемых продуктах была объявлена на Comdex в 1996. Сентябрь 1997: Выходит IE4.0 Еще одно расширение Win95 и NT4, на этот раз достаточно сильное, добавляет новые элементы управления, Distributed COM (для ’95) и OLE Automation интерфейс для многих сервисов интерфейса. Июнь 1998: Выходит Win98 IE4 встроен, переделка ядра для поддержки новых технологий связи и улучшенной управление питанием. Август 1998: Выходит NT5 Beta 2 Первая стабильная бета версия Windows БУДУЩЕГО Сентябрь 1998: Visual Studio 6.0 Улучшенный C++ IDE/compiler, более легкая разработка под web, не стандартный вариант Java. Март 1999: Выходит IE5 Некоторые изменения в Wininet.dll, но не гобальные, так что IE4.1 было бы более оправданным наименованием. Апрель 1999: Выходит NT5 Beta 3 COM+, многие вещи стали намного более стабильными Май 1999: Win98 SE Очень мало изменений по сравнению с Win98.0, но более похожее поведение на NT5, чем прежде. Февраль 2000: Windows 2000 Наиболее значимая версия Windows после Win95. Windows 2000 окончательно разрастается.

    Ну что же, к этому можно добавить выход Windows Millenium и объявление платформы .NET (лето 2000).

    Что мне следует кодировать, чтобы попасть в глубину продвинутого C++?

    Я ищу предложения по проекту, которые заставили бы меня «загрязнить руки» с расширенными возможностями C++. Я говорю о проектах, которые будут использовать всю мощь языка (STL или даже boost (не использовали его еще много)).

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

    Вот почему я ищу что-то, что мог бы написать сам, используя предпочтительно только C++ (возможно, + boost) — утилиту командной строки, без графики. И я действительно не хочу присоединяться к сообществу с открытым исходным кодом. Я знаю, что полезен код другого человека. Но это то, что я делаю на работе, поэтому . нет. Проект может быть чем угодно, значимым или бессмысленным, полезной утилитой или просто чем-то, что не имеет реального использования. Единственное требование — заставить меня действительно проверить мои навыки на C++. Или, по крайней мере, это должно быть очень сложно или даже невозможно закодировать с базовыми знаниями C++. Я такой человек, который никогда не удовлетворен кодом, который просто работает, поэтому я считаю, что это заставит меня учиться. Но имейте в виду, что я работающий человек, и мое время ограничено, поэтому ответы вроде «code your own OS» действительно не помогут.

    Создан 12 июл. 10 2010-07-12 20:19:44 PeterK

    Сообщество wiki . – BlueRaja — Danny Pflughoeft 12 июл. 10 2010-07-12 20:24:09

    Я сомневаюсь, что все может «заставить» вас использовать расширенные средства на C++. Любая проблема может быть решена процедурно, хотя с меньшей эффективностью/масштабируемостью и т. Д. Чтобы изучить передовые языковые концепции, вам нужно будет понять, что они есть, читайте о них, узнайте, как включить их в проекты, а затем нарисуйте их, когда это необходимо. Все эти вещи требуют времени, поэтому не создавайте искусственное ограничение, что вы слишком заняты, чтобы делать то, что необходимо. – Amardeep AC9MF 12 июл. 10 2010-07-12 20:25:35

    Чем сложнее проект, тем меньше мое желание использовать «расширенные» языковые функции. – anon 12 июл. 10 2010-07-12 20:38:02

    Если вы считаете, что STL и Boost являются «полной властью языка», вы не готовы к полной силе языка. (Не то, чтобы я уверен, что кто-то готов к полной силе C++, учитывая все.) – David Thornley 12 июл. 10 2010-07-12 21:02:18

    Я второй Нейл Баттерворт на нем. Кроме того, почему вы думаете, что лучший способ «[. ] учиться, [. ] искать новые проблемы [. ] сталкиваться с новыми вещами, новыми идеями и особенностями» делает все больше и больше того же самого ? Существует так много разных языков программирования, которые могут полностью изменить способ мышления и программы. Я считаю, что вы узнаете больше новых вещей на двухмесячном проекте lisp (или smalltalk, или occaml, или . что-либо с совершенно другой программной парадигмой), а затем на двухлетнем проекте C++. – Tomek Szpakowicz 12 июл. 10 2010-07-12 21:51:31

    11 ответов

    Что я должен кодировать, чтобы попасть в глубину продвинутого C++?

    1. Узнайте больше,
    2. узнать еще более,
    3. узнать еще больше.

    И, нет, я не шучу. Не за что. Я начал изучать C++ около 15 лет назад, и я все еще изучаю новые вещи на регулярной основе.

    Посмотрите на The Definitive C++ Book Guide and List и сделайте свой выбор.
    Я бы порекомендовал Modern C++ Design Андрея Alexandrescu и C++ Templates Полное руководство по Vandevoorde & Josuttis. Только эти двое — достаточно захватывающий вход, чтобы один программист получал новые идеи в течение нескольких месяцев, если не лет. (Обратите внимание, что чтение их в этом порядке имеет то преимущество, что книга Андрея тоньше и заставляет вас читать другую, чтобы полностью понять, что он пишет. Чтение их в обратном порядке имеет то преимущество, что вы не потеряетесь так часто в книге Андрея. Что бы вы ни выбрали.)

    Создан 12 июл. 10 2010-07-12 20:28:49 sbi

    Я бы рекомендовал те же две книги, но сначала прочитал _C++ Templates_ (по крайней мере, первые два раздела) . его содержимое очень полезно при чтении _Modern C++ Design_. – James McNellis 12 июл. 10 2010-07-12 20:32:46

    @James: На самом деле я думал, рекомендую ли я в этом порядке или наоборот. Я не уверен, но я добавлю об этом примечание. Спасибо, что указали это. – sbi 12 июл. 10 2010-07-12 20:34:14

    +1 Помимо проектов, книги являются действительно хорошим источником информации. Спасибо за предложение этих двух. Я посмотрю на них! – PeterK 12 июл. 10 2010-07-12 21:17:03

    @PeterK: Для меня, на протяжении многих лет, «продвинутый C++» предназначен для переключения вещей из времени выполнения во время компиляции. Главное преимущество этого из моего POV заключается в том, что то, что вылетает во время компиляции, не может взорваться на лице клиента. Поэтому одна практическая идея проекта — создать расширенную библиотеку протоколирования. Каждое нетривиальное приложение нуждается в некотором способе ведения журнала. Поэтому все ваши будущие проекты на C++ выиграют от этого . – sbi 12 июл. 10 2010-07-12 22:33:29

    . К сожалению, многие из библиотек протоколов C++, которые я видел, глубоко укоренились в OO (они часто являются копиями таких библиотек на Java и других таких языках) и являются полностью агностическими для C++ времени компиляции. (Известное исключение найдено [templog] (https://www.templog.org).) Это очень плохо, потому что библиотека протоколирования — это часть кода, которая никогда не может быть достаточно быстрой. Разработка собственной библиотеки быстрого ведения журнала представляет собой довольно сложную задачу, позволяющую вам многому научиться на расширенном C++ и использовать полезную утилиту в вашем наборе инструментов. – sbi 12 июл. 10 2010-07-12 22:34:27

    Делают ли разделы на шаблонах в «C++ 11 Primer» и в «Эффективном C++» фон, необходимый для решения «Современного дизайна C++»? – AlwaysLearning 25 июн. 15 2015-06-25 14:26:52

    @MeirGoldenberg: _TC++ P_ охватывает весь язык, поэтому он может вам что-то понять. Но знание всех правил шахмат не делает вас гроссмейстером. Вам нужно знать идиомы, разработанные из многолетнего опыта, чтобы быть хорошим программистом. Насколько вы знаете об этом, и как легко вы можете подобрать передовые вещи Александреску, я не знаю. Я бы сказал, что вы уходите, большинство думает, что он объясняет довольно хорошо, в конце концов. Если это слишком сложно, перед продолжением просмотрите Josuttis/Vandervoorde _ [C++ Templates: The Complete Guide] (https://stackoverflow.com/a/388282/140719) _. – sbi 30 июн. 15 2015-06-30 11:21:42

    Напишите многопотоковый веб-сервер. Напишите lisp. Создайте базу данных (вся вставка, SQL — опция).

    Создан 12 июл. 10 2010-07-12 20:23:02 Byron Whitlock

    +1 Да. Создание полезной и нетривиальной системы, основанной на звуковом знании CS (как перечисленные выше идеи), поможет вам изучить как ваш язык выбора в реальном мире, так и некоторые продвинутые темы CS. Последнее я нахожу гораздо более ценным, но первое тоже заслуживает изучения. – Tomek Szpakowicz 12 июл. 10 2010-07-12 21:57:42

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

    Создан 12 июл. 10 2010-07-12 20:30:10 cristobalito

    +1 для «быстрого и грязного», рассмотрим это как пример для начала 🙂 – PeterK 12 июл. 10 2010-07-12 21:15:31

    Другой плюс заключается в том, что вы всегда можете сравнить свою реализацию с тем, как это сделали другие. Просто избегайте соблазна взглянуть на другие реализации в первую очередь — идите сами, а затем посмотрите, как это улучшилось в другом месте. Имея это в виду, сделайте еще один шаг, начиная с нуля, если это необходимо. Приведенный пример должен быть относительно небольшим. G’luck. – cristobalito 12 июл. 10 2010-07-12 22:01:01

    Выберите любую дополнительную структуру данных (например, дерево, приоритетную очередь и т. Д.) И реализуйте ее.

    Таким образом, вы узнаете, как:
    — Дизайн в стиле ООП
    — обеспечить полезный и последовательный API
    — правильно использовать наследование, шаблоны, встроенные функции для FULLFILL ваших целей реализации
    — Написать кросс-платформенный код
    — написать исчерпывающие модульные тесты

    Используйте код STL как ссылку на то, как все должно быть сделано.

    Создан 12 июл. 10 2010-07-12 20:35:51 adamk

    Как бы вы использовали STL для изучения дизайна OO?STL вообще не об объектно-ориентированном программировании (наследование? Полис?), Это о _Generic Programming_. Если это OO, все контейнеры имели тот же базовый класс, который определял абстрактные методы, такие как ‘append()’ и ‘sort()’, и вы могли бы поместить в них потомков «объекта». Я видел свою долю в такой библиотеке в 90-е годы, и я очень рад, что пришел Степанов и научил нас, как сделать это лучше. – sbi 12 июл. 10 2010-07-12 22:18:58

    Что я должен кодировать, чтобы попасть в глубину продвинутого C++?

    C++ не имеет какой-либо реальные расширенного характеристики, язык хорошо сделан, передовые характеристики являются использованием многих библиотек, которая существует во всем мире.

    из Math LIBS, графика, коммуникации, окна/х окон/KDE/GNOME и т.д.

    , если вы хотите узнать зрелую библиотеку связи я предлагаю использовать The ADAPTIVE Communication Environment (ACE(TM)), который немного старой моды но имеют действительно прекрасную связку передовых концепций языка.

    Мастер Йода рекомендует:  Более 200 избранных ссылок на материалы о языке Go

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

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

    Вы можете использовать Netbeans или Eclipse, как множественная платформы KDE Developer для Linux (с KDE), MS Visual Studio в Windows, и т.д.

    Создан 12 июл. 10 2010-07-12 20:53:10 Gustavo V

    volatile — это то, что я бы назвал передовой характеристикой. Вам не обязательно использовать его в большинстве программных сценариев. – Bruno Brant 12 июл. 10 2010-07-12 21:02:15

    @Bruno Не часто используется! = Advanced, я очень редко (на самом деле никогда) не пользуюсь, например, оператором запятой, но он вряд ли продвинут. – anon 12 июл. 10 2010-07-12 21:25:08

    schmidt/PDF/MT-CORBA4.pdf — это просветительская работа по сложностям синхронной параллельной обработки и независимости платформы. – manifest 12 июл. 10 2010-07-12 21:41:19

    @Neil: AFAIK, volatile используется для иметь дело с параллелизмом/многопотоковой или аппаратной связью. Я считаю, что это продвинуто. – Bruno Brant 13 июл. 10 2010-07-13 17:08:16

    библиотека POCO C++ сделала реальное приятное или переполненное использование операторской запятой в разделе о библиотеке базы данных. https://pocoproject.org/ – Gustavo V 13 июл. 10 2010-07-13 18:47:27

    Вы упомянули создать что-то вроде ‘бесполезный полезности’. Скорее, я бы предложил подумать о приложении или утилите, которая была бы лично использована для вас, или, возможно, замене для приложения, которое вы уже используете, которое вы можете проектировать в соответствии с вашими собственными требованиями, рабочими процессами, эстетикой и т. Д. Выберите некоторые что вы хотите изучить из этого проекта, например, умные указатели, повышение, метапрограммирование шаблонов, регулярные выражения, многопоточность, сетевое взаимодействие. Затем продумайте, как реализовать приложение, используя выбранную технологию. Там, где есть немного кода, чтобы сделать это, вы знаете, как это сделать, а затем остановитесь и заставьте себя думать о том, как это сделать в новой идиоме. Например, попробуйте написать приложение, используя только интеллектуальные указатели.

    Опасность, я нахожу, в создании глупого демонстрационного приложения — это то, что у вас нет никаких стимулов для его завершения. Гораздо лучше иметь цель в виду инструмента, который вам полезен. Это именно то, что я делаю сейчас: у меня очень запутанный рабочий процесс для импорта фотографий, их пометки, переименование и редактирование, поэтому я решил написать приложение в C# и WPF, чтобы сделать это для меня. Это дает мне импульс, чтобы увидеть проект.

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

    Создан 12 июл. 10 2010-07-12 20:53:34 the_mandrill

    +1 Я не вижу смысла писать код, который не решает реальной проблемы, ни для себя, ни для кого-то другого. – anon 12 июл. 10 2010-07-12 21:22:29

    Довольно объективный ответ: я всегда считал, что самой мощной вещью в развитии ОО был полиморфизм. И его использование лучше всего наблюдается при работе с шаблонами проектирования.

    Итак, я рекомендую получить Design Pattern bible по GoF и написать код, который его использует. Приложение?Может быть любым, как указано ранее, потому что ничто не заставляет вас использовать какие-либо дополнительные возможности чего бы то ни было.

    (нужны доказательства? Одни из самых сложных в мире систем написаны на COBOL людей с нулевым теоретическими знаниями в CS)

    Создан 12 июл. 10 2010-07-12 21:01:14 Bruno Brant

    Um Я работал с программистами COBOL и даже сам написал некоторый COBOL — их системы действительно не такие сложные, по сравнению с (скажем) системами торговли или управления рисками (которые никогда не записываются в COBOL). – anon 12 июл. 10 2010-07-12 21:14:41

    Я работаю с системой COBOL. Финансовый в основном, который имеет дело с риском, с кредитом и множеством других вещей. Эти системы имеют огромную сложность, главным образом потому, что они большие, необходимо хорошо работать с большим количеством данных, а незначительные ошибки могут вызвать большие проблемы. Возможно, наше определение комплекса отличается. – Bruno Brant 13 июл. 10 2010-07-13 17:11:01

    Try писать фантазии пула памяти. Конечно, ваши руки скоро станут грязными. Если этого недостаточно, добавьте возможности сбора мусора;)

    Создан 12 июл. 10 2010-07-12 21:18:31 doc

    Objective-C с нуля

    Банальная теория возникновения ООП

    Проблема повторного использования написанного кода и его переносимость постоянно заставляет программистов искать все новые пути его упорядочивания, структуризации и абстрагирования. Для решения этих проблем создаются новые парадигмы программирования, шаблоны проектирования, новые языки, компиляторы и стандартные библиотеки к ним, программные платформы и фреймворки. Так образовались парадигма подпрограмм (процедур), реализуемая при помощи процессорных команд CALL\RET и стека (по сути, перенос потока выполнения по адресу произвольной, а не следующей за текущей команды, с последующим возвратом). Затем, парадигма модулей (каждый файл – отдельная единица трансляции), породившая двухэтапную трансляцию: компиляция модулей, а затем их компоновка (статическая или динамическая) в исполняемый модуль.

    В следствии увеличения объема кода в проектах и сложностей его поддержки, с 1960х начинает образовываться новая, объектно-ориентированная парадигма программирования, разбившая программы на еще более мелкие составляющие – типы данных. Ее суть заключается во взаимодействии сущностей (объектов) посредством посылки друг другу сообщений. Каждый объект является переменной определенного программистом типа данных (так называемого класса). Определение такого специального пользовательского типа данных (класса) заключается в двух вещах: определении набора данных (инвариантов, членов) и набора подпрограмм (методов), которые будут их обслуживать.

    Класс обычно оформляется как определенный программистом тип, основанный на встроенных (языковых) типах данных и\или других классах. Для языка С, не поддерживающего объектно-ориентированную парадигму, это может быть структура (struct). А набор подпрограмм реализуется как обычные функции, обязательно принимающие как минимум один параметр — указатель на набор данных, подлежащих обработке.

    Основным преимуществом объектно-ориентированного подхода стала возможность создавать новые классы на основе уже написанных (добавлять инварианты и методы, переопределять методы, использовать определенные в базовом классе методы как свои), названное наследованием.

    Набор методов представляет собой интерфейс для взаимодействия с инвариантами. Невозможность непосредственной модификации данных класса (без задействования его интерфейса) отражает принцип инкапсуляции. На рисунке показан класс и его объекты. Имеется инвариант x типа float и к нему интерфейс (метод) doubleX, возвращающий значение инварианта.

    Бывает, что необходимо послать сообщение объекту, который на него определенно отвечает (т.е. вызвать для объекта класса такой метод, который он реализовал), но, по ситуации, конкретный класс этого объекта неизвестен. Например, каждому элементу списка указателей на объекты класса Auto нужно послать сообщение Move, а известно что в списке находятся указатели на объекты не только класса Auto, но также и указатели на производные (наследованные) классы Ford и Subaru. Это возможно сделать только благодаря принципу полиморфизма, заключающегося в том, что при посылке определенного сообщения объекту из некой иерархии классов, в которой все объекты способны принять такое сообщение, этот объект реагирует на него соответственно своему, а не базовому для данной иерархии классу.

    Первым языком с поддержкой объектно-ориентированного подхода стал Simula67. Затем появился Smalltalk. А в 80х начал оформляться С++ — основной язык современного системного программирования. Его расширение и усовершенствование в 90х породило ряд парадигм и шаблонов проектирования, и оказало необратимое влияние на современное видение объектно-ориентированного подхода, в том числе, и на язык Objective-C.

    Чуть-чуть истории

    Objective-C возник в 80-x как модификация С в сторону Smalltalk. Причем модификация эта состояла в добавлении новых синтаксических конструкций и специальном препроцессоре для них (который, проходя по коду преобразовывал их в обычные вызовы функций С), а также библиотеке времени выполнения (эти вызовы обрабатывающей). Таким образом, изначально Objective-C воспринимался как надстройка над C. В каком-то смысле это так и до сих пор: можно написать программу на чистом С, а после добавить к ней немного конструкций из Objective-C (при необходимости), или же наоборот, свободно пользоваться С в программах на Objective-C. Кроме того, все это касается и программ на С++. В 1988 NeXT (а в последствии Apple) лицензировала Objective-C и написала для него компилятор и стандартную библиотеку (по сути SDK). В 1992 к усовершенствованию языка и компилятора подключились разработчики проекта GNU в рамках проекта OpenStep. С тех пор GCC поддерживает Objective-C. После покупки NeXT, Apple взяля их SDK (компилятор, библиотеки, IDE) за основу для своих дальнейших разработок. IDE для кода назвали Xcode, а для GUI – Interface Builder. Фреймворк Cocoa для GUI разработок (и не только) на сегодня является наиболее значимой средой разработки программ на Objective-C.

    Особенности Objective-C

    Обмен сообщениями

    Чтобы заставить объект выполнить какой-нибудь метод нужно послать ему сообщение, именуемое так же, как и требуемый метод. Такое сообщение называется селектор метода. Синтаксис посылки таков:

    В сообщении можно передавать параметры для вызываемого метода:

    Перед каждым параметром необходимо ставить двоеточие. Сколько двоеточий – столько и параметров. Имя метода может продолжаться после каждого такого двоеточия-параметра:

    Методы с неограниченным количством аргументов вызываюся следующим синтаксисом:

    Посылка сообщения, как и любая функция C, возвращает определенное (может void) значение:

    При посылке сообщения nil оно просто пропадает. При посылке сообщения объекту, который принадлежит классу, не реализовавшему заказанный метод, возникает исключение, которое, будучи не перехваченным, приводит всю программу к незапланированному завершению. Для проверки, отвечает ли данный объект на кокое-либо сообщение можно использовать следующий шаблон кода:

    Как работает передача сообщений

    Посылка сообщения транслируется в С-функцию с прототипом:

    Тип SEL, по сути, определен как char const *, но лучше воспринимать его как int, поскольку во время выполнения все селекторы индексируются целыми значениями согласно глобальной таблице селекторов.

    Пользуясь инвариантом isa объекта receiver (при использовании фреймворка Foundation, базового для Cocoa, все классы должны наследовать класс NSObject, поэтому наличие isa неизбежно), эта функция просматривает локальный список селекторов класса с целью определить, отвечает ли объект данного класса на сообщение method. Если такой селектор находится, то управление передается соответствующему методу класса, которому передается id объекта (указатель на его инварианты) и указанные после селектора параметры функции objc_msgSend(). Значение, возвращенное методом, отдается как результат посылки сообщения. Если у объекта-приемника данный селектор отсутствует, функции objc_msgSend() просматривает список селекторов его базового класса.


    При такой схеме вызов, например:

    Так как в глобальной таблице селекторов 12 соответствует строке “addObject:”. Далее функция objc_msgSend() выполняет поиск по списку селекторов объекта receiver и, найдя его (пусть это объект класса NSArray, который реализовал метод с селектором 12), производит вызов типа:

    Объявление метода

    Интересно отметить, что прототип метода addObject из предыдущего раздела в объявлении класса выглядел так:

    То есть принимал всего один параметр. Но, исходя из принципа объектно-ориентированной парадигмы, что методы – это подпрограммы, обрабатывающие определенные наборы данных, методу необходимо передавать адресс данных, подлежащих обработке. Поэтому такой параметр передается во всякий метод класса неявно. Компилятору об этом дополнительном параметре дает понять минус («-«), стоящий первым в прототипе метода. Такой метод (с минусом впереди) называется методом объекта (или экземпляра), т.к. может быть вызван только для объекта какого-нибудь класса. В теле метода этот указатель на экземпляр данных (или адрес объекта, которому послали сообщение) доступен посредством зарезервированного слова self (аналог this в С++), а указатель на экземпляр базового класса – через зарезервированное слово super. Кроме того, в метод объекта также передается неявный параметр _cmd – селектор этого метода из глобальной таблицы селекторов. С точки зрения программиста С++ все методы объектов в Objective-C как-будто объявлены с ключевым словом virtual, и всегда следуют динамическому полиморфизму.

    Если в начале прототипа метода поставить знак плюс (“+”), то такой метод будет считаться методом класса, и, естественно, не будет принимать неявный параметр self (это аналогично объявлению static-метода в С++). А без инварианта isa объекта, на который указывает self, указатель super работать, конечно, тоже не будет.
    Таким образом, прототип любого метода объявляется так:

    Если метод возвращает некий объект (тип id) или класс (тип Class), можно воспользоваться вложенным синтаксисом вызова:

    Здесь объекту класса UILabel из фреймворка UIKit устанавливается значение инварианта text равное строке @”Hello world”. Эта строка, в свою очередь, образована конкатенацией строк @”Hello” и @” world”. Первая является результатом посылке сообщения stringWithString классу NSString с параметром-константой @”Hello”. Такой вызов возвращает объект класса NSString, инициализированный строкой-параметром. Затем этому объекту посылается сообщение stringByAppendingString с параметром @” world”. Результат посылки этого сообщения и есть объект класса NSString, содержащий конкатенацию значения объекта-приемника и строкового аргумента. Этот объект и попадает как параметр в сообщение setText: объекта myLabel.

    Объявление класса

    Объявим простой класс комплексного числа в файле Complex.h:

    Как видим, все объявление заключено в ключевые слова interface и end. Первым делом объявляются инварианты (в фигурных скобках). Вне фигурных скобок объявляются методы. Метод description отсутствует в объявлении класса не случайно. Дело в том, что он, как и метод dealloc и init, присутствует в определении класса. При посылке объекту класса Complex сообщения description будет рассмотрен его локальный список селекторов, куда, после компиляции, попадут селекторы всех методов, реализованных классом этого объекта, даже не объявленные в интерфейсной части. То есть init, description и dealloc будут вызывать абсолютно корректно.

    Создание объектов

    В связи с тем, что все объекты распределяютя в динамической памяти, cоздание объекта приходится проводить в два этапа: 1) выделении памяти (сообщение alloc) и 2) инициализация инвариантов (конструкторы класса).

    После создания объекта им можно смело пользоваться:

    Некоторые классы обладают методом для быстрого (в один этап) создания собственных экземпляров. Такие методы являются методами класса, возвращают указатель на объект своего класса и их имя обычно начинается с названия самого класса. Например метод:

    Возвращает уже готовую строку, инициализированную соответствующей сторокой с завершающим нулем, без вызовов alloc и init:

    Время жизни объекта

    Как только указатель на объект выходит за свою область видимости, память, выделенная под него, безвозвратно теряется (если, конечно, это был последний указатель на тот объект) и происходит утечка. Дабы избежать таких нежелательных последствий в Objective-C поддерживается парадигма подсчета ссылок на ресурсы. Таким образом, у каждого объекта есть целочисленный счетчик, который показывает количество ссылающихся на него указателей. По достижению этим счетчиком нуля, память, выделенная для данного объекта, возвращается системе. После вызова метода класса alloc, этот счетчик равен единице. Чтобы увеличить его значение необходимо послать объекту сообщение retain, а чтобы уменьшить – release. Все эти методу реализует NSObject, который любой наш класс непременно наследует. Интересно отметить, что значение счетчика для статических объектов класса NSString (например @”I am a string”) равно -1, то есть максимально возможное. Вот пример работы со счетчиком:

    Реализация init очень важна. Это конструктор класса. Конструкторы отличаются тем, что возвращаеют id и их названия всегда начинается со слова init, а конструктор по умолчанию – это и есть просто init. Схема любого конструктора примерно следующая:

    Вот типичный специализированный (не по умолчанию) конструктор для класса с двумя членами типа некоторого класса и одним целочисленным инвариантом:

    Реализация release и retain для NSObject идеологически примерно следующая, и ее не нужно переопределять в производных классах, в силу отсутствия доступа к инварианту счетчика ссылок:

    То есть самому объекту посылается сообщение dealloc, в реализации метода которого он может, по необходимости, уменьшить счетчики своих инвариантов и передать аналогичное сообщение объекту базового класса, чтобы он сделал то же самое. Очевидно, реализация метода dealloc для NSObject освободит память, выделенную объекту. Обычно dealloc для какого-нибудь класса выглядит так:

    Методы доступа

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

    Так как инвариант _re относится ко встроенному типу, никаких сложностей с изменением его значения не возникает. Но если инвариант – объект некоторого класса – то простым присваиванием не обойтись, ведь надо учитывать счетчики ссылок. Для решения этой проблемы применяются следующие три метода:

    Вариант №3 не очень удачный потому, что засоряет текущий самовыгружаемый пул, а обычно это не очень желательно (см. следующий раздел).
    Метод доступа для чтения значения инварианта всегда очень прост:

    Самовыгружаемый пул в нитях программы

    Теперь попробуем вернуть из метода созданный внутри него объект:

    Строка формата соответствует стандарту языка С. Но если в ней необходимо указать тип id, то используется спецификатор формата %@. Каким образом метод, разбирающий формат, понимает какие символы подставить вместь id? Он просто подставит то, что вернет метод описания description данного объекта. Этот метод изначально объявлен для класса NSObject. NSString переопределил его на вывод своего строкового содержания. Переопределив его, любой объект может представлять свое строковое содержание. Например, так это может сделать класс комплексного числа с двумя инвариантами типа double:

    После выполнения метода sayHelloToName:withSurname: определенно произойдет утечка памяти, так как вызывающий код скорей всего не догадывается, что возвращенному объекту нужно после обработки послать сообщение release. Даже если он догадается это сделать, возможно, что возвращался указатель на инвариант объекта, а значит его уничтожение чревато серьезными последствиями. Хотелось бы иметь механизм самоосвобождения объектов когда либо в будующем, чтобы пользовательский код вообще не думал об их освобождении. Решается эта проблема с помощью объекта класса NSAutoreleasePool – самовыгружаемого пула объектов.

    После создания объекта такого класса всем объектам, созданным после него, можно послать сообщения autorelease. При этом данный объект помещается в текущий (последний созданный) самовыгружаемый пул. Когда некий пул получит сообщение release, то он отошлет такое же сообщение и всем своим объектам, уменьшая их счетчик ссылок (по сути, уничтожая). Таким образом. Объект, помещенный в самовыгружаемый пул, продолжает жить и занимать память во все время жизни пула. Это удобно для небольших временных объектов, но может с течением времени занять значительную часть памяти. Потому рекомендуется циклы, способные порождать большое количество временных объектов, которые отправляются в самовыгружаемый пул, обрамлять локальными (вложенными) пулами.

    Любая нить в программе, использующей Cocoa, должна создавать объект класса NSAutoreleasePool в самом начале (прежде создания других объектов), и в самом конце его уничтожать (после уничтожения всех других объектов). Функция main(), являющаяся главной нитью любой программы на Objective-C, при использовании фреймворка Cocoa должна всегда выглядеть вот так:

    А корректный метод sayHelloToName:withSurname: теперь будет выглядеть вот так:

    К слову, метод drain самовыгружаемого пула аналогичен release с той лишь разницей, что, кроме освобождения себя самомго и всех содержащихся объектов, еще дает подсказку сборщику мусора вступить в игру. Однако, это актуально только для Mac OS 10.4 и выше, так как на iOS сборки мусора нет.

    Определение класса

    Теперь рассмотрим файл Complex.m с определением методов класса Complex:

    Конструктор по умолчанию вызывает специализированный конструктор с определенными начальными параметрами. Метод complexWithRe:andIm: возвращает инициализированный объект класса Complex, размещенный в текущем самовыгружаемом пуле. То же самое делает и метод description, возвращая объект класса NSString. Вот пример программы, где используется класс Complex:

    Категории и расширения

    Если к уже написанному (а, возможно, и откомпилированному) классу нужно добавить\переопределить некоторые методы без наследования – категории позволяют это сделать без особых усилий:

    А пользоваться этим можно вот так:

    Расширения несут добрую службу как безымянные категории:

    Протоколы

    Протокол Objective-C – это формализованное объявление группы методов, которые, по желанию, может реализовать любой класс (аналог класса в С++, где все методы объявлены со спецификатором virtual … = 0). В версии языка 2.0 методы протокола могут быть требуемыми (спецификатор @required, он считается умалчиваемым) и выборочными (спецификатор @optional). Если какой либо класс реализовал требуемые методы протокола, то он называется классом, поддерживающим данный протокол. Протокол, и класс, его поддерживающий, объявляются вот так:

    Oбъекту класса MyPrinter можно гарантированно посылать сообщения print и switchedOn, и, после проверки на respondsToSelector:, можно посылать сообщение loadPaper:, та как в его реализации должны присутствовать определения одноименных методов. Объявление объекта класса, поддерживающего какой-либо протокол осуществляется так:

    Кроме того, один класс может удовлетворять нескольким протоколам. Для этого их можно перечислить через запятую в угловых скобках в объявлении класса.

    А чтобы объявить объект неизвестного класса (id), соответствующий некоторому протоколу, пишут так:

    Исключения

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

    Исключение – это объект некоторого класса. Он (даже своим типом) несет в себе некоторую информацию о произошедшей ситуации. Для удобства в Cocoa имеется класс NSException, который можно инициализировать двумя объектами NSString и одним объектом произвольного класса (тип id):

    Сгенерировать исключение и, тем самым, запустить механизм раскрутки стека вызовов, можно с помощью оператора @throw. Чтобы перхватить сгенерированное исключение, участок кода, где возможна его генерация, необходимо заключить в специальный блок с заглавием try (такие блоки могут быть вложенными). А затем, после этого блока, поставить блок с заглавием catch(), где в круглых скобках указать тип предполагаемого исключения. Блоков catch() после блока try может быть несколько. После генерации исключения управление, раскручивая стек, выходит из блока try и, проверяя по очереди все блоки catch(), попадает именно в тот блок catch(), в фигурных скобках которого стоит такой тип, к которому тип исключения приводится неявно (точное совпадение, указатель на базовый класс или id). Если исключение по типу не совпало ни с одним блоком catch(), управление продолжает раскрутку стека. Если после блока с заглавием try стоит блок с заглавием finally, то управление передастся ему независимо от того, произошло ли в блоке try исключение (и обработан какой-нибудь блок catch()), или выполнилась его последняя инструкция. Ниже приведен пример работы с объектом класса Cup в методе fill которого происходит исключение:

    В блоке finally удобно освобождать ресурсы, выделенные в блоке try, но не освобожденные по причине сгенерированного исключения.

    Свойства

    Для версии Objective-C 2.0 нашa реализация класса Complex явно избыточна: в ней слишком много методов доступа и их определение – сплошная рутина. Перепишем его с использованием свойств:

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

    • getter=getterName, setter=setterName Указывает, что метод доступа для чтения будет называться getterName, а для изменения — setterName
    • readonly Не генерировать метод доступа для изменения
    • readwrite Генерировать оба метода доступа
    • assign Метод доступа на изменение реализовывать посредством простого присваивания
    • retain Принимаемому значению послать сообщение retain, предыдущему значению инварианта послать release и присвоить ему принимаемое значение
    • copy Использовать обычный оператор присваивания, но присвоить копию принимаемого значения (перед присваиванием емупосылается сообщение copy)
    • nonatomic Не использовать внутренние блокировки для синхронизации нескольких нитей в сгенерированных методах доступа (по умолчанию cинхронизация используется)

    Теперь в определении класса Complex нам не нужно вручную писать методы доступа. Они сгенерируются компилятором и будут идентичны тем, что были раньше.

    Какой лучший способ перейти на продвинутый C++?

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

    Программист среднего уровня: достаточно хорошо понимает ISO C++, умеет читать и модифицировать чужой код с некоторой удачей, хорошо со структурами данных и алгоритмами, но не очень хорошо

    1. Изучай C++0x
    2. Узнайте, какой код сборки генерируется для различных типов конструкций, может быть, для x86
    3. Забудьте языковые нюансы и получите основы — теорию автоматов из таких мест, как Sipser или Papadimitriou
    4. Если вы знаете ООП или, по крайней мере, думаете, что знаете, подумайте, как объединить навыки функционального программирования с C++
    5. Работайте над чем-то вроде строк компилятора и с открытым исходным кодом, таких как LLVM или GNU Toolchain
    6. Вся идея разрушена — следующий уровень означает более сложные структуры данных. Так что, если вы знаете AVL, подумайте об изучении левого наклона красного черного дерева и др

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

    ПРИМЕЧАНИЕ: Спасибо всем за очень полезные ответы.

    12 ответов

    Чтобы ответить на ваши конкретные вопросы:

    Вам определенно нужно сделать это. Так что, возможно, у вас есть ответ прямо здесь.

    Узнайте, какой код сборки генерируется для различных типов конструкций, может быть, для x86

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

    Забудьте языковые нюансы и получите основы — теорию автоматов из таких мест, как Sipser или Papadimitriou

    Если это вас заводит, я полагаю.

    Если вы знаете ООП или, по крайней мере, думаете, что знаете, подумайте, как объединить навыки функционального программирования с C++

    Из всех парадигм, поддерживаемых C++, функциональное программирование, вероятно, поддерживается хуже всего — если вы хотите изучать FP, изучайте Haskell (или любой другой), а не C++.

    Работайте над чем-то вроде строк компилятора и с открытым исходным кодом, таких как LLVM или GNU Toolchain

    GNU написан на C, так что вряд ли он улучшит ваши навыки C++ — я мало знаю о LLVM.

    Вся идея разрушена — следующий уровень означает более сложные структуры данных. Так что, если вы знаете AVL, подумайте об изучении левого наклона красно-черных деревьев и др.

    Деревья RB не намного сложнее, чем деревья AVL — та же самая основная концепция. Если вы понимаете основные структуры, описанные в учебнике по структурам данных, я не вижу необходимости копать дальше, если предмет не особенно вас интересует.

    Я бы сказал, что вы можете сделать все в списке, но не все сразу. По крайней мере, IMO, вы смотрите на вещи немного назад, хотя. Изучение C++ (или любого другого языка) является средством для достижения цели, а не самоцелью.

    Изучение более продвинутых языковых методов, более сложных структур данных и т. Д., В основном, следует проводить тогда, когда это необходимо для достижения чего-либо. Вам, безусловно, нужна разумная стартовая «база», чтобы сделать многое, но помимо довольно небольшого набора основ, наиболее продвинутые методы, структуры данных и т. Д. Также относительно специализированы.

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

    Вы можете начать постепенно, просто используя его, и, углубившись в библиотеки, вы обнаружите, что думаете: «Как это работает?».

    • Его использование сделает вас более продуктивным и лучшим программистом на C++!
    • Понимание того, как это работает, даст вам значок «гуру»!!
    • Содействие и расширение его обеспечит бессмертие.

    Если вы знаете основной язык:

    Тогда в таком порядке (хотя будет некоторое обратное отслеживание)

    • Учитесь изучать и переваривать RAII
      • Выясните, как использовать RAII во всех контекстах C, чтобы вы никогда не застревали в C-коде.
    • Выясните исключения и каковы гарантии исключения.
      • Выясните, как реализовать методы так, чтобы выполнялись все типы гарантий.
    • Узнайте о стандартных контейнерах.
      • Узнайте о требованиях, предъявляемых к каждому контейнеру.
    • Узнайте об итераторах
      • Узнайте о чертах итераторов и о том, как они работают в сочетании с указателями.
    • Узнайте о библиотеке алгоритмов
    • Узнайте о потоковой библиотеке
      • Вернитесь назад и узнайте, как работают потоки и итераторы.
    • Узнайте о методах указателей и как их можно использовать в алгоритмах
      • Выясните, что такое функтор и как его использовать.
    • Узнайте о привязке и посмотрите на Boost Bind
    • Узнайте о буст-контейнерах и о том, чем они отличаются от стандартных контейнеров.
    • Узнайте о умных указателях.
      • Каковы различные типы и когда эффективно использовать каждый из них.
    • Начните читать о других вещах, доступных в boost.

    На данный момент вы будете в начале обучения, как использовать C++

    Не беспокойтесь о C++0x прямо сейчас. убедитесь, что вы действительно действительно сначала понимаете основы. Это означает, что вы должны понимать ссылки, указатели, L-значения, R-значения, шаблоны, наследование, управление памятью и т. Д. И т. Д. Я не просто говорю о базовом понимании этого, я говорю, что действительно знаю память C++ модель и что означает каждое выражение.

    Мне очень нравятся № 4 и № 6. Что касается #6, попробуйте кодировать некоторые действительно продвинутые структуры данных в C++. Ничто не заставит вас учить язык быстрее, чем пытаться решить некоторые проблемы, которые влекут за собой сложные структуры данных.

    Изучите, как другие люди решают сложные проблемы элегантным способом. Очень важно: просто тренируйтесь, не забывая оценивать. Проверьте ваш код или методы решения проблем.

    Да (ссылаясь на пункт 4), изучайте другие языки программирования, особенно те, которые имеют определенные преимущества по сравнению с C++, вместо того, чтобы применять их методы непосредственно в C++. Сосредоточьтесь на том, чтобы найти для себя методы кодирования с наименьшим количеством ошибок, которые могут нарушить ваш рабочий процесс, найдите откалиброванный систематический и абстрактный подход, который вы всегда сможете применить к решению проблем и их реализации.

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

    Я стремлюсь к производительности здесь. Если вы больше увлекаетесь теорией, то можете просто заняться небольшими фрагментами и неясными языковыми особенностями.

    Окончательное руководство и список книг на С++

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

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

    Мастер Йода рекомендует:  Количество закрытых репозиториев для платных аккаунтов на GitHub теперь не ограничено

    Пожалуйста, отредактируйте принятый ответ, чтобы обеспечить качественные книги и приблизительный уровень навыков — предпочтительно после обсуждения вашего добавления в С++ чат. (Регулярные люди могут беспощадно отменить вашу работу, если они не согласны с рекомендацией.) Добавьте короткую рекламу/описание каждой книги, которую вы лично читали/получали. Не стесняйтесь обсуждать качество, заголовки и т.д. В список будут добавлены книги, соответствующие критериям. Книги, которые имеют обзоры Ассоциации пользователей C и С++ (ACCU), имеют ссылки на обзор.

    * Примечание. Часто задаваемые вопросы и другие ресурсы можно найти в теге С++ и в С++ — faq.Суб >

    Начинающий

    Вводный, без опыта программирования

    C++ Учебник для начинающих * (Стэнли Липпман, Жозе Ладжои и Барбара Э. Му) (обновлено для C++ 11) На 1 тыс. Страниц это очень подробное введение в C++ это охватывает почти все на языке в очень доступном формате и очень подробно. Пятое издание (выпущено 16 августа 2012 г.) охватывает C++ 11. [Обзор]

    Программирование: принципы и практика с использованием C++ (Бьярн Страуструп, 2-е издание — 25 мая 2014 г.) (обновлено для C++ 11/C++ 14) Введение в программирование с использованием C++ создателем языка. Хорошее чтение, которое не предполагает никакого предыдущего опыта программирования, но не только для начинающих.

    * Не путайте с C++ Primer Plus (Стивен Прата) со значительно менее благоприятным обзором.

    Вводный, с предыдущим опытом программирования

    Тур по C++ (Бьярне Страуструп) (2-е издание для C++ 17) «Тур» — это краткий обзор (около 180 страниц и 14 глав) всех стандартных C++ (язык и стандартная библиотека, и использование C++ 11) на умеренно высоком уровне для людей, которые уже знают C++ или, по крайней мере, являются опытными программистами. Эта книга представляет собой расширенную версию материала, составляющего главы 2-5 языка программирования C++, 4-е издание.

    Ускоренный C++ (Эндрю Кениг и Барбара Му, 1-е издание — 24 августа 2000 г.) Это в основном покрывает ту же почву, что и C++ Primer, но делает это на четвертой части своего пространства. Во многом это связано с тем, что это не попытка быть введением в программирование, а введением в C++ для людей, которые ранее программировали на каком-то другом языке. У него более крутая кривая обучения, но для тех, кто может с этим справиться, это очень компактное введение в язык. (Исторически сложилось так, что он первым открыл книгу, в которой использовался современный подход к обучению языку.) Несмотря на это, C++ он учит чисто C++ 98. [Обзор]

    Лучшие практики

    Эффективно C++ (Скотт Мейерс, 3-е издание — 22 мая 2005 г.) Это было написано с целью стать лучшей второй книгой C++, которую должны прочитать программисты, и это удалось. Предыдущие выпуски были нацелены на программистов, пришедших из C, третье издание изменило это и нацелено на программистов из таких языков, как Java. Он представляет

    50 легко запоминающихся эмпирических правил вместе с их обоснованием в очень доступном (и приятном) стиле. Для C++ 11 и C++ 14 примеры и некоторые проблемы устарели, и следует отдать предпочтение Effective Modern C++. [Обзор]

    Effective Modern C++ (Скотт Мейерс) Это в основном новая версия Effective C++, предназначенная для программистов C++, переходящих от C++ 03 к C++ 11 и C++ 14.

  • Effective STL (Скотт Мейерс) Это делается для того, чтобы сделать ту же часть стандартной библиотеки, исходящей от STL, что Effective C++ сделал с языком в целом: он представляет практические правила вместе с их обоснованием. [Обзор]
  • Промежуточное

    Более эффективный C++ (Скотт Мейерс) Даже больше практических правил, чем Эффективный C++. Не так важно, как в первой книге, но все же полезно знать.

    Исключительный C++ (Херб Саттер) Представленный в виде набора головоломок, он содержит одно из лучших и подробных обсуждений правильного управления ресурсами и безопасности исключений в C++ через Resource Acquisition is Initialization (RAII) в дополнение к всесторонний охват множества других тем, включая идиому pimpl, поиск имени, хороший дизайн класса и модель памяти C++. [Обзор]

    Подробнее Исключительный C++ (Херб Саттер) Охватывает дополнительные темы безопасности исключений, не охваченные в Исключительном C++, в дополнение к обсуждению эффективного объектно-ориентированного программирования в C++ и правильному использованию STL. [Обзор]

    Исключительный стиль C++ (Херб Саттер) Обсуждает общее программирование, оптимизацию и управление ресурсами; в этой книге также представлено отличное изложение того, как писать модульный код в C++, используя функции, не являющиеся членами, и принцип единой ответственности. [Обзор]

    C++ Стандарты кодирования (Херб Саттер и Андрей Александреску) «Стандарты кодирования» здесь не означают «сколько пробелов я должен сделать отступом для моего кода?» Эта книга содержит 101 передовой опыт, идиомы и распространенные ловушки, которые могут помочь вам написать правильный, понятный и эффективный код C++. [Обзор]

    C++ Шаблоны: Полное руководство (Дэвид Вандевурде и Николай М. Йосуттис) Это книга о шаблонах в том виде, в каком они существовали до C++ 11. Он охватывает все, от самых базовых до самых передовых метапрограммирования шаблонов, и объясняет каждую деталь того, как работают шаблоны (как концептуально, так и как они реализованы), и обсуждает много распространенных ошибок. Имеет отличные сводки по правилу единого определения (ODR) и разрешению перегрузки в приложениях. второе издание, охватывающее C++ 11, C++ 14 и C++ 17, уже опубликовано. [Обзор]

    C++ 17 — Полное руководство (Николай М. Хосуттис) В этой книге описаны все новые функции, представленные в стандарте C++ 17, охватывающие все, начиная от простых, таких как «встроенные переменные», «constexpr if» и все вплоть до «Полиморфных ресурсов памяти» и «Новых и удаленных с переподписанными данными».

    Расширенный

    Современный C++ дизайн (Андрей Александреску) Революционная книга о передовых общих методах программирования. Представляет дизайн на основе политик, списки типов и фундаментальные общие идиомы программирования, а затем объясняет, сколько полезных шаблонов проектирования (включая распределители небольших объектов, функторы, фабрики, посетителей и мульти-методы) могут быть реализованы эффективно, модульно и чисто с использованием универсального программирования., [Обзор]

    C++ Concurrency In Action (Энтони Уильямс) Книга, в которой описывается поддержка параллелизма C++ 11, включая библиотеку потоков, атомарную библиотеку, модель памяти C++, блокировки и мьютексы, а также вопросы проектирования и отладки. многопоточные приложения. второе издание, охватывающее C++ 14 и C++ 17, уже опубликовано.

    Продвинутый C++ Метапрограммирование (Давиде Ди Дженнаро) Предварительное C++ 11 руководство по методам TMP, сосредоточенное больше на практике, чем на теории. В этой книге содержится множество фрагментов, некоторые из которых устарели по типу черт, но методы, тем не менее, полезно знать. Если вы можете смириться с причудливым форматированием/редактированием, его легче читать, чем Александреску, и, возможно, это более полезно. Для более опытных разработчиков есть хороший шанс, что вы сможете найти что-то о темном angularке C++ (причуде), который обычно появляется только благодаря обширному опыту.

    Стиль ссылки — все уровни

    C++ Язык программирования (Бьярн Страуструп) (обновлено для C++ 11) Классическое введение в C++ его создателем. Написанный параллельно с классическим K & R, он действительно очень похож на него и охватывает практически все: от базового языка до стандартной библиотеки, от парадигм программирования до философии языка. [Обзор] Примечание. Все выпуски стандарта C++ отслеживаются по этому вопросу: Где найти текущий стандарт C++.

    C++ Учебное пособие и справочник по стандартной библиотеке (Николай Йосуттис) (обновлено для C++ 11) Введение и справочная информация по стандартной библиотеке C++. Второе издание (выпущено 9 апреля 2012 г.) охватывает C++ 11. [Обзор]

    C++ IO Streams и Locales (Анжелика Лангер и Клаус Крефт) Об этой книге очень мало что можно сказать, за исключением того, что если вы хотите что-то узнать о потоках и локалях, то это единственное место, где можно найти окончательные ответы, [Обзор]

    C++ 11/14/17/… Ссылки:

    C++11/14/17 Стандарт (INCITS/ISO/IEC 14882: 2011/2014/2020) Это, конечно, окончательный вариант арбитр всего, что есть или нет C++. Имейте в виду, однако, что он предназначен исключительно как справка для опытных пользователей, желающих посвятить значительное время и усилия для его понимания. Стандарт C++ 17 выпущен в электронной форме за 198 швейцарских франков.

    Стандарт C++ 17 доступен, но, по-видимому, не в экономичной форме — напрямую из ISO он стоит 198 швейцарских франков (около 200 долларов США). Для большинства людей окончательный вариант до стандартизации более чем достаточен (и бесплатен). Многие предпочитают еще более новый черновик, документирующий новые функции, которые, вероятно, будут включены в C++ 20.

    Обзор нового C++ (C++ 11/14) (только PDF) (Скотт Мейерс) (обновлено для C++ 14) Это презентационные материалы (слайды и некоторые лекции) примечания) трехдневного учебного курса, предложенного Скоттом Мейерсом, который является весьма уважаемым автором C++. Несмотря на то, что список товаров короткий, качество высокое.

    C++ Core Guidelines (C++ 11/14/17/…) (отредактированный Бьярном Страуструпом и Хербом Саттером) является развивающимся онлайн-документом, состоящим из набора руководств по использованию современных C++ Что ж. Руководящие принципы ориентированы на проблемы более высокого уровня, такие как интерфейсы, управление ресурсами, управление памятью и параллелизм, влияющие на архитектуру приложения и дизайн библиотеки. Проект был объявлен на CppCon’15 Бьярном Страуструпом и другими и приветствует вклад сообщества. Большинство руководств дополнены обоснованием и примерами, а также обсуждениями возможной поддержки инструмента. Многие правила специально разработаны для автоматической проверки с помощью инструментов статического анализа.

    C++ Super-FAQ (Marshall Cline, Bjarne Stroustrup и другие) — это попытка Фонда Standard C++ объединить часто задаваемые вопросы C++, которые ранее поддерживались индивидуально Marshall Cline и Bjarne Stroustrup, а также включение новых вкладов. Предметы в основном касаются вопросов на промежуточном уровне и часто написаны с юмористическим тоном. Не все элементы могут быть полностью обновлены до последней версии стандарта C++.

    cppreference.com(C++ 03/11/14/17/…) (инициированный Нейтом Колем) — это вики, в котором обобщены основные функции основного языка и имеется обширная документация стандартной библиотеки C++. Документация очень точная, но ее легче читать, чем официальный стандартный документ, и она обеспечивает лучшую навигацию благодаря своей вики-природе. Проект документирует все версии стандарта C++, а сайт позволяет фильтровать отображение для конкретной версии. Проект был представлен Нейтом Колем на CppCon’14.

    Классика/Старые

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

    Дизайн и эволюция C++ (Бьярне Страуструп) Если вы хотите узнать, почему язык такой, какой он есть, эта книга — то, где вы найдете ответы. Это охватывает все до стандартизации C++.

    Продвинутые C++ стили программирования и идиомы (Джеймс Коплиен) Предшественник движения паттернов, он описывает множество специфических для C++ «идиом». Это, безусловно, очень хорошая книга, и, возможно, ее стоит прочитать, если вы сможете сэкономить время, но она довольно старая и не в курсе текущих событий C++.

    Крупномасштабный C++ программный дизайн (Джон Лакос) Лакос объясняет методы управления очень большими C++ программными проектами. Конечно, хорошее чтение, если бы оно было актуальным. Он был написан задолго до C++ 98 и пропускает многие функции (например, пространства имен), важные для крупномасштабных проектов. Если вам нужно поработать над большим программным проектом C++, вы, возможно, захотите прочитать его, хотя вам нужно взять с собой больше, чем просто кусочек соли. Первый том нового издания ожидается в 2020 году.

    Внутри C++ объектной модели (Стэнли Липпман) Если вы хотите узнать, как обычно реализуются виртуальные функции-члены и как базовые объекты обычно размещаются в памяти в сценарии с множественным наследованием, и как все это влияет на производительность, Здесь вы найдете подробное обсуждение таких тем.

    Аннотированное C++ справочное руководство (Бьярн Страуструп, Маргарет А. Эллис) Эта книга довольно устарела, поскольку в ней рассматривается версия 1989 года C++ 2.0 — шаблоны, исключения, пространства имен и новые броски еще не были представлены, Однако, говоря, что эта книга проходит через весь стандарт C++ того времени, объясняя обоснование, возможные реализации и особенности языка. Это не книга для изучения принципов и шаблонов программирования на C++, но для понимания каждого аспекта языка C++.

    Насколько важно учить Boost для разработчиков на C++?

    Мне интересно узнать Увеличение. Но я хотел спросить:

    • Насколько важно прилагать усилия для изучения Boost?
    • Какие предпосылки нужно иметь, прежде чем прыгать на Boost?

    Почему мне интересно знать о Boost, так это то, что многие люди говорят о Boost на каналах IRC и здесь, в StackOverflow.

    10 ответов

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

    Я думаю, что любой, кто серьезно рассматривает развитие C++ как карьеру, должен изучить Boost и выучить его хорошо. Когда вы начнете заниматься серьезным программированием, вы поймете, насколько полезными могут быть эти библиотеки и насколько продуктивнее они могут вас сделать. Мало того, что они кроссплатформенные, но как только вы начнете разбираться с большими числами данных, математические библиотеки особенно покажутся подарком сверху.

    Как разработчик игр, я был шокирован тем, как много людей не знают о Boost. Я упоминал об этом контактам в различных игровых студиях, и он не только часто не используется (это проблема лицензирования или портирования?), Но многие даже не слышали об этом. Это заставляет меня верить, что с точки зрения карьеры, на самом деле не важно изучать Boost, но с точки зрения личного развития, это, безусловно, жизненно важно. 🙂

    Что касается любых предварительных условий, вы должны быть знакомы с STL, и некоторый опыт работы с шаблонами не повредит. Я всегда удивляюсь тому, сколько программистов на C++ на самом деле не используют ни STL, ни шаблоны.

    Это очень важно, особенно с учетом того, что многие библиотеки из Boost переходят на стандарт C++ — с помощью Boost вы получите ранний взгляд на то, как будет выглядеть стандарт ( shared_ptr , кто угодно?).

    Более того, даже если вы их не используете, библиотеки Boost написаны очень хорошо и на них часто интересно смотреть; они делают действительно продвинутый C++.

    Я чувствую, что повышение — это такой улучшитель производительности, что я не думаю, что я бы согласился на работу с магазином C++, не использующим повышение.

    Язык — это инструмент. Используйте его, если это поможет вам чего-то достичь.

    Я так устал от этих религий. «Должен ли я использовать Boost? Если я не использую Boost, значит ли это, что я не настоящий программист на C++? Буду ли я похож на других программистов на C++?» Пожалуйста. Любой программист на C++, которому небезразлично, используете ли вы Boost или какую-либо другую библиотеку, — придурок, и вы не должны иметь с ним ничего общего.

    Скорее, найдите интеллектуального, непредубежденного человека, который может рассказать вам, как библиотека Boost и библиотека «кто знает, что такое» помогли ему в его собственной работе. Он даже признает, что иногда вам не нужны эти библиотеки.

    Альтернативный ответ: повторная реализация части Boost или STL самостоятельно — хороший способ сохранить ваши навыки программирования острыми. Другими словами, программист C++, который не может вернуться к C, потому что он не имеет своих библиотек, является слабым программистом.

    Boost имеет богатый набор библиотек, которые вы получаете бесплатно. Узнайте, какие библиотеки доступны в boost, чтобы вы могли использовать одну из них в случае необходимости. Об обучении выберите библиотеки, включенные в c ++ 0X, так что что вы можете использовать его, и скоро компиляторы будут поддерживать. Об определенной библиотеке изучите это, когда вам нужно.

    Помните, что boost — это просто набор библиотек, которые можно использовать для повышения производительности (прекратите изобретать велосипед).

    Они, по общему мнению, хорошо написаны и используют методы, которые вы не могли бы (то есть определенно не придумали) самостоятельно. Если вы намереваетесь просмотреть исходный код, чтобы изучить продвинутые методы с ++, то вырубитесь, но я думаю, что вместо этого я бы купил хорошую книгу.

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

    У нашей компании есть кроссплатформенные продукты, которые широко используют boost, но у нас также есть продукты только для Windows, которые используют некоторые boost, но по большей части полагаются на библиотеки Microsoft. Библиотеки MS хорошего качества и имеют (imo) отличную документацию (часть успеха MS заключается в том, чтобы максимально облегчить программирование окон для сторонних разработчиков). Я упоминаю MS конкретно, поскольку они предлагают широкий спектр библиотек для многих целей, таких как boost. Мы также используем многочисленные другие более специализированные сторонние библиотеки (то есть библиотеки, которые обеспечивают функциональность в одной области, такой как криптография).

    Судя (с научной точки зрения 🙂 по огромному количеству вопросов на SO о C++, ответы на которые имеют самые высокие оценки по принципу «Use Boost :: SomethingOrOther», я бы сказал, что это очень важно.

    То, что привело меня от C к Java вместо C++, было огромное количество поставляемых классов в Java. Boost почти удается убедить меня вернуться, за исключением того факта, что я сейчас сильно увлечен веб-сервисами, где Java является языком общения.

    Что мне следует кодировать, чтобы попасть в глубину продвинутого C++?

    Я ищу предложения по проекту, которые заставили бы меня «загрязнить руки» с расширенными возможностями C++. Я говорю о проектах, которые будут использовать всю мощь языка (STL или даже boost (не использовали его еще много)).

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

    Вот почему я ищу что-то, что мог бы написать сам, используя предпочтительно только C++ (возможно, + boost) — утилиту командной строки, без графики. И я действительно не хочу присоединяться к сообществу с открытым исходным кодом. Я знаю, что полезен код другого человека. Но это то, что я делаю на работе, поэтому . нет. Проект может быть чем угодно, значимым или бессмысленным, полезной утилитой или просто чем-то, что не имеет реального использования. Единственное требование — заставить меня действительно проверить мои навыки на C++. Или, по крайней мере, это должно быть очень сложно или даже невозможно закодировать с базовыми знаниями C++. Я такой человек, который никогда не удовлетворен кодом, который просто работает, поэтому я считаю, что это заставит меня учиться. Но имейте в виду, что я работающий человек, и мое время ограничено, поэтому ответы вроде «code your own OS» действительно не помогут.

    Создан 12 июл. 10 2010-07-12 20:19:44 PeterK

    Сообщество wiki . – BlueRaja — Danny Pflughoeft 12 июл. 10 2010-07-12 20:24:09

    Я сомневаюсь, что все может «заставить» вас использовать расширенные средства на C++. Любая проблема может быть решена процедурно, хотя с меньшей эффективностью/масштабируемостью и т. Д. Чтобы изучить передовые языковые концепции, вам нужно будет понять, что они есть, читайте о них, узнайте, как включить их в проекты, а затем нарисуйте их, когда это необходимо. Все эти вещи требуют времени, поэтому не создавайте искусственное ограничение, что вы слишком заняты, чтобы делать то, что необходимо. – Amardeep AC9MF 12 июл. 10 2010-07-12 20:25:35

    Чем сложнее проект, тем меньше мое желание использовать «расширенные» языковые функции. – anon 12 июл. 10 2010-07-12 20:38:02

    Если вы считаете, что STL и Boost являются «полной властью языка», вы не готовы к полной силе языка. (Не то, чтобы я уверен, что кто-то готов к полной силе C++, учитывая все.) – David Thornley 12 июл. 10 2010-07-12 21:02:18

    Я второй Нейл Баттерворт на нем. Кроме того, почему вы думаете, что лучший способ «[. ] учиться, [. ] искать новые проблемы [. ] сталкиваться с новыми вещами, новыми идеями и особенностями» делает все больше и больше того же самого ? Существует так много разных языков программирования, которые могут полностью изменить способ мышления и программы. Я считаю, что вы узнаете больше новых вещей на двухмесячном проекте lisp (или smalltalk, или occaml, или . что-либо с совершенно другой программной парадигмой), а затем на двухлетнем проекте C++. – Tomek Szpakowicz 12 июл. 10 2010-07-12 21:51:31

    11 ответов

    Что я должен кодировать, чтобы попасть в глубину продвинутого C++?

    1. Узнайте больше,
    2. узнать еще более,
    3. узнать еще больше.

    И, нет, я не шучу. Не за что. Я начал изучать C++ около 15 лет назад, и я все еще изучаю новые вещи на регулярной основе.

    Посмотрите на The Definitive C++ Book Guide and List и сделайте свой выбор.
    Я бы порекомендовал Modern C++ Design Андрея Alexandrescu и C++ Templates Полное руководство по Vandevoorde & Josuttis. Только эти двое — достаточно захватывающий вход, чтобы один программист получал новые идеи в течение нескольких месяцев, если не лет. (Обратите внимание, что чтение их в этом порядке имеет то преимущество, что книга Андрея тоньше и заставляет вас читать другую, чтобы полностью понять, что он пишет. Чтение их в обратном порядке имеет то преимущество, что вы не потеряетесь так часто в книге Андрея. Что бы вы ни выбрали.)

    Создан 12 июл. 10 2010-07-12 20:28:49 sbi

    Я бы рекомендовал те же две книги, но сначала прочитал _C++ Templates_ (по крайней мере, первые два раздела) . его содержимое очень полезно при чтении _Modern C++ Design_. – James McNellis 12 июл. 10 2010-07-12 20:32:46

    @James: На самом деле я думал, рекомендую ли я в этом порядке или наоборот. Я не уверен, но я добавлю об этом примечание. Спасибо, что указали это. – sbi 12 июл. 10 2010-07-12 20:34:14

    +1 Помимо проектов, книги являются действительно хорошим источником информации. Спасибо за предложение этих двух. Я посмотрю на них! – PeterK 12 июл. 10 2010-07-12 21:17:03

    @PeterK: Для меня, на протяжении многих лет, «продвинутый C++» предназначен для переключения вещей из времени выполнения во время компиляции. Главное преимущество этого из моего POV заключается в том, что то, что вылетает во время компиляции, не может взорваться на лице клиента. Поэтому одна практическая идея проекта — создать расширенную библиотеку протоколирования. Каждое нетривиальное приложение нуждается в некотором способе ведения журнала. Поэтому все ваши будущие проекты на C++ выиграют от этого . – sbi 12 июл. 10 2010-07-12 22:33:29

    . К сожалению, многие из библиотек протоколов C++, которые я видел, глубоко укоренились в OO (они часто являются копиями таких библиотек на Java и других таких языках) и являются полностью агностическими для C++ времени компиляции. (Известное исключение найдено [templog] (https://www.templog.org).) Это очень плохо, потому что библиотека протоколирования — это часть кода, которая никогда не может быть достаточно быстрой. Разработка собственной библиотеки быстрого ведения журнала представляет собой довольно сложную задачу, позволяющую вам многому научиться на расширенном C++ и использовать полезную утилиту в вашем наборе инструментов. – sbi 12 июл. 10 2010-07-12 22:34:27

    Делают ли разделы на шаблонах в «C++ 11 Primer» и в «Эффективном C++» фон, необходимый для решения «Современного дизайна C++»? – AlwaysLearning 25 июн. 15 2015-06-25 14:26:52

    @MeirGoldenberg: _TC++ P_ охватывает весь язык, поэтому он может вам что-то понять. Но знание всех правил шахмат не делает вас гроссмейстером. Вам нужно знать идиомы, разработанные из многолетнего опыта, чтобы быть хорошим программистом. Насколько вы знаете об этом, и как легко вы можете подобрать передовые вещи Александреску, я не знаю. Я бы сказал, что вы уходите, большинство думает, что он объясняет довольно хорошо, в конце концов. Если это слишком сложно, перед продолжением просмотрите Josuttis/Vandervoorde _ [C++ Templates: The Complete Guide] (https://stackoverflow.com/a/388282/140719) _. – sbi 30 июн. 15 2015-06-30 11:21:42

    Напишите многопотоковый веб-сервер. Напишите lisp. Создайте базу данных (вся вставка, SQL — опция).

    Создан 12 июл. 10 2010-07-12 20:23:02 Byron Whitlock

    +1 Да. Создание полезной и нетривиальной системы, основанной на звуковом знании CS (как перечисленные выше идеи), поможет вам изучить как ваш язык выбора в реальном мире, так и некоторые продвинутые темы CS. Последнее я нахожу гораздо более ценным, но первое тоже заслуживает изучения. – Tomek Szpakowicz 12 июл. 10 2010-07-12 21:57:42

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

    Создан 12 июл. 10 2010-07-12 20:30:10 cristobalito

    +1 для «быстрого и грязного», рассмотрим это как пример для начала 🙂 – PeterK 12 июл. 10 2010-07-12 21:15:31

    Другой плюс заключается в том, что вы всегда можете сравнить свою реализацию с тем, как это сделали другие. Просто избегайте соблазна взглянуть на другие реализации в первую очередь — идите сами, а затем посмотрите, как это улучшилось в другом месте. Имея это в виду, сделайте еще один шаг, начиная с нуля, если это необходимо. Приведенный пример должен быть относительно небольшим. G’luck. – cristobalito 12 июл. 10 2010-07-12 22:01:01

    Выберите любую дополнительную структуру данных (например, дерево, приоритетную очередь и т. Д.) И реализуйте ее.

    Таким образом, вы узнаете, как:
    — Дизайн в стиле ООП
    — обеспечить полезный и последовательный API
    — правильно использовать наследование, шаблоны, встроенные функции для FULLFILL ваших целей реализации
    — Написать кросс-платформенный код
    — написать исчерпывающие модульные тесты

    Используйте код STL как ссылку на то, как все должно быть сделано.

    Создан 12 июл. 10 2010-07-12 20:35:51 adamk

    Как бы вы использовали STL для изучения дизайна OO?STL вообще не об объектно-ориентированном программировании (наследование? Полис?), Это о _Generic Programming_. Если это OO, все контейнеры имели тот же базовый класс, который определял абстрактные методы, такие как ‘append()’ и ‘sort()’, и вы могли бы поместить в них потомков «объекта». Я видел свою долю в такой библиотеке в 90-е годы, и я очень рад, что пришел Степанов и научил нас, как сделать это лучше. – sbi 12 июл. 10 2010-07-12 22:18:58

    Что я должен кодировать, чтобы попасть в глубину продвинутого C++?

    C++ не имеет какой-либо реальные расширенного характеристики, язык хорошо сделан, передовые характеристики являются использованием многих библиотек, которая существует во всем мире.

    из Math LIBS, графика, коммуникации, окна/х окон/KDE/GNOME и т.д.

    , если вы хотите узнать зрелую библиотеку связи я предлагаю использовать The ADAPTIVE Communication Environment (ACE(TM)), который немного старой моды но имеют действительно прекрасную связку передовых концепций языка.

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

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

    Вы можете использовать Netbeans или Eclipse, как множественная платформы KDE Developer для Linux (с KDE), MS Visual Studio в Windows, и т.д.

    Создан 12 июл. 10 2010-07-12 20:53:10 Gustavo V

    volatile — это то, что я бы назвал передовой характеристикой. Вам не обязательно использовать его в большинстве программных сценариев. – Bruno Brant 12 июл. 10 2010-07-12 21:02:15

    @Bruno Не часто используется! = Advanced, я очень редко (на самом деле никогда) не пользуюсь, например, оператором запятой, но он вряд ли продвинут. – anon 12 июл. 10 2010-07-12 21:25:08

    schmidt/PDF/MT-CORBA4.pdf — это просветительская работа по сложностям синхронной параллельной обработки и независимости платформы. – manifest 12 июл. 10 2010-07-12 21:41:19

    @Neil: AFAIK, volatile используется для иметь дело с параллелизмом/многопотоковой или аппаратной связью. Я считаю, что это продвинуто. – Bruno Brant 13 июл. 10 2010-07-13 17:08:16

    библиотека POCO C++ сделала реальное приятное или переполненное использование операторской запятой в разделе о библиотеке базы данных. https://pocoproject.org/ – Gustavo V 13 июл. 10 2010-07-13 18:47:27

    Вы упомянули создать что-то вроде ‘бесполезный полезности’. Скорее, я бы предложил подумать о приложении или утилите, которая была бы лично использована для вас, или, возможно, замене для приложения, которое вы уже используете, которое вы можете проектировать в соответствии с вашими собственными требованиями, рабочими процессами, эстетикой и т. Д. Выберите некоторые что вы хотите изучить из этого проекта, например, умные указатели, повышение, метапрограммирование шаблонов, регулярные выражения, многопоточность, сетевое взаимодействие. Затем продумайте, как реализовать приложение, используя выбранную технологию. Там, где есть немного кода, чтобы сделать это, вы знаете, как это сделать, а затем остановитесь и заставьте себя думать о том, как это сделать в новой идиоме. Например, попробуйте написать приложение, используя только интеллектуальные указатели.

    Опасность, я нахожу, в создании глупого демонстрационного приложения — это то, что у вас нет никаких стимулов для его завершения. Гораздо лучше иметь цель в виду инструмента, который вам полезен. Это именно то, что я делаю сейчас: у меня очень запутанный рабочий процесс для импорта фотографий, их пометки, переименование и редактирование, поэтому я решил написать приложение в C# и WPF, чтобы сделать это для меня. Это дает мне импульс, чтобы увидеть проект.

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

    Создан 12 июл. 10 2010-07-12 20:53:34 the_mandrill

    +1 Я не вижу смысла писать код, который не решает реальной проблемы, ни для себя, ни для кого-то другого. – anon 12 июл. 10 2010-07-12 21:22:29

    Довольно объективный ответ: я всегда считал, что самой мощной вещью в развитии ОО был полиморфизм. И его использование лучше всего наблюдается при работе с шаблонами проектирования.

    Итак, я рекомендую получить Design Pattern bible по GoF и написать код, который его использует. Приложение?Может быть любым, как указано ранее, потому что ничто не заставляет вас использовать какие-либо дополнительные возможности чего бы то ни было.

    (нужны доказательства? Одни из самых сложных в мире систем написаны на COBOL людей с нулевым теоретическими знаниями в CS)

    Создан 12 июл. 10 2010-07-12 21:01:14 Bruno Brant

    Um Я работал с программистами COBOL и даже сам написал некоторый COBOL — их системы действительно не такие сложные, по сравнению с (скажем) системами торговли или управления рисками (которые никогда не записываются в COBOL). – anon 12 июл. 10 2010-07-12 21:14:41

    Я работаю с системой COBOL. Финансовый в основном, который имеет дело с риском, с кредитом и множеством других вещей. Эти системы имеют огромную сложность, главным образом потому, что они большие, необходимо хорошо работать с большим количеством данных, а незначительные ошибки могут вызвать большие проблемы. Возможно, наше определение комплекса отличается. – Bruno Brant 13 июл. 10 2010-07-13 17:11:01

    Try писать фантазии пула памяти. Конечно, ваши руки скоро станут грязными. Если этого недостаточно, добавьте возможности сбора мусора;)

    Создан 12 июл. 10 2010-07-12 21:18:31 doc

    Добавить комментарий