C++ — Вопрос по обучению


Содержание

Что изучать после изучения основ языка

10.02.2020, 23:54

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

После изучения ядра языка СИ. Что дальше учить ?
Учил Си по Керниган и Ритчи и Дейтел. Что учить дальше Структуру данных или еще одну книгу по.

В каком направлении развиваться после изучения основ С++
После пройденого материала в институте и сдачи экзамена и курсача я задался вопросом а что дальше.

Практика после освоения основ языка: как научиться писать проекты с GUI?
Здравствуйте. Я уже год изучаю С++ на решении олимпиадных задач. Это такие задачи такого типа.

Что учить после основ?
Расскажите пожалуйста, что учить после того как узнал основы C++. QT или STL или вообще что — то.

Уроки C++

Уроки C++ с нуля / Урок #1 — Основы

Видеоурок

Полезные ссылки:

С++ берёт основу в языке Си, активно разрабатываемом ещё в 1969-1973 годах. За разработку отвечала компания Bell Labs во главе с главным разработчиком Dennis Ritchie. Через 10 лет программист из Дании Bjarne Stroustrup, в своё время являвшийся разработчиком Си, выпускает расширенную версию языка под названием С++. Вначале своего пути C++ являлся всего лишь расширением, неким дополнением к Си, которое расширяло возможности ООП. Сам Страуструп изначально рассматривал язык всего лишь как « Си с классами ».

Дата рождения C++ приходится на 1983 год. Хоть он и не являлся полноценным языком, а лишь ответвлением Си, но всё же имел ряд полезных функций. За счёт них программистам удавалось быстрее и проще разрабатывать приложения. С выходом C++ в мире появилось ряд, ныне общераспространённых, понятий:

  • Инициация классов с объектами в ООП;
  • Принцип наследования;
  • Выгрузка или удаление функций из памяти;
  • Виртуальная работа функциями;
  • Система исключений и многое другое.

Будет интересно: Си по сей день сохраняет популярность даже несмотря на развитие C++ и доминирующее положение последнего языка в сфере функциональности. Почему старый и менее развитый язык даже сегодня популярен? Всё просто – переносить программы на новый язык — довольно затратное и долгое дело. Часть компаний просто плывут по течению и продолжают поддерживать свои программы на Си.

В сети очень многие специалисты дают советы, что начать изучение С-подобных языков лучше с Си. Они говорят, что только так можно лучше понять суть С++. В реальности – это неправильное мнение. Если начать изучение с С++, в арсенале разработчика появятся знания о более новых и современных возможностях языка. Если когда-то появится необходимость перейти на Си, это не потребует много времени и сил. Даже сам факт необходимости перехода на довольно старый Си уже вызывает большие сомнения.

Более детально про язык вы можете почитать на этой странице .

В скорости после выпуска С++ язык начал завоёвывать различные сферы программирования. Постепенно в него внедряли всё новые функции, что всё больше отдаляло его от роли дополнения к Си. Годами позже его перестали рассматривать продолжением или расширением и пришло время полностью отделиться от Си, тогда-то язык и назвали С++. С тех пор путь языков разошёлся, они стали независимыми (насколько это возможно).

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

Несколько сфер использования:

  • Разработка операционных систем. Даже сама Windows преимущественно базируется на С++;
  • Создание драйверов;
  • Написание программ с нуля;
  • Разработка и поддержка антивирусных приложений и прочего.

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

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

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

У С++ есть компиляторы и инструменты для работы с кодом на большинстве известных платформ. Это позволяет скомпилировать исходники под любую платформу.

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

Как поэтапно развивался С++?

Шаги развития С++:

  • 1979-1980 – С++ появился и позиционировался, как язык Си с дополнительными классами;
  • 1983 – язык начал называться, как все мы привыкли С++;
  • 1985 – релиз коммерческого варианта С++. В этот же год появилась первая бумажная книга « Языка программирования C++ », она включала описание функций, возможностей и правил использования языка;
  • 1989 – выпущена вторая версия языка с расширенными возможностями;
  • С 1990 до 2011 – медленное развитие и добавление функционала. Также стоит упомянуть, что в 1998 году впервые попытались стандартизировать язык. Тот стандарт впоследствии назвали ISO/IEC 14882:1998 , сегодня — С++98. В 2003 году появилась следующий вариант стандарта C++03;
  • 2011 – издание стандарта C++11, в нём появилось действительно много нововведений. Обновление обогатило язык обилием полезных возможностей;
  • 2014 – выпуск относительно малого добавления к предыдущей версии стандарта. Его прозвали C++14;
  • 2020 – последний крупный релиз языка.

Среды программирования, компиляторы

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

Для работы с C++ необходимо установить среду разработки. Вы можете установить любую удобную для вас среду или же вовсе воспользоваться онлайн компилятором . Среди самых популярных сред разработки можно отметить такие, как: Visual C++ , Xcode (только Мак), GCC , Intel C++ Compiler , Embarcadero (Borland) C++ Builder .

Дополнительные курсы

Также можете посмотреть дополнительные курсы по языку C++. На нашем сайте все курсы по языку С++ вы можете найти по этой ссылке .

C++ с нуля

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

Первая программа на C++ — урок 1

В качестве среды разработки под Windows автор советует использовать Visual Studio 2008 (800 Мб), если у вас Windows XP, Visual Studio 2013 (6.5 Гб) для Windows 7 и выше, или Dev C++ 5 (41 Мб) для тех, у кого слишком медленный интернет для загрузки Visual Studio. Пользователям Unix-подобных систем, потребуется компилятор GCC и любой текстовый редактор, например Vim.

После того, как вы установили все необходимое, приступим к написанию первой программы.

Переменные и типы данных в C++ — урок 2

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

Конструкция ветвления в C++ — урок 3

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

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

Циклы в C++ — урок 4

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

Цукерберг рекомендует:  Перевод - Команда переводчиков

Массивы в C++ — урок 5

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

Возьмем группу студентов из десяти человек. У каждого из них есть фамилия. Создавать отдельную переменную для каждого студента — не рационально. Создадим массив, в котором будут храниться фамилии всех студентов.

Функции в C++ — урок 6

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

Указатели в C++ — урок 7

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

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

Динамические массивы в C++ — урок 8

В пятом уроке мы разобрали понятие массива. При объявлении, мы задавали массиву определенный постоянный размер.

Параметры командной строки в C++ — урок 9

При запуске программы из командной строки, ей можно передавать дополнительные параметры в текстовом виде.

Классы в C++ — урок 10

Весь реальный мир состоит из объектов. Города состоят из районов, в каждом районе есть свои названия улиц, на каждой улице находятся жилые дома, которые также состоят из объектов.

Практически любой материальный предмет можно представить в виде совокупности объектов, из которых он состоит. Допустим, что нам нужно написать программу для учета успеваемости студентов. Можно представить группу студентов, как класс языка C++. Назовем его Students .

Уроки С++

Основы и тонкости языка программирования C++. Практические задания и тесты. Хотите научиться программировать? Тогда вы по адресу. Неважно, имеете ли вы опыт в программировании или нет, эти уроки помогут вам начать создавать, компилировать и отлаживать программы на языке C++ в разных средах разработки: Visual Studio, Code::Blocks, Xcode, Eclipse и других IDE.

Множество примеров и подробных разъяснений. Отлично подойдут как для новичков (чайников), так и для более продвинутых. Объясняется всё с нуля и до самых деталей. Эти уроки (200+) дадут вам хорошую базу/фундамент в понимании программирования не только на С++, но и на других языках. И это абсолютно бесплатно!

Также рассматривается пошаговое создание игры на С++, графическая библиотека SFML и больше 50 задания для проверки своих навыков и знаний в C++. Дополнительным бонусом является туториал по Qt5.

За репост +20 к карме и моя благодарность!

Что нужно знать для практического использования С++? [закрыт]

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

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

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

Закрыт по причине того, что необходимо переформулировать вопрос так, чтобы можно было дать объективно верный ответ участниками Kromster says support Monica, A K ♦ , entithat, pavel, iksuy 12 ноя ’18 в 12:39 .

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

4 ответа 4

На мой взгляд одна из самых актуальных проблем современной литературы — много фундаментального и мало более профессионального. Я постараюсь объяснить это так, как вижу сам. Хотя знаний у меня не так уж много, но по крайней мере я попытаюсь. Надеюсь знающие люди подправят, если ошибся.

Итак, работа электроники происходит посредственном передачи данных по шинам от одного управляющего устройства другому(процессоры, микропроцессоры, микроконтроллеры и т.д.). В зависимости от того, какие данные переданы, электроника выполняет определенные задачи. Фактически это уровень архитектуры компьютера и ассемблера, которую очень хорошо бы знать на базовом уровне(Тоненбаум — «Архитектура компьютера»). Команды эти обычно объединяются в своего рода блоки, аналогично функциям, которые делают какую-то определенную цель. Иногда создаются целые кучи функций, которые объединяются в библиотеки функций(те самые math, iostream и т.д.).

Низкий уровень, драйвера:

Для написания драйвером надо посылать эти самые команды управляющим устройствам. Язык С++ не очень подходит под эти задачи, проще пользоваться чистым Си. В самом простом случае подключается какая-то библиотека, которая позволяет посылать значения устройствам и читать их. К примеру, простейший способ обращения к динамику ПК может выглядеть так(учтите, windows не разрешает напрямую обращаться к портам!):

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

Высокий уровень.

Люди, которые используют С++, работают обычно с готовыми наборами библиотек или создают свои под те или иные задачи. Например, есть такая вещь как WinAPI для создания графического интерфейса Windows окон. Это опять же готовые функции, вы подключаете библиотеку и работаете с ними. В ответ они делают какую-то работу и выдают результат. Если вы посмотрите на минимальное окно, то в коде вы увидите заполнение знакомых элементов: структуры, вызов функций, использование циклов и т.д. Другое дело, что эти функции и структуры сделали разработчики и они выполняют определенную работу, Вам остается только их вызывать. Для ознакомления с ними есть документация.

Все выше и выше.

Обычно библиотеки делаются универсальными и их можно использовать повторно. Например, на основе одной можно создать другую которая будет выполнять еще более специализированные функции. Например, можно создать библиотеку с функцией рисования линий. Из нее библиотеку с функцией рисования геометрических фигур. Из нее библиотеку с рисование деталей и т.д. так наращивается функциональность. Есть например программное рисование графики на мониторе, в windows его надстройка winAPI(линии, окошки, цвета уже готовы), но и у него есть более высокоуровневая оболочка MFC или Windows Forms, которые являются более усовершенствованными, но основаными на все том же WinAPI.

Как итог: фактически работа программиста заключается в том, что бы выяснить какая библиотека может помочь справиться с нужными задачи и изучить ее. А изучив применить к своим нуждам. Хотите использовать Windows GUI приложения — есть WPF и Windows Form, или на более низком уровне взять WinApi. Хотите использовать видеокарту для 3D приложений — изучайте DirectX. Хотите работать с музыкой, опять же всякие библиотеки типа OpenAL есть в распоряжение. Охота писать драйвера, ищите информацию о том, как можно обращаться к устройствам и посредством какой библиотеки. Хотите узнать почему используются готовые библиотеки, изучите архитектуру компьютера и самые основы ассемблера. В любом случае вы будете пользоваться основными изученными элементами языка С++: структуры, функции, классы, указатели, простые типы данных и т.д.

C++ — Вопрос по обучению


Только если скомпилировать файл типа .c , но не .cpp , например, делать так было можно в «чистом» C:

Можно ли в C++ одновременно использовать одноимённые локальную и глобальную переменные?

Да. Оператор области видимости ::

Можно ли в C++ вызвать функцию слева от знака «=»?

Да, например, так:

Можно ли в C++ получить доступ к приватным свойствам класса без использования методов-членов или функций-друзей класса?

Ага :) Указатели-то на что?

Можно ли в C++ сделать класс, объекты которого можно будет создавать только динамически?

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

А для удаления динамических объектов кучи можно предусмотреть отдельную функцию-друг класса. Это будет платой за «защиту от стека».

Можно ли в C++ сделать класс, объекты которого наоборот можно будет создавать только в стеке, но не динамически в куче?

Да. В противоположность предыдущему пункту, можно определить в классе приватный оператор new .

Можно ли в C++ из пустой функции main что-нибудь вывести в консоль?

Да. Скажем, создав глобальный объект класса, который выводит что-то в консоль из конструктора.

Также класс можно заменить структурой или просто глобальной переменной:

Можно ли в C++ напечатать натуральный ряд чисел, не используя цикла или рекурсии?

Да. Можно использовать шаблоны класса и статические функции.

. или просто массив объектов класса и статическую переменную.

Можно ли в C++ найти сумму всех цифр числа одним оператором?

Да, если это оператор цикла for

Можно ли в C++ писать URL-адреса прямо в тексте программы?

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

Просто http: воспринимается как метка, а всё, что за символами // — как комментарий :)

Можно ли в C++ поменять местами значения 2 переменных без использования третьей переменной или арифметических операций?

Да. Есть ещё побитовые операции и операция следования (запятая).

Можно ли в C++ из пользовательской программы завершить работу системы?

Да, поскольку доступна функция system . Наверное, не буду выполнять этот код :)

На самом деле, современные ОС попросят подтвердить действие.

Цукерберг рекомендует:  Как убрать выделение с радио кнопки
Можно ли в C++ сравнить значения 2 переменных без использования оператора сравнения (==)?

Да. Побитовое исключающее «или».

Можно ли в C++ напечатать ряд натуральных чисел 1,2. N, не используя ни одной точки с запятой?

Рекурсивный вызов функции main позволяет решить эту задачу, например, так:

Можно ли в C++ найти максимум или минимум из двух целочисленных значений, не используя условий или циклов?
Можно ли в C++ сложить 2 числа, не используя операцию сложения?

Да. Есть же вычитание :)

Можно ли в C++ выполнить обе ветви условного оператора «если-то-иначе»?
Можно ли в C++ умножать или делить целое значение на степени двойки, не используя операций «*» или «/»?

Это можно делать в любом языке, где есть побитовый сдвиг. Умножению значения x на 2 , например, соответствует операция x , а делению y на 4 — действие y >> 4 . Не путайте операторы побитового арифметического сдвига с переопределёнными в некоторых классах (например, в классах поточного ввода-вывода) операторами вставки >.

Можно ли в C++ проверить порядок байтов (big-endian/little-endian) компьютера?

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

Порядок байтов бывает big-endian (от старшего к младшему) и little-endian (от младшего к старшему).

Например, десятичное число 10000 равно 0x2710 в 16-ричном виде и «естественном» представлении big-endian, а в little-endian это будет 0x1027. Именно так может храниться значение на линейке процессоров x86 :)

Как узнать максимальное значение для беззнакового целого типа?

Можно так, если не хочется искать константу, содержащую это значение:

Можно ли в C++ найти знак числа без использования любого (бинарного или тернарного) условного оператора?

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

Можно ли в C++ заполнить двумерную матрицу размерности n x m последовательно идущими числами 1,2,3. применяя только один цикл?

Остаток от деления и целочисленное деление C++ (целое поделить на целое дают целое) рулят.

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

Поможет «редкий» способ 3 для конструктора с одним аргументом.

Как запретить автоматическое преобразование типов в конкструкторе (не создавать объекты способом 3 из предыдущего вопроса)?

Для того и нужно ключевое слово explicit

Всегда ли при выполнении операции вида a = b, где a и b — объекты одного класса, вызывается конструктор копирования?

Неа, не всегда. Конструктор копирования применяется только к инициализациям, но не к присваиваниям.

Как определить для объектов класса сложение с числом в виде Obj+i и i+Obj?

Для решения задачи можно использовать, например, пару функций-«друзей» класса.

Как получить доступ к элементам, определенным дочерним классом через указатель на базовый класс?

Даже не знаю, почему этот вопрос здесь. обычное, в общем, приведение типов :)

Как классу «выдать себя» за своего предка, то есть, использовать его виртуальный метод?

Так как атрибут virtual передается по наследству через все уровни наследования, можно просто не переопределять на нужном уровне наследования метод, объявленный в предке виртуальным ( show )

Как «заставить» класс-потомок определить виртуальный метод?

Определить в предке чисто виртуальную функцию ( show ). Иначе это называется «сделать класс абстрактным»

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

Вариант 1. Написать для этого типа альтернативный шаблон функции

Вариант 2. Написать для этого типа явно заданную функцию

Как инициализировать члены класса в конструкторе, не обращаясь к ним из тела функции-конструктора?

Список инициализации в конструкторе.

06.03.2020, 17:06; рейтинг: 1376

Вопросы программисту C/C++ на собеседовании с ответами

Заметил, что на собеседовании часто задают одни и те же вопросы по программированию. Если бы брали на работу водителя, то некоторые вопросы звучат примерно так:

  • В какую сторону надо крутить руль, чтоб повернуть направо?
  • За что отвечает педаль сцепления/тормоза/газа?

Такое конечно случается далеко не всегда, но первые пару вопросов обычно такого рода («А какую надо давить педаль, чтоб автомобиль остановился?»). Публикую свои ответы на некоторые вопросы для программистов. Вдруг кому пригодится.. Возможно, здесь много ошибок и помарок — при составлении этого списка я не пользовался интернетом. Старался выдать, что знаю сам.

Как можно оптимизировать данный цикл?

Вот таким образом:

В исходном цикле каждый раз происходит вычисление позиции элемента в массиве array . Переписав функцию мы избавляемся от этого вычисления.

В чем отличие std::list от std::vector ?

std::vector — это обертка над обычным С/C++ массивом. Соответственно:

  • если std::vector заполнен, то при добавлении нового элемента, массив удаляется целиком и создается заново с бОльшим размером
  • любой элемент массива можно получить моментально, потому что позиция элемента вычисляется банальным прибавлением индекса к первому элементу ( array[i] = array + i )
  • удаление любого элемента из массива, кроме последнего, приведет к перемещению всех элементов справа от удаляемого на одну позицию влево (при соблюдении некоторых условий, можно воспользоваться хаком)
  • занимает неразрывный блок памяти

std::list — это список элементов, которые связаны между собой указателями prev (предыдущий элемент) и next (следующий элемент). Внутри себя std::list хранит указатель на первый элемент и последний (зависит от реализации). Исходя из этого:

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

В языке Java различия между ArrayList и LinkedList практически такие же.

Почему в C++ нужно использовать new вместо теплого лампового malloc() ?

Потому что malloc() тупо выделяет блок памяти и возвращает этот блок программисту. А new выделяет память и вызывает конструктор объекта. Тоже самое относится к delete и free() . delete вызывает деструктор и освобождает память. free() просто освобождает память. Также есть размещающий new, который создает объект в уже выделенной вами памяти.

Кстати, изначально конструкторы и деструкторы классов в C++ назывались new и delete и выглядели вот так:


В чем отличие между new/delete и new[]/delete[] ?

new выделяет память для одного элемента и вызывает конструктор для него, в то время как new[] выделяет память для массива элементов и вызывает конструктор для каждого из них. delete должен вызываться для объекта выделенного с помощью new , а delete[] для массива, выделенного с помощью new[] . От проблем соответствия new/delete вас могут избавить классы std::auto_ptr (для одного элемента) и std::tr1::scoped_array (для массива элементов). Которые сами вызывают правильный delete в деструкторе.

Для чего нужен тип std::auto_ptr ?

В стародавние времена вы должны были сами следить за тем, чтоб после каждого new был вызван свой delete . Это было жутко неудобно (программисты Си выкручиваются из этой ситуации вставляя goto ):

bool func() < Stream *stream = new Stream; if (0 != stream->open(«some stream»)) < delete stream; return false; >if (0 != stream->load()) < delete stream; return false; >// Выполняем полезную работу // Закончили полезную работу delete stream; return true; >

После появление std::auto_ptr стало возможным переписать функцию таким образом:

И еще очень важный момент: std::auto_ptr владеет объектом единолично. Вы не сможете шарить объект между двумя std::auto_ptr (используйте в таких случаях std::shared_ptr ):

vo > ptr1(object); // object теперь живет внутри ptr1 std::auto_ptr ptr2(ptr1); // ptr1 опустел, object внутри ptr2 // здесь деструктор ptr2 удалит object // а здесь вызовется деструктор ptr1 впустую >

И помните: std::auto_ptr не подходит для массивов выделенных с помощью new[] . Для этих целей используйте std::tr1::scoped_array или boost::scoped_array .

Что такое RAII?

Это переводится как «Получение ресурса есть инициализация». Идея вкратце такая: в конструкторе открываем/блокируем ресурс, в деструкторе закрываем/освобождаем ресурс. Вот пример:

Или более каноничный пример (блокирование мьютекса или критической секции):

Зачем нужен виртуальный деструктор?

Попробуем обойтись без него:

construct A construct B destruct A

Как можно заметить деструктор B не вызвался. Сделаем деструктор класса A виртуальным и посмотрим что получится:

Теперь все отлично:

construct A construct B destruct B destruct A

В каком порядке инициализируются члены класса?

Члены класса создаются в порядке их объявления в классе. Уничтожаются они в обратном порядке. Давайте проверим:

#include class Printer

Printer() < printf("-%s ", n_); >private: const char *n_; >; class A : public Printer < public: A() : Printer("A") < >>; class B : public Printer < public: B() : Printer("B") < >>; class C : public Printer < public: C() : Printer("C") < >>; class Test < private: A A_; B B_; C C_; >; int main()

Порядок объявления очень важен, если один член класса во время инициализации использует данные другого члена. Кстати, компилятор gcc выдает warning (с флагом -Wall), если вы описали инициализацию членов класса в другом порядке. И это еще одна причина в пользу использования настройки компилятора «считать предупреждения ошибками» (в gcc это флаг -Werror ).

задан массив символов вывести на печать те из них которые являются символами!

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

видимо он имел в виду массив типа char и из него выводить только символы, являющиеся буквами )

Евгений, спасибо за интересную статью!

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

Но тем не менее, у меня сложилось впечатление что на собеседованиях требуются более подробные ответы (даже на джуниор)(или я ошибаюсь, и это мне так «повезло»).

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

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

Вот например в 2gis, перед приглашением на собеседование — дают задачу (тестовое задание перед собеседовнием) напечатать чек сумму файла (там тематика машинного слова и порядка байтов встречается), так же программа может считать кол-во слов в файле и смещение слов в файле (видимо это для того что бы можно было сделать один базовый класс и 3 производных класса для чексуммы, подсчета и смещений) ну и парсинг аргументов — например если делать свой — то поставят минус за этот пункт, если использовать gnu getopt (поставят +/- — т.к. не свой но и не ооп) — ну а как правильно я не знаю (предполагаю что boost::program_options)

Цукерберг рекомендует:  Отправка - Отправка формы на почту

Спасибо за добрые слова!

Статья написана в далеком 2012 году под впечатлением от походов на собеседования. Каждый раз, после начала нашего общения с тимлидом, практически сразу был вопрос: чем отличается std::vector от std::list (а в голове в этот момент: «ну йоп твою мать, шо опять?!»).

На текущем месте работаю уже шестой год подряд, на собеседования не хожу, поэтому не знаю как там сейчас. Наверно, сейчас в моде стандарт C++11x.

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

По поводу тестового задания в 2gis могу сказать следующее: сложно угадать, что ждет от тебя именно этот тимлид (скиньте задание мне на почту, если вас не затруднит).

Одному нравится вставлять всегда и везде boost, который весь такой шаблонный и C++11x (ждать компиляции часами и героически бороться с разбуханием кода), другому нравится использовать легкие сторонние си-библиотеки (между прочим GNU getopt не кросс-платформенный, поэтому Win32 идет лесом), третий хочет разбор командной строки своими силами и чтоб при этом не было аллокаций памяти (и еще учитывать порядок байтов и юникод), четвертому нравится девственно чистый WinAPI и функции с 15-ю аргументами лесенкой.

Каждый тимлид сходит с ума по-своему, а потенциальную работнику надо предугадать что хочет именно этот чувак.

Спрашивайте, что вас конкретно интересует и я постараюсь ответить (я ведь только с виду такой умный, на самом деле — нет).

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

Разработка игр на C++

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

Отличительные особенности и преимущества языка программирования C++

Ключевые преимущества C++

  • Высокая совместимость с языком С, позволяющая использовать весь существующий С-код.
  • Поддерживаются различные стили и технологии программирования, включая традиционное директивное программирование, объектно-ориентированное программирование, обобщенное программирование, метапрограммирование.
  • Кроссплатформенность. Доступны компиляторы для большого количества платформ, на языке C++ разрабатывают программы для самых различных платформ и систем.
  • С++ является строго типизированным языком.
  • С++ поддерживает статические и динамические типы данных.
  • Имеется возможность работы на низком уровне с памятью, адресами, портами.
  • Язык спроектирован так, чтобы дать программисту максимальный контроль над всеми аспектами структуры и порядка исполнения программы и при этом дает невероятное количество возможностей.
  • С++ является ISO-стандартизированным языком программирования.
  • C++ компилируется непосредственно в машинный код, что позволяет ему быть одним из самых быстрых в мире языков.
  • Существует множество реализаций языка C++, как бесплатных, так и коммерческих и для различных платформ.
  • C++ оказал огромное влияние на другие языки программирования, в первую очередь на Java и C# (си шарп)

Если ваш ребёнок хочет научиться программировать действительно первоклассные игры, то ему просто необходимо изучить язык С++. Хотя данный язык считается сложным, освоить его основы под силу каждому. Гораздо интересней учиться, когда обучение превращается в игру. Наш курс идеально подойдет для начинающего программиста, планирующего не только с нуля как следует овладеть непростым языком С++, но и поупражняться в программировании игр. Ведь цель данного курса познакомить ребят с языком С++ именно в контексте игрового программирования. Чтобы не было скучно, вместо примеров из учебников, мы будем писать игры на движке cocos2d-кросс-платформенном фреймворке , который используется для разработки интерактивных приложений и игр (преимущественно для мобильных устройств). Он абсолютно бесплатный, но позволяет создавать игры, которые успешно продаются в App Store и Google Play.

На занятиях курса «Разработка игр на С++» дети:

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

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

Объектно-ориентированное мышление (2014)
Автор: Мэтт Вайсфельд
Скачать книгу на английском — здесь.

Изучаем C++ создавая игры в UE4 (2020)
Автор: Уилльям Шериф
Скачать книгу на русском — здесь.

Как мы понимаем, что учащийся освоил программу?

Во время обучения мы оцениваем как практическую сторону вопроса (как это сделать?), так и понимание темы (почему и зачем).

Ученики демонстрируют свои знания, решая задачи своим собственным способом, объясняя алгоритмы своими словами, помогая одногруппникам исправлять ошибки и создавая презентации по своим законченным проектам.

6000 рублей в месяц за 4 занятия

Продолжительность курса: 2 месяца

по субботам или воскресеньям, 1 раз в неделю

C++ для начинающих

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

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

Тематики теста включает в себя: размерность типов, битовые операции, синтаксис языка, конструкции языка, функции, команды препроцессора, классы, стандартный ввод/вывод.

План обучения C++

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

Начало работы

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

  1. Быстрый рост в программировании.
  2. Установка необходимого ПО.
  3. Уроки программирования на C++.

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

Изучение ООП (Объектно ориентированного программирования)

На данном этапе обучения мы разберем ту тему, без которой вы бы не смогли себя назвать полноценным программистом на C++. Собственно, наличие ООП это и есть основное отличие C++ от его предшественника — C. Здесь не будет ничего сложного, немого практики и мы прорвемся! Вот примерный список тем для изучения:

  1. Что такое ООП и с чем его едят?
  2. Как это реализуется в C++?
  3. Углубленное изучение классов.
  4. Наследование (моя любимая тема).

Как видите, есть куда двигаться. Так что скучать не придется! После данного курса вы сможете изящно реализовывать свои идеи средствами ООП.

Изучение стандартной библиотеки C++

Поскольку разработчики C++ ценят нас с вами, поэтому они позаботились о том, чтобы нам не пришлось десятки раз прописывать однотипные функции и структуры данных. Все это они уже сделали за нас и поместили все это в стандартную библиотеку шаблонов (STL). Все функции и классы мы подробно разберем и научимся применять в программах C++.

Ну здесь я список приводить не буду, поскольку это бы заняло гору места. Да и к тому же, у нас будет отдельная страница с перечислением всех тем и подтем изучения STL. Скорее всего она будет называться как-то так: «Справочник» (мы сама оригинальность �� ).

Что потом?

Ну а дальше есть где разгуляться. После всего выше перечисленного мы можем начать разбирать седеющие темы:

  • OpenGL — это библиотека для рисования различных 2D и 3D объектов. С помощью ее, мы сможем без труда создать простенькую игру.
  • Qt — это кросплатформенный Фреймворк для создания приложения на целую кучу систем без переписывания кода. С его помощью было написано не мало известных программ (вот ваш любимый Skype, например).

Все эти тематики можно также разбить на несколько подтем, по которым мы и сможем сделать уроки.

Формат уроков

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

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

Заключение

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

Ну на этом все. Удачи и красивого вам кода господа!

Понравилась статья? Поделиться с друзьями:
Все языки программирования для начинающих