Самоучитель по C++ (PDF)
Document Details
Uploaded by OptimalAutoharp2359
Tags
Summary
Этот документ - самоучитель по языку программирования C++. Он содержит множество уроков и глав, посвящённых основам C++ и его различным аспектам.
Full Transcript
ravesli.com [email protected] 1 Самоучитель «Уроки по С++» ravesli.com [email protected] СОДЕРЖАНИЕ ПРЕДИСЛОВИЕ...................
ravesli.com [email protected] 1 Самоучитель «Уроки по С++» ravesli.com [email protected] СОДЕРЖАНИЕ ПРЕДИСЛОВИЕ................................................................................................................... 15 Глава №0. Введение. Начало работы Урок №1. Введение в программирование.................................................................... 18 Урок №2. Введение в языки программирования C и С++........................................... 22 Урок №3. Введение в разработку программных продуктов...................................... 24 Урок №4. Установка IDE (Интегрированной Среды Разработки)................................ 30 Урок №5. Компиляция вашей первой программы...................................................... 34 Урок №6. Режимы конфигурации «Debug» и «Release»............................................. 44 Урок №7. Конфигурация компилятора: Расширения компилятора.......................... 46 Урок №8. Конфигурация компилятора: Уровни предупреждений и ошибки......... 50 Урок №9. Конфигурация компилятора: Выбор стандарта языка С++........................ 58 Урок №10. Решения самых распространенных проблем............................................ 64 Глава №1. Основы C++ Урок №11. Структура программ...................................................................................... 70 Урок №12. Комментарии................................................................................................. 75 Урок №13. Переменные, Инициализация и Присваивание........................................ 81 Урок №14. cout, cin и endl................................................................................................ 86 Урок №15. Функции и оператор возврата return.......................................................... 89 Урок №16. Параметры и аргументы функций.............................................................. 99 Урок №17. Почему функции – полезны, и как их эффективно использовать?.....105 Урок №18. Локальная область видимости..................................................................107 Урок №19. Ключевые слова и идентификаторы........................................................110 Урок №20. Операторы....................................................................................................115 Урок №21. Базовое форматирование кода.................................................................117 Урок №22. Прототип функции и Предварительное объявление.............................121 Урок №23. Многофайловые программы.....................................................................127 2 Самоучитель «Уроки по С++» ravesli.com [email protected] Урок №24. Заголовочные файлы..................................................................................136 Урок №25. Директивы препроцессора........................................................................142 Урок №26. Header guards и #pragma once....................................................................147 Урок №27. Конфликт имен и std namespace...............................................................152 Урок №28. Разработка ваших первых программ.......................................................155 Урок №29. Отладка программ: степпинг и точки останова.......................................164 Урок №30. Отладка программ: стек вызовов и отслеживание переменных.........178 Глава №1. Итоговый тест................................................................................................189 Глава №2. Переменные и основные типы данных в C++ Урок №31. Инициализация, присваивание и объявление переменных.................190 Урок №32. Тип данных void...........................................................................................197 Урок №33. Размер типов данных..................................................................................198 Урок №34. Целочисленные типы данных: short, int и long.......................................203 Урок №35. Фиксированный размер целочисленных типов данных.......................212 Урок №36. Типы данных с плавающей точкой: float, double и long double............216 Урок №37. Логический тип данных bool......................................................................225 Урок №38. Символьный тип данных char....................................................................231 Урок №39. Литералы и магические числа...................................................................241 Урок №40. const, constexpr и символьные константы...............................................247 Глава №2. Итоговый тест................................................................................................253 Глава №3. Операторы в C++ Урок №41. Приоритет операций и правила ассоциативности..................................256 Урок №42. Арифметические операторы......................................................................264 Урок №43. Инкремент, декремент и побочные эффекты.........................................270 Урок №44. Условный тернарный оператор, оператор sizeof и Запятая..................274 Урок №45. Операторы сравнения.................................................................................279 Урок №46. Логические операторы: И, ИЛИ, НЕ...........................................................285 Урок №47. Конвертация чисел из двоичной системы в десятичную и наоборот..293 3 Самоучитель «Уроки по С++» ravesli.com [email protected] Урок №48. Побитовые операторы................................................................................303 Урок №49. Битовые флаги и битовые маски...............................................................310 Глава №3. Итоговый тест................................................................................................320 Глава №4. Область видимости и другие типы переменных в C++ Урок №50. Блоки стейтментов (составные операторы).............................................322 Урок №51. Локальные переменные, область видимости и продолжительность жизни................................................................................................................................325 Урок №52. Глобальные переменные...........................................................................332 Урок №53. Почему глобальные переменные – зло?.................................................340 Урок №54. Статические переменные...........................................................................346 Урок №55. Связи, область видимости и продолжительность жизни......................349 Урок №56. Пространства имен......................................................................................353 Урок №57. using-стейтменты.........................................................................................359 Урок №58. Неявное преобразование типов данных..................................................363 Урок №59. Явное преобразование типов данных......................................................370 Урок №60. Введение в std::string..................................................................................374 Урок №61. Перечисления...............................................................................................380 Урок №62. Классы enum.................................................................................................388 Урок №63. Псевдонимы типов: typedef и type alias...................................................392 Урок №64. Структуры......................................................................................................396 Урок №65. Вывод типов: ключевое слово auto..........................................................406 Глава №4. Итоговый тест................................................................................................410 Глава №5. Порядок выполнения кода в программе. Циклы, ветвления в C++ Урок №66. Операторы управления потоком выполнения программ.....................412 Урок №67. Операторы условного ветвления if/else...................................................416 Урок №68. Оператор switch...........................................................................................424 Урок №69. Оператор goto..............................................................................................432 Урок №70. Цикл while.....................................................................................................434 4 Самоучитель «Уроки по С++» ravesli.com [email protected] Урок №71. Цикл do while................................................................................................441 Урок №72. Цикл for.........................................................................................................443 Урок №73. Операторы break и continue.......................................................................451 Урок №74. Генерация случайных чисел.......................................................................457 Урок №75. Обработка некорректного пользовательского ввода............................467 Урок №76. Введение в тестирование кода..................................................................478 Глава №5. Итоговый тест................................................................................................488 Глава №6. Массивы, Строки, Указатели и Ссылки в C++ Урок №77. Массивы........................................................................................................492 Урок №78. Фиксированные массивы...........................................................................497 Урок №79. Массивы и циклы........................................................................................505 Урок №80. Сортировка массивов методом выбора...................................................510 Урок №81. Многомерные массивы..............................................................................517 Урок №82. Строки C-style...............................................................................................521 Урок №83. Введение в класс std::string_view..............................................................527 Урок №84. Указатели......................................................................................................537 Урок №85. Нулевые указатели......................................................................................546 Урок №86. Указатели и массивы...................................................................................549 Урок №87. Адресная арифметика и индексация массивов......................................555 Урок №88. Символьные константы строк C-style........................................................560 Урок №89. Динамическое выделение памяти...........................................................563 Урок №90. Динамические массивы.............................................................................572 Урок №91. Указатели и const.........................................................................................576 Урок №92. Ссылки...........................................................................................................580 Урок №93. Ссылки и const..............................................................................................586 Урок №94. Оператор доступа к членам через указатель..........................................589 Урок №95. Цикл foreach.................................................................................................591 Урок №96. Указатели типа void.....................................................................................596 Урок №97. Указатели на указатели...............................................................................599 5 Самоучитель «Уроки по С++» ravesli.com [email protected] Урок №98. Введение в std::array...................................................................................603 Урок №99. Введение в std::vector.................................................................................607 Урок №100. Введение в итераторы..............................................................................611 Урок №101. Алгоритмы в Стандартной библиотеке С++...........................................618 Глава №6. Итоговый тест................................................................................................626 Глава №7. Функции в C++ Урок №102. Параметры и аргументы функций..........................................................635 Урок №103. Передача по значению.............................................................................638 Урок №104. Передача по ссылке..................................................................................641 Урок №105. Передача по адресу...................................................................................647 Урок №106. Возврат значений по ссылке, по адресу и по значению......................654 Урок №107. Встроенные функции................................................................................661 Урок №108. Перегрузка функций.................................................................................664 Урок №109. Параметры по умолчанию.......................................................................670 Урок №110. Указатели на функции..............................................................................674 Урок №111. Стек и Куча..................................................................................................686 Урок №112. Ёмкость вектора.........................................................................................693 Урок №113. Рекурсия и Числа Фибоначчи...................................................................699 Урок №114. Обработка ошибок, cerr и exit()...............................................................707 Урок №115. assert и static_assert...................................................................................714 Урок №116. Аргументы командной строки.................................................................717 Урок №117. Эллипсис.....................................................................................................725 Урок №118. Лямбда-выражения..................................................................................733 Урок №119. Лямбда-захваты.........................................................................................747 Глава №7. Итоговый тест................................................................................................764 Глава №8. Основы ООП в C++ Урок №120. Введение в ООП.........................................................................................770 Урок №121. Классы, Объекты и Методы.....................................................................772 6 Самоучитель «Уроки по С++» ravesli.com [email protected] Урок №122. Спецификаторы доступа public и private................................................780 Урок №123. Инкапсуляция, Геттеры и Сеттеры..........................................................787 Урок №124. Конструкторы.............................................................................................794 Урок №125. Список инициализации членов класса...................................................803 Урок №126. Инициализация нестатических членов класса......................................812 Урок №127. Делегирующие конструкторы.................................................................816 Урок №128. Деструкторы...............................................................................................821 Урок №129. Скрытый указатель *this...........................................................................826 Урок №130. Классы и заголовочные файлы................................................................832 Урок №131. Классы и const............................................................................................838 Урок №132. Статические переменные-члены класса................................................844 Урок №133. Статические методы класса.....................................................................850 Урок №134. Дружественные функции и классы.........................................................855 Урок №135. Анонимные объекты.................................................................................865 Урок №136. Вложенные типы данных в классах........................................................871 Урок №137. Измерение времени выполнения (тайминг) кода...............................874 Глава №8. Итоговый тест................................................................................................880 Глава №9. Перегрузка операторов в C++ Урок №138. Введение в перегрузку операторов........................................................893 Урок №139. Перегрузка операторов через дружественные функции....................897 Урок №140. Перегрузка операторов через обычные функции................................907 Урок №141. Перегрузка операторов ввода и вывода................................................910 Урок №142. Перегрузка операторов через методы класса.......................................917 Урок №143. Перегрузка унарных операторов +, - и логического НЕ........................922 Урок №144. Перегрузка операторов сравнения.........................................................925 Урок №145. Перегрузка операторов инкремента и декремента.............................929 Урок №146. Перегрузка оператора индексации [].....................................................934 Урок №147. Перегрузка оператора ()...........................................................................943 Урок №148. Перегрузка операций преобразования типов данных.........................949 7 Самоучитель «Уроки по С++» ravesli.com [email protected] Урок №149. Конструктор копирования........................................................................953 Урок №150. Копирующая инициализация..................................................................960 Урок №151. Конструкторы преобразования, ключевые слова explicit и delete.....964 Урок №152. Перегрузка оператора присваивания.....................................................970 Урок №153. Поверхностное и глубокое копирование...............................................976 Глава №9. Итоговый тест................................................................................................983 Глава №10. Введение в связи между объектами в C++ Урок №154. Типы связей между объектами...............................................................990 Урок №155. Композиция объектов...............................................................................992 Урок №156. Агрегация..................................................................................................1000 Урок №157. Ассоциация...............................................................................................1006 Урок №158. Зависимость.............................................................................................1013 Урок №159. Контейнерные классы.............................................................................1015 Урок №160. Список инициализации std::initializer_list............................................1026 Глава №10. Итоговый тест............................................................................................1033 Глава №11. Наследование в C++ Урок №161. Введение в Наследование......................................................................1036 Урок №162. Базовое наследование............................................................................1039 Урок №163. Порядок построения дочерних классов...............................................1048 Урок №164. Конструкторы и инициализация дочерних классов...........................1054 Урок №165. Наследование и спецификатор доступа protected.............................1065 Урок №166. Добавление нового функционала в дочерний класс.........................1074 Урок №167. Переопределение методов родительского класса............................1077 Урок №168. Сокрытие методов родительского класса...........................................1082 Урок №169. Множественное наследование.............................................................1085 Глава №11. Итоговый тест............................................................................................1090 8 Самоучитель «Уроки по С++» ravesli.com [email protected] Глава №12. Виртуальные функции в C++ Урок №170. Указатели/Ссылки и Наследование......................................................1102 Урок №171. Виртуальные функции и Полиморфизм..............................................1108 Урок №172. Модификаторы override и final.............................................................1120 Урок №173. Виртуальные деструкторы и Виртуальное присваивание.................1125 Урок №174. Раннее и Позднее Связывания..............................................................1128 Урок №175. Виртуальные таблицы............................................................................1132 Урок №176. Чистые виртуальные функции, Интерфейсы и Абстрактные классы.............................................................................................................................1137 Урок №177. Виртуальный базовый класс..................................................................1145 Урок №178. Обрезка объектов....................................................................................1150 Урок №179. Динамическое приведение типов. Оператор dynamic_cast..............1156 Урок №180. Вывод объектов классов через оператор вывода..............................1163 Глава №12. Итоговый тест............................................................................................1168 Глава №13. Шаблоны в C++ Урок №181. Шаблоны функций..................................................................................1176 Урок №182. Экземпляры шаблонов функций...........................................................1181 Урок №183. Шаблоны классов....................................................................................1191 Урок №184. Параметр non-type в шаблоне...............................................................1200 Урок №185. Явная специализация шаблона функции.............................................1202 Урок №186. Явная специализация шаблона класса.................................................1206 Урок №187. Частичная специализация шаблона......................................................1211 Урок №188. Частичная специализация шаблонов и Указатели..............................1221 Глава №13. Итоговый тест............................................................................................1227 Глава №14. Исключения в C++ Урок №189. Исключения. Зачем они нужны?...........................................................1230 Урок №190. Обработка исключений. Операторы throw, try и catch......................1233 Урок №191. Исключения, Функции и Раскручивание стека....................................1240 9 Самоучитель «Уроки по С++» ravesli.com [email protected] Урок №192. Непойманные исключения и обработчики catch-all...........................1246 Урок №193. Классы-Исключения и Наследование...................................................1250 Урок №194. Повторная генерация исключений.......................................................1260 Урок №195. Функциональный try-блок.....................................................................1266 Урок №196. Недостатки и опасности использования исключений........................1270 Глава №14. Итоговый тест............................................................................................1275 Глава №15. Умные указатели и Семантика перемещения в C++ Урок №197. Умные указатели и Семантика перемещения.....................................1277 Урок №198. Ссылки r-value..........................................................................................1288 Урок №199. Конструктор перемещения и Оператор присваивания перемещением..............................................................................................................1295 Урок №200. Функция std::move()................................................................................1310 Урок №201. Умный указатель std::unique_ptr..........................................................1315 Урок №202. Умный указатель std::shared_ptr...........................................................1326 Урок №203. Умный указатель std::weak_ptr.............................................................1332 Глава №15. Итоговый тест............................................................................................1339 Глава №16. Стандартная библиотека шаблонов (STL) в C++ Урок №204. Стандартная библиотека шаблонов (STL).............................................1342 Урок №205. Контейнеры STL........................................................................................1343 Урок №206. Итераторы STL..........................................................................................1347 Урок №207. Алгоритмы STL.........................................................................................1352 Глава №17. std::string в C++ Урок №208. Строковые классы std::string и std::wstring..........................................1355 Урок №209. Создание, уничтожение и конвертация std::string.............................1360 Урок №210. Длина и ёмкость std::string.....................................................................1366 Урок №211. Доступ к символам std::string. Конвертация std::string в строки C- style..................................................................................................................................1372 10 Самоучитель «Уроки по С++» ravesli.com [email protected] Урок №212. Присваивание и перестановка значений с std::string.........................1376 Урок №213. Добавление к std::string..........................................................................1380 Урок №214. Вставка символов и строк в std::string..................................................1384 Глава №18. Ввод/Вывод в C++ Урок №215. Потоки ввода и вывода..........................................................................1388 Урок №216. Функционал класса istream....................................................................1392 Урок №217. Функционал классов ostream и ios. Форматирование вывода.........1397 Урок №218. Потоковые классы и Строки...................................................................1408 Урок №219. Состояния потока и валидация пользовательского ввода................1412 Урок №220. Базовый файловый ввод и вывод.........................................................1420 Урок №221. Рандомный файловый ввод и вывод...................................................1427 Дополнительные уроки Статические и динамические библиотеки.................................................................1433 Подключение и использование библиотек в Visual Studio.....................................1437 C++11. Нововведения....................................................................................................1445 C++14. Нововведения....................................................................................................1447 C++17. Нововведения....................................................................................................1448 C++20. Нововведения....................................................................................................1449 Спецификации исключений и спецификатор noexcept...........................................1453 Функция std::move_if_noexcept()................................................................................1459 Финал Конец. Что дальше?......................................................................................................1465 Ответы на Тесты Ответы: Урок №11.........................................................................................................1470 Ответы: Урок №13.........................................................................................................1471 Ответы: Урок №15.........................................................................................................1472 11 Самоучитель «Уроки по С++» ravesli.com [email protected] Ответы: Урок №16.........................................................................................................1473 Ответы: Урок №18.........................................................................................................1475 Ответы: Урок №19.........................................................................................................1476 Ответы: Урок №22.........................................................................................................1477 Ответы: Урок №23.........................................................................................................1478 Ответы: Урок №26.........................................................................................................1479 Ответы: Глава №1. Итоговый тест...............................................................................1480 Ответы: Урок №36.........................................................................................................1482 Ответы: Урок №37.........................................................................................................1483 Ответы: Глава №2. Итоговый тест...............................................................................1484 Ответы: Урок №41.........................................................................................................1487 Ответы: Урок №42.........................................................................................................1488 Ответы: Урок №46.........................................................................................................1490 Ответы: Урок №47.........................................................................................................1491 Ответы: Урок №48.........................................................................................................1494 Ответы: Урок №49.........................................................................................................1495 Ответы: Глава №3. Итоговый тест...............................................................................1496 Ответы: Урок №51.........................................................................................................1498 Ответы: Урок №52.........................................................................................................1499 Ответы: Урок №54.........................................................................................................1500 Ответы: Урок №58.........................................................................................................1501 Ответы: Урок №60.........................................................................................................1502 Ответы: Урок №61.........................................................................................................1503 Ответы: Урок №63.........................................................................................................1504 Ответы: Урок №64.........................................................................................................1505 Ответы: Глава №4. Итоговый тест...............................................................................1507 Ответы: Урок №68.........................................................................................................1509 Ответы: Урок №70.........................................................................................................1511 Ответы: Урок №72.........................................................................................................1513 Ответы: Урок №76.........................................................................................................1514 12 Самоучитель «Уроки по С++» ravesli.com [email protected] Ответы: Глава №5. Итоговый тест...............................................................................1515 Ответы: Урок №78.........................................................................................................1518 Ответы: Урок №79.........................................................................................................1519 Ответы: Урок №80.........................................................................................................1521 Ответы: Урок №84.........................................................................................................1524 Ответы: Урок №90.........................................................................................................1526 Ответы: Урок №95.........................................................................................................1528 Ответы: Урок №96.........................................................................................................1529 Ответы: Глава №6. Итоговый тест...............................................................................1530 Ответы: Урок №106.......................................................................................................1541 Ответы: Урок №110.......................................................................................................1542 Ответы: Урок №113.......................................................................................................1547 Ответы: Урок №118.......................................................................................................1549 Ответы: Урок №119.......................................................................................................1551 Ответы: Глава №7. Итоговый тест...............................................................................1555 Ответы: Урок №121.......................................................................................................1558 Ответы: Урок №122.......................................................................................................1559 Ответы: Урок №124.......................................................................................................1563 Ответы: Урок №125.......................................................................................................1566 Ответы: Урок №126.......................................................................................................1567 Ответы: Урок №134.......................................................................................................1569 Ответы: Глава №8. Итоговый тест...............................................................................1574 Ответы: Урок №139.......................................................................................................1595 Ответы: Урок №141.......................................................................................................1599 Ответы: Урок №143.......................................................................................................1601 Ответы: Урок №144.......................................................................................................1602 Ответы: Урок №146.......................................................................................................1605 Ответы: Урок №147.......................................................................................................1608 Ответы: Глава №9. Итоговый тест...............................................................................1609 Ответы: Урок №156.......................................................................................................1618 13 Самоучитель «Уроки по С++» ravesli.com [email protected] Ответы: Урок №160.......................................................................................................1620 Ответы: Глава №10. Итоговый тест.............................................................................1622 Ответы: Урок №164.......................................................................................................1623 Ответы: Глава №11. Итоговый тест.............................................................................1625 Ответы: Урок №170.......................................................................................................1638 Ответы: Урок №171.......................................................................................................1640 Ответы: Урок №176.......................................................................................................1642 Ответы: Глава №12. Итоговый тест.............................................................................1643 Ответы: Глава №13. Итоговый тест.............................................................................1648 Ответы: Глава №14. Итоговый тест.............................................................................1650 Ответы: Урок №198.......................................................................................................1651 Ответы: Урок №201.......................................................................................................1652 Ответы: Урок №203.......................................................................................................1653 Ответы: Глава №15. Итоговый тест.............................................................................1654 14 Самоучитель «Уроки по С++» ravesli.com [email protected] ПРЕДИСЛОВИЕ Есть два основных подхода к изучению программирования. Мы рассмотрим плюсы и минусы каждого из них и постараемся выбрать "золотую середину", чтобы максимально эффективно и результативно использовать свой самый главный ресурс — время. Метод «Снизу-Вверх» Суть заключается в начальном изучении базиса и необходимого фундамента для дальнейшего продвижения. Подход «Снизу-Вверх» популярен не только на многих онлайн- и офлайн- курсах, но и в образовательных учреждениях (например, в университетах или колледжах). Вы начинаете с нуля и изучаете только одну концепцию или тему за раз. Идея состоит в том, чтобы получить хорошие фундаментальные основы программирования, которые в дальнейшем помогут вам развиваться в любом выбранном вами направлении программирования. Главным преимуществом является то, что вы действительно изучаете основы. Не имеет значения, делаете ли вы 3D-игру или интерактивный веб-сайт — фундаментальные основы применимы и используются везде. Учить каждую концепцию отдельно — легче, так как это происходит изолированно. Если выбранный вами курс с подходом «Снизу-Вверх» хорошо структурирован, то вы не будете подвергнуты бомбардировке 1000 разными терминами/концепциями за раз. Вам предоставляется каждая новая тема изолированно в «удобно- съедобном» виде. Сначала идут базовые вещи (например, что такое переменная, функция, цикл и т.д.), а затем уже происходит плавный переход к более сложным темам (например, к классам, ООП и т.д.). Минусом (если его вообще можно так назвать) является скорость продвижения. Хотя это всё также индивидуально. Сначала вы тратите время, чтобы получить необходимые знания, и только потом применяете их на практике. Для создания чего-либо значительного вам потребуется многое узнать. Например, для реализации интерактивного веб-сайта вам могут понадобиться недели, если не месяцы обучения. А для создания более-менее хорошей 3D-игры вам понадобятся месяцы, если не годы обучения. А когда период обучения затягивается, и счастья от мгновенного результата вы не получаете — вот именно здесь и начинается конфликт ожиданий. Большинству 15 Самоучитель «Уроки по С++» ravesli.com [email protected] новичков гораздо интереснее создать веб-сайт за день, нежели неделю разбираться со всеми нюансами циклов или массивов. Это не плохо и не хорошо, это факт. Метод «Сверху-Вниз» Суть заключается в создании рабочих проектов с самого старта обучения. Большинство программистов-самоучек начинали свой путь именно с этого подхода. Цель — создать готовый, рабочий проект. Например, 3D-игру или красивый интерактивный веб-сайт. Самый быстрый способ реализовать проект с нуля — следовать подробному туториалу. Повторяя в точности все шаги из выбранного вами гайда вы сможете в течении относительно небольшого срока создать готовый проект с нуля. Главным преимуществом является то, что вы сразу что-то делаете, а не погружаетесь в изучение базиса. Вы не тратите время на то, чтобы ознакомиться и разобраться со всеми концепциями и их нюансами. Вы тупо делаете проект. И это чувство мгновенного результата от своих действий мотивирует вас на протяжении прохождения всех уроков. Но в этом и кроется главный недостаток — вы не учите основы. Базис, который вам необходим для дальнейшего роста, вы просто пропускаете. В конце туториала вы даже можете не понимать, как работает ваше творение. Если уроки недостаточно подробные, то у вас будут большие пробелы в знаниях, которые заполнить быстро уже не получится. Вам все равно придется потратить якобы сэкономленное время на изучение основ. Если же вы попытаетесь хоть малейшим образом отойти от инструкций туториала, то весь ваш проект может рухнуть в одну минуту, и вы даже не поймете, почему это произошло и как это исправить. Вам просто нужно всё копировать и повторять. Даже не пытайтесь заглянуть "под капот". Не смотрите в эту бездну :) Какой подход выбрать? Ни первый, ни второй. Чтобы стать опытным программистом, вам нужно совмещать оба этих подхода. Вам нужен опыт создания программ/приложений/продуктов, даже если вы не понимаете полностью все детали. Вам нужна мотивация, чтобы продолжать обучаться, и это чувство счастья от мгновенного результата может вам помочь. Изучение только концепций и теории недостаточно, чтобы подготовить вас к работе над реальными проектами. 16 Самоучитель «Уроки по С++» ravesli.com [email protected] Но при этом вам необходимы знания основ. Вы должны уметь понимать и отлаживать как собственный код, так и код, написанный другими разработчиками. Вы должны научиться писать код сами, без помощи кого-либо и без каких-либо подсказок. Привыкать к готовым решениям в Интернете — не очень хорошая практика, так как в будущем, когда перед вами поставят конкретную задачу, решения в Интернете вы можете и не найти, а задачу решить придется. Выход — чередовать эти 2 подхода. Чувствуете, что перегружены и не понимаете, что делает ваш код? Переключитесь на подход "Снизу-Вверх". Вернитесь к теории и разберитесь с тем, что и как делает ваш код. Постарайтесь заполнить пробелы в своих знаниях. Надоедает изучение абстрактных концепций программирования? Переключитесь на подход "Сверху-Вниз". Создайте что-то маленькое, например, простенький сайт или игру. Постарайтесь применить на практике полученные знания и ощутите "счастье от мгновенного результата". Легко и просто не будет, но и не будет настолько сложно, чтобы это не осилить. Не беспокойтесь слишком много о том, что вы еще чего-то не знаете — это лишь дело времени. Но и не забывайте о том, что без действий ничего, абсолютно ничего не произойдет (по крайней мере, хорошего). А чтобы вам помочь в изучении программирования (в частности С++), и был создан данный курс по С++. На этом курсе как раз и совмещаются 2 подхода, о которых говорилось ранее. Все темы раскрываются поочерёдно и изложены в "удобно-съедобном" виде. Вся теория сразу же иллюстрируется в примерах, а в конце уроков (не каждого!) есть тесты — это задания, которые вам нужно решить, применив на практике только что полученные знания. Кроме того, в конце каждой главы есть итоговый тест — то самое чувство мгновенного результата и самостоятельной практики. Поэтому пробуйте и находите то, что подходит именно вам, совмещайте разные подходы и не забывайте о самом главном — получать удовольствие от процесса. 17 Самоучитель «Уроки по С++» ravesli.com [email protected] Урок №1. Введение в программирование Компьютеры понимают только очень ограниченный набор инструкций, и чтобы заставить их что-то делать, нужно четко сформулировать задание, используя эти же инструкции. Программа (также «приложение» или «программное обеспечение», или «софт») — это набор инструкций, которые указывают компьютеру, что ему нужно делать. Физическая часть компьютера, которая выполняет эти инструкции, называется «железом» или аппаратной частью (например, процессор, материнская плата и т.д.). Данный урок является началом серии уроков по программированию на языке С++ для начинающих. Машинный язык Процессор компьютера не способен понимать напрямую языки программирования, такие как C++, Java, Python и т.д. Очень ограниченный набор инструкций, которые изначально понимает процессор, называется машинным кодом (или «машинным языком»). То, как эти инструкции организованы, выходит за рамки данного введения, но стоит отметить две вещи. Во-первых, каждая команда (инструкция) состоит только из определенной последовательности (набора) цифр: 0 и 1. Эти числа называются битами (сокр. от «binary digit») или двоичным кодом. Например, одна команда машинного кода архитектуры ×86 выглядит следующим образом: 10110000 01100001 Во-вторых, каждый набор бит переводится процессором в инструкции для выполнения определенного задания (например, сравнить два числа или переместить число в определенную ячейку памяти). Разные типы процессоров обычно имеют разные наборы инструкций, поэтому инструкции, которые будут работать на процессорах Intel (используются в персональных компьютерах), с большей долей вероятности, не будут работать на процессорах Xenon (используются в игровых приставках Xbox). Раньше, когда компьютеры только начинали массово распространяться, программисты должны были писать программы непосредственно на машинном языке, что было очень неудобно, сложно и занимало намного больше времени, чем сейчас. 18 Самоучитель «Уроки по С++» ravesli.com [email protected] Язык ассемблера Так как программировать на машинном языке — удовольствие специфическое, то программисты изобрели язык ассемблера. В этом языке каждая команда идентифицируется коротким именем (а не набором единиц с нулями), и переменными можно управлять через их имена. Таким образом, писать/читать код стало гораздо легче. Тем не менее, процессор все равно не понимает язык ассемблера напрямую. Его также нужно переводить, с помощью ассемблера, в машинный код. Ассемблер — это транслятор (переводчик), который переводит код, написанный на языке ассемблера, в машинный язык. В Интернете язык ассемблера часто называют просто "Ассемблер". Преимуществом Ассемблера является его производительность (точнее скорость выполнения) и он до сих пор используется, когда это имеет решающее значение. Тем не менее, причина подобного преимущества заключается в том, что программирование на этом языке адаптируется к конкретному процессору. Программы, адаптированные под один процессор, не будут работать с другим. Кроме того, чтобы программировать на Ассемблере, по-прежнему нужно знать очень много не очень читабельных инструкций для выполнения даже простого задания. Например, вот вышеприведенная команда, но уже на языке ассемблера: mov al, 061h Высокоуровневые языки программирования Для решения проблем читабельности кода и чрезмерной сложности были разработаны высокоуровневые языки программирования. C, C++, Pascal, Java, JavaScript и Perl — это всё языки высокого уровня. Они позволяют писать и выполнять программы, не переживая о совместимости кода с разными архитектурами процессоров. Программы, написанные на языках высокого уровня, также должны быть переведены в машинный код перед выполнением. Есть два варианта: компиляция, которая выполняется компилятором; интерпретация, которая выполняется интерпретатором. Компилятор — это программа, которая читает код и создает автономную (способную работать независимо от другого аппаратного или программного обеспечения) исполняемую программу, которую процессор понимает напрямую. 19 Самоучитель «Уроки по С++» ravesli.com [email protected] При запуске программы весь код компилируется целиком, а затем создается исполняемый файл и уже при повторном запуске программы компиляция не выполняется. Проще говоря, процесс компиляции выглядит следующим образом: Интерпретатор — это программа, которая напрямую выполняет код, без его предыдущей компиляции в исполняемый файл. Интерпретаторы более гибкие, но менее эффективные, так как процесс интерпретации выполняется повторно при каждом запуске программы. Процесс интерпретации: Любой язык программирования может быть компилируемым или интерпретируемым, однако, такие языки, как C, C++ и Pascal — компилируются, в то время как "скриптовые" языки, такие, как Perl и JavaScript — интерпретируются. Некоторые языки программирования (например, Java) могут как компилироваться, так и интерпретироваться. Преимущества высокоуровневых языков программирования Преимущество №1: Легче писать/читать код. Вот вышеприведенная команда, но уже на языке C++: а = 97; Преимущество №2: Требуется меньше инструкций для выполнения определенного задания. В языке C++ вы можете сделать что-то вроде а = Ь * 2 + 5; в одной строке. В языке ассемблера вам пришлось бы использовать 5 или 6 инструкций. 20 Самоучитель «Уроки по С++» ravesli.com [email protected] Преимущество №3: Вы не должны заботиться о таких деталях, как загрузка переменных в регистры процессора. Компилятор или интерпретатор берет это на себя. Преимущество №4: Высокоуровневые языки программирования более портируемые под различные архитектуры (но есть один нюанс). Нюанс заключается в том, что многие платформы, такие как Microsoft Windows, имеют свои собственные специфические функции, с помощью которых писать код намного легче. Но в таком случае приходится жертвовать портируемостью, так как функции, специфические для одной платформы, с большей долей вероятности, не будут работать на другой платформе. Обо всем этом мы детально поговорим на следующих уроках. 21 Самоучитель «Уроки по С++» ravesli.com [email protected] Урок №2. Введение в языки программирования С и С++ Перед C++ был C. C (произносится как "Си") был разработан в 1972 году Деннисом Ритчи в Bell Telephone Laboratories как системный язык программирования, т.е. язык для написания операционных систем. Основной задачей Ритчи было создание легко компилируемого минималистического языка, который предоставлял бы эффективный доступ к памяти, относительно быстро выполнялся, и на котором можно было бы писать эффективный код. Таким образом, при разработке высокоуровневого языка, был создан язык Си, который во многом относился к языкам низкого уровня, оставаясь при этом независимым от платформ, для которых мог быть написан код. Cи в конечном итоге стал настолько эффективным и гибким, что в 1973 году Ритчи и Кен Томпсон переписали больше половины операционной системы UNIX, используя этот язык. Многие предыдущие операционные системы были написаны на языке ассемблера. В отличие от Ассемблера, на котором пишутся программы под конкретные процессоры, высокая портируемость языка Cи позволила перекомпилировать UNIX и на другие типы компьютеров, ускоряя его популяризацию. Язык Cи и операционная система UNIX тесно связаны между собой, и популярность первого отчасти связана с успехом второго. В 1978 году Брайан Керниган и Деннис Ритчи опубликовали книгу под названием "Язык программирования Cи". Эта книга, более известна как "K&R" (первые буквы фамилий авторов), стала стандартом и своеобразной инструкцией к Си. Когда требовалась максимальная портируемость, то программисты придерживались рекомендаций в "K&R", поскольку большинство компиляторов в то время были реализованы в соответствии со стандартами, присутствующими в этой книге. В 1983 году Американский национальный институт стандартов (сокр. "ANSI" от англ. "American National Standards Institute") сформировал комитет для утверждения официального стандарта языка Cи. В 1989 году они закончили и выпустили стандарт C89, более широко известный, как ANSI C. В 1990 году Международная организация по стандартизации (сокр. "ISO" от англ. "International Organization for Standardization") приняла ANSI C (с небольшими изменениями). Эта версия языка Cи стала известна как C90. В конечном счете, компиляторы адаптировались под требования ANSI C/C90 и программы, в которых требовалась максимальная портируемость, писались в соответствие с этими стандартами. 22 Самоучитель «Уроки по С++» ravesli.com [email protected] В 1999 году комитет ANSI выпустил новую версию языка Cи, которая получила название C99. Она приняла много особенностей, которые были реализованы в компиляторах (в виде различных расширений) или уже в языке C++. Язык C++ Язык программирования C++ (произносится как «Си плюс плюс») был разработан Бьёрном Страуструпом в Bell Telephone Laboratories в качестве дополнения к Cи в 1979 г. Он добавил множество новых возможностей в язык Си. Его популярность была вызвана объектно-ориентированностью языка. Об объектно- ориентированном программировании (ООП) и его отличиях от традиционных методов программирования мы поговорим несколько позже. Язык C++ был ратифицирован (одобрен) комитетом ISO в 1998 году и потом снова в 2003 году (под названием C++03). Потом были следующие версии стандарта языка С++ (выпускаются раз в 3 года), которые добавили еще больше функционала: C++11 в 2011 году; C++14 в 2014 году; C++17 в 2017 году; C++20 в 2020 году. Философия С и С++ Смысл философии языков С и C++ можно определить выражением "доверять программисту". Например, компилятор не будет вам мешать сделать что-то новое, что имеет смысл, но также не будет мешать вам сделать что-то такое, что может привести к сбою. Это одна из главных причин, почему так важно знать то, что вы не должны делать, как и то, что вы должны делать, создавая программы на языках С/С++. Примечание: Вам не нужны знания языка Си, чтобы проходить данные уроки. В процессе изучения этих уроков вы получите необходимую базу/фундамент знаний. 23 Самоучитель «Уроки по С++» ravesli.com [email protected] Урок №3. Введение в разработку программного обеспечения Перед написанием и выполнением нашей первой программы, мы должны понять, как вообще выполняется разработка программного обеспечения на языке C++. Схема разработки ПО (сокр. от "Программное Обеспечение"): Шаг №1: Определите проблему, которую хотели бы решить Это шаг «Что?». Здесь вы должны понять, что же вы хотите, чтобы ваша программа делала. Этот шаг может быть, как самым простым, так и самым сложным. Всё, что вам нужно — это четко сформулировать идею. Только после этого вы сможете приступать к следующему шагу. 24 Самоучитель «Уроки по С++» ravesli.com [email protected] Вот несколько примеров выполнения шага №1: "Я хочу написать программу, которая вычисляла бы среднее арифметическое чисел, которые я введу". "Я хочу написать программу, в которой будет 2D-лабиринт, по которому сможет передвигаться пользователь". "Я хочу написать программу, которая будет анализировать цены акций на бирже и давать предсказания по поводу скачков этих цен вверх или вниз". Шаг №2: Определитесь, как вы собираетесь решить эту проблему Здесь мы уже отвечаем на вопрос «Как?». Каким образом можно решить проблему, обозначенную на шаге №1? Этим шагом довольно часто пренебрегают при разработке программного обеспечения. Суть в том, что способов решения задачи может быть много, только часть из них — хорошие решения, а часть — плохие. Вы должны научиться отделять первые от вторых. Очень часто можно наблюдать ситуацию, когда у программиста возникает идея и он сразу же садится программировать. Как вы уже могли догадаться, такой сценарий далеко не всегда приводит к эффективным результатам. Как правило, хорошие решения имеют следующие характеристики: простота; хорошая документация (с инструкциями и комментариями); модульный принцип: любая часть программы может быть повторно использована или изменена позже, не затрагивая другие части кода; надежность: соответствующая обработка ошибок и экстренных ситуаций. Когда вы садитесь и начинаете сразу программировать, вы думаете: "Я хочу сделать это, вот это и еще вот это!". Таким образом вы принимаете решения, которые позволят вам поскорее выполнить задание. Однако это может привести к тому, что вы получите программу, которую позже будет трудно изменить/модифицировать, добавить что-то новое или вам попросту придется разбираться с большим количеством ошибок. Согласно закону Парето, программист тратит примерно 20% времени на написание программы и 80% времени на отладку (исправление ошибок) или поддержку (добавление новых функциональных возможностей) кода. Следовательно, лучше потратить дополнительное время на обдумывание лучшего способа решения проблемы перед процессом написания кода, нежели потом тратить оставшиеся 80% времени на поиск и исправление ошибок. 25 Самоучитель «Уроки по С++» ravesli.com [email protected] Шаг №3: Напишите программу Для того, чтобы написать программу, необходимы две вещи: знание выбранного вами языка программирования (этому мы вас научим); редактор кода. Программу можно написать, используя любой редактор, даже тот же Блокнот в Windows или текстовый редактор Vi в Unix. Тем не менее, я настоятельно рекомендую использовать редактор, предназначенный для программирования. Не беспокойтесь, если у вас его еще нет. На следующем уроке мы рассмотрим процесс установки такого приложения. Редактор типичного программиста, как правило, имеет следующие особенности, которые облегчают программирование: Нумерация строк. Это функция чрезвычайно полезна при отладке программ, когда компилятор выдаёт нам сообщения об ошибках. Типичная ошибка компиляции состоит из наименования ошибки и номера строки, где эта ошибка произошла (например, "ошибка переопределения переменной x, строка 90"). Без нумерации строк искать ту самую 90-ю строку кода было бы несколько затруднительно, не так ли? Подсветка синтаксиса. Подсветка синтаксиса изменяет цвет разных частей программы и кода, что улучшает восприятие как целой программы, так и её отдельных частей. Специальный шрифт. В обычных шрифтах очень часто возникает путаница между определенными символами, когда непонятно, какой символ перед вами. Например: цифра 0 или буква O, цифра 1 или буква l (нижний регистр L), или может буква I (верхний регистр i). Вот для этого и нужен специальный шрифт, в котором будет легко различить эти символы, предотвращая случайное использование одного символа вместо другого. Программы на языке C++ следует называть name.cpp, где name заменяется именем вашей программы, а расширение.cpp сообщает компилятору (и вам тоже), что это исходный файл кода, который содержит инструкции на языке программирования C++. Следует обратить внимание, что некоторые программисты используют расширение.cc вместо.cpp, но я рекомендую использовать именно.cpp. Также стоит отметить, что много программ, написанных на языке C++, могут состоять из нескольких файлов.cpp. Хотя большинство программ, которые вы будете создавать на протяжении этих уроков, не будут слишком большими, в 26 Самоучитель «Уроки по С++» ravesli.com [email protected] дальнейшем вы научитесь писать программы, которые будут включать десятки, если не сотни отдельных файлов.cpp. Шаг №4: Компиляция Для того, чтобы скомпилировать программу нам нужен компилятор. Работа компилятора состоит из двух частей: Проверка программы на соответствие правилам языка C++ (проверка синтаксиса). Если она будет неудачной, то компилятор выдаст сообщения об ошибках, которые нужно будет исправить. Конвертация каждого исходного файла с кодом в объектный файл (или "объектный модуль") на машинном языке. Объектные файлы, как правило, имеют названия name.o или name.obj, где name должно быть такое же как и имя вашего исходного файла.cpp. Если ваша программа состоит из трех файлов.cpp, то компилятор сгенерирует 3 объектных файла. Стоит отметить, что такие операционные системы как Linux и macOS имеют уже встроенный компилятор C++, который называется g++. Для компиляции файлов из командной строки с помощью g++ вам нужно будет написать следующее: g++ -c file1.cpp file2.cpp file3.cpp Таким образом мы создадим file1.o, file2.o и file3.o. –c означает "только скомпилировать", т.е. просто создать.o (объектные) файлы. Кроме g++, существует множество компиляторов для различных операционных систем: Linux, Windows, macOS и других. Шаг №5: Линкинг (связывание объектных файлов) Линкинг — это процесс связывания всех объектных файлов, генерируемых компилятором, в единую исполняемую программу, которую вы затем сможете 27 Самоучитель «Уроки по С++» ravesli.com [email protected] запустить/выполнить. Это делается с помощью программы, которая называется линкер (или "компоновщик"). Кроме объектных файлов, линкер также подключает файлы из Стандартной библиотеки С++ (или любой другой библиотеки, которую вы используете, например, библиотеки графики или звука). Сам по себе язык С++ довольно маленький и простой. Тем не менее, к нему подключается большая библиотека дополнительных функций, которые могут использовать ваши программы, и эти функции находятся в Стандартной библиотеке C++. Например, если вы хотите вывести что-либо на экран, то у вас в коде должна быть специальная команда, которая сообщит компилятору, что вы хотите использовать функцию вывода информации на экран из Стандартной библиотеки C++. После того, как компоновщик закончит линкинг всех объектных файлов (при условии, что не будет ошибок), вы получите исполняемый файл. Опять же, в целях наглядности, чтобы связать.o файлы, которые мы создали выше в Linux или macOS, мы можем снова использовать g++: g++ -o prog file1.o file2.o file3.o Команда -o сообщает g++, что мы хотим получить исполняемый файл с именем prog из следующих файлов: file1.o, file2.o и file3.o. При желании, компиляцию и линкинг можно объединить в один шаг: g++ -o prog file1.cpp file2.cpp file3.cpp Результатом будет исполняемый файл с именем prog. 28 Самоучитель «Уроки по С++» ravesli.com [email protected] Шаг №6: Тестирование и отладка Здесь начинается самое веселое! Вы уже можете запустить исполняемый файл и посмотреть, работает ли всё так, как надо. Если нет, то пришло время отладки. Более подробно об отладке мы поговорим на соответствующих уроках. Обратите внимание, для выполнения шагов №3-№6 вам потребуется специальное программное обеспечение. Хотя вы можете использовать отдельные программы на каждом из этих шагов, один пакет программного обеспечения (сокр. "IDE" от англ. "Integrated Development Environment") объединяет в себе все эти программы. Обычно с IDE вы получаете редактор кода с нумерацией строк и подсветкой синтаксиса, а также компилятор и линкер. А когда вам нужно будет провести отладку программы, вы сможете использовать встроенный отладчик. Кроме того, IDE объединяет и ряд других полезных возможностей: комплексная помощь, дополнение кода, в некоторых случаях еще и система контроля версий. 29 Самоучитель «Уроки по С++» ravesli.com [email protected] Урок №4. Установка IDE (Интегрированной Среды Разработки) Интегрированная Среда Разработки (сокр. "IDE" от англ. "Integrated Development Environment") — это программное обеспечение, которое содержит всё необходимое для разработки, компиляции, линкинга и отладки кода. Нам нужно установить одну такую IDE для написания программ на языке С++. Но какую именно? Я рекомендую Visual Studio от Microsoft (для пользователей Windows) или Code::Blocks (для пользователей Linux/Windows). Также вы можете установить и любую другую IDE. Основные концепции, рассматриваемые в данных уроках, должны работать во всех средах разработки. Впрочем, иногда код может частично отличаться в разных IDE, поэтому вам придется самостоятельно искать более подробную информацию о работе в выбранной вами IDE. IDE для пользователей Windows Если вы пользователь Windows (как и большинство из нас), то установите Visual Studio 2019 версию "Community", которая является бесплатной (все остальные версии — платные): После того, как вы скачаете и запустите установщик, вам нужно будет выбрать "Разработка классических приложений на C++". Пункты, выбранные по умолчанию в правой части экрана, трогать не нужно — там всё хорошо, только убедитесь, что поставлена галочка возле пункта "Пакет SDK для Windows 10". Этот пакет может использоваться и в ранних версиях Windows, поэтому не 30 Самоучитель «Уроки по С++» ravesli.com [email protected] переживайте, если у вас Windows 7 или Windows 8 — всё будет работать. Затем нажимаем "Установить": При желании вы можете указать галочки и возле других пунктов для скачивания, но учтите, что тогда размер вашей IDE будет увеличен. IDE для пользователей Linux/Windows Если вы пользователь Linux (или Windows, но хотите писать программы, которые затем можно будет легко портировать в Linux), то установите Code::Blocks. Это бесплатная, кроссплатформенная IDE, которая работает как в Linux, так и в Windows. Пользователям Windows нужно загружать версию с MinGW в комплекте: 31 Самоучитель «Уроки по С++» ravesli.com mat