Содержание
- 2. Язык С++ Компилируемый статически типизированный язык программирования общего назначения Совместим с языком C Но не C99
- 3. Программа Hello, World! /* Программа, выводящая строку "Hello, world!" в стандартный поток вывода */ #include void
- 4. Константы
- 5. Константы Числовые константы Целые числа и числа с плавающей запятой Логические константы true и false Символьные
- 6. Числовые константы Десятичные 12345, -34021 999999L, 99983UL Шестнадцатеричные 0xFeedBeef, 0x328aadb Восьмеричные 003, 0723 Вещественные 1.35, 8.45f
- 7. Логические константы Логическая константа true служит для обозначения логического значения «Истина», а константа false – значения
- 8. Пример – определение простоты числа int n; std::cin >> n; bool isPrime = true; for (int
- 9. Символьные константы Записывается в виде символа, обрамленного одиночными кавычками 'A', '1' Значение символьной константы – числовой
- 10. Строковые константы (строковые литералы) Нуль или более символов, заключенных в двойные кавычки "Hello, world\n" "" "Hello
- 11. #include #include void main() { char letterA = 'A'; char eol = '\n'; // Символы, вроде
- 12. #include #include int main() { std::string x = "Apple" "\n" "Dog" "," "Banana\n"; // Что выведет
- 13. Представление строковой константы в памяти
- 14. Типы данных
- 15. Типы данных языка C++ Целые числа различных размеров со знаком или без int, short, char Числа
- 16. Базовые типы данных Типы данных целых чисел char int модификаторы short/long unsigned/signed Логический тип bool Типы
- 17. Объявления переменных Переменные объявляются раньше их использования int lower, upper, step; char c, line[1000]; bool success;
- 18. Объявление локальных переменных и констант void main() { // Объявление переменной carSpeed типа double double carSpeed;
- 19. Автоматическое определение типа переменной void main() { // double auto PI = 3.14159265; // const float
- 20. Область видимости переменной void main() { // Область видимости переменной ограничена блоком, внутри которого она объявлена
- 21. Объявление глобальных переменных #pragma once // Объявление глобальной переменной как внешней // Это позволяет ссылаться на
- 22. #include "variables.h" // Переменная, объявленная вне функции является глобальной. // Ее область видимости - вся программа
- 23. Ключевое слово typedef Язык Си++ предоставляет оператор typedef, позволяющий давать типам данных новые имена После этого
- 24. Пример использования оператора typedef typedef int Length; Length len, maxlen; len = 1; typedef double real;
- 25. Using – альтернатива typedef int main() { using Coordinate = double; Coordinate x0 = 35; return
- 26. Целочисленные типы данных Служат для хранения целых чисел различного размера char short (short int) int long
- 27. Знаковые и беззнаковые целые числа Типы int и short (без модификатора) являются знаковыми int = signed
- 28. Представление целых чисел в памяти компьютера Тип char занимает одну ячейку памяти (байт) размером, как правило,
- 29. Пример представления числа 666 в виде типа short и int Дано: разрядность типа char = 8
- 30. Типы данных с плавающей запятой Позволяют задавать вещественные числа различного размера и точности float double long
- 31. const float PI = 3.1415927f; double sin60 = 0.86602540378443864676372317075294; double FahrengeitToCelsius(double fahr) { return (fahr –
- 32. Перечислимый тип данных
- 33. Перечисляемые типы данных (перечисления) Позволяет задать ограниченный набор именованных целочисленных значений День недели Состояние конечного автомата
- 34. #include enum WeekDay { SUNDAY = 0, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, }; int main()
- 35. Scoped enum Появились в C++11 Ограничивают область видимости значений перечислимого типа именем перечисления Позволяют преодолеть ограничение
- 36. enum TrafficLightColor { Red, Yellow, Green }; // Не скомпилируется, т.к. значение Red уже используется TrafficLightColor
- 37. Решение со Scoped enum enum class TrafficLightColor // или enum struct TrafficLightColor { Yellow, Red, Green
- 38. Пример использования логического типа данных double CalculateCircleRadius(double area) { bool argumentIsValid = (area >= 0); if
- 39. Набор используемых символов Используются почти все графические символы ASCII таблицы (кроме @ и $) Язык является
- 40. Основные операторы языка Си Общие Арифметические операторы и оператор присваивания Логические операторы и операторы сравнения Оператор
- 41. Арифметические операторы Бинарные + - * / % (остаток от деления – применяется только к целым)
- 42. Пример if ( ((year % 4 == 0) && (year % 100 != 0)) || (year
- 43. Операторы отношения Операторы отношения > >= Операторы сравнения на равенство == != Логические операторы && -
- 44. Пример #include int main(int argc, char * argv[]) { int ch; char buffer[10]; const int MAX_SIZE
- 45. Операторы инкремента и декремента Увеличивают или уменьшают значение операнда на 1 ++ -- Имеют две формы
- 46. Побитовые операторы Данные операторы позволяют осуществлять операции над отдельными битами целочисленных операндов & - побитовое И
- 47. Пример: функция getbits /* getbits: получает n бит, начиная с p-й позиции */ unsigned getbits(unsigned x,
- 48. Операторы и выражения присваивания Служат для присваивания переменным значения некоторого выражения i = 3; i +=
- 49. Пример: функция bitcount /* bitcount: подсчет количества единичных битов в числе x */ int bitcount(unsigned х)
- 50. Преобразование типов в стиле С Происходит, когда операнды оператора принадлежат к разным типам Неявное преобразование int
- 51. Опасность неявного приведения типов int CenterPictureOnTheScreen( int pictureWidth, unsigned screenWidth) { return (screenWidth - pictureWidth) /
- 52. Решение проблемы – явное приведение типов int CenterPictureOnTheScreen( int pictureWidth, unsigned screenWidth) { return ((int)screenWidth -
- 53. Недостатки оператора преобразования типов в стиле C Несмотря на свою простоту данный способ преобразования типов обладает
- 54. Пример void Test(double doubleValue) { int intValue = (int)&doubleValue; … } struct Point { double x;
- 55. Преобразование типов в стиле C++ В языке C++ введены 4 оператора приведения типов static_cast (arg) dynamic_cast
- 56. Оператор static_cast Применяется для статического преобразования одного типа к другому Также может применяться для статического преобразования
- 57. Пример void Test(double doubleValue) { // Ошибка компиляции int intValue = static_cast (&doubleValue); } struct Point
- 58. Оператор dynamic_cast Применяется для динамического преобразования типов в пределах иерархии классов (об этом позже)
- 59. Оператор const_cast Применяется для снятия константности с константного выражения int k = 0; const int *
- 60. Оператор reinterpret_cast Может применяться для преобразования между целочисленными типами и указателями, а также между указателями на
- 61. Условное выражение Условное выражение имеет вид: выр1 ? выр2 : выр3 Сначала вычисляется выражение 1 Если
- 62. Приоритет и очередность выполнения операторов
- 63. Управление выполнением программы
- 64. Инструкции и блоки Выражение (например, x = 0) становится инструкцией, если в конце поставить точку с
- 65. Блоки и область видимости Переменные видимы внутри того блока, где она объявлена При покидании своего блока
- 66. Конструкция if-else Оператор if позволяет выполнить тот или иной участок кода в зависимости от значения некоторого
- 67. Конструкция else-if Позволяет осуществлять многоступенчатое решение if (выражение) инструкция else if (выражение) инструкция else if (выражение)
- 68. Пример, бинарный поиск /* binsearch: найти x в v[0] int binsearch(int x, const int v[], int
- 69. Оператор switch Используется для выбора одного из нескольких путей Осуществляется проверка на совпадение значения выражения с
- 70. #include #include #include enum class WeekDay { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday }; std::string
- 71. #include int main() /* подсчет цифр, символов-разделителей и прочих символов */ { int numSpaces = 0;
- 72. Циклическое выполнение
- 73. Что такое циклическое выполнение Цикл – последовательность из нескольких операторов, указываемая в программе один раз, которая
- 74. Циклическое выполнение в языке Си Циклическое выполнение в языке Си осуществляется при использовании следующих операторов цикла:
- 75. Оператор while Оператор while служит для организации циклов с предусловием цикл, который выполняется, пока истинно некоторое
- 76. Пример: нахождение наибольшего общего делителя // Поиск наибольшего общего делителя чисел a и b { unsigned
- 77. Оператор for Оператор for служит для организации циклов со счетчиком Синтаксис for (выр1; выр2; выр3) инструкция
- 78. Простой цикл for void main() { // Выводит 0, 1, 2, 3, 4, 5, 6, 7,
- 79. Range-based for Версия цикла for, предназначенная для перебора элементов некоторого диапазона Массивы, строки, контейнеры стандартной библиотеки,
- 80. Пример: обход элементов массива // Обход элементов массива { int numbers[] = { 10, 15, 17,
- 81. // Обход символов строки и контейнера map { string pangram = "the quick brown fox jumps
- 82. Оператор do-while Оператор do-while служит для организации циклов с постусловием цикл, в котором условие проверяется после
- 83. Пример // Ввод продолжается, пока пользователь не введет bye { string userInput; do { cout getline(cin,
- 84. Бесконечные циклы for, while, do-while { // Генератор псевдослучайных чисел с использованием Вихря Мерсенна (Mersenne Twister)
- 85. Вложенные циклы Один цикл может быть вложен в другой При этом выполнение внутреннего цикла выполняется как
- 86. Инструкции break и continue Инструкция break осуществляет немедленный выход из тела цикла, внутри которого она находится
- 87. Пример: поиск простых чисел cout for (int i = 2; i { bool isPrime = true;
- 88. Инструкция goto Инструкция goto позволяет осуществить переход на заданную метку внутри текущей функции Синтаксис: goto метка;
- 89. Пример /* поиск совпадающих элементов в массивах */ for (i = 0; i { for (j
- 90. Структуры
- 91. Структуры Структура - это одна или несколько переменных (возможно, различных типов), которые для удобства работы с
- 92. // Структура Point, задающая точку на плоскости struct Point { int x; int y; }; //
- 93. void main() { // Объявляем переменную pt, а затем инициализируем ее поля одно за другим Point
- 94. struct Triangle { Point vertex1; Point vertex2; Point vertex3; }; // Инициализация структур, содержащих вложенные структуры
- 95. // Структуры в качестве параметров функций и возвращаемых значений double CalculateDistance(const Point & pt1, const Point
- 96. enum class Month { January, February, March, April, May, June, July, August, September, October, November, December
- 97. // Проверка двух дат на равенство bool Equals(const Date & d1, const Date& d2) { return
- 98. Объединения
- 99. Объединения Объединение - это тип данных, который может содержать (в разные моменты времени) объекты различных типов
- 100. 5 3.8 #include enum class NumericType { INTEGER, REAL, }; struct Numeric { NumericType type; union
- 101. union Vector3D { struct { float x, y, z; }; float items[3]; }; … Vector3D v1;
- 102. Массивы
- 103. Массивы Массивы позволяют объявить несколько (один и более) последовательных объектов, объединенных под одним именем, и осуществлять
- 104. #include #include int g_globalArray[3]; void main() { // Глобальные переменные-массивы по умолчанию инициализируются нуляем assert(g_globalArray[0] ==
- 105. Массивы символов void ArrayOfChars() { // Константный массив из 5 элементов const char name[] = {
- 106. Определение размера массива #include #include int g_globalArray[3]; // При помощи такой функции можно определить количество элементов
- 107. Многомерные массивы #include typedef double Matrix2x2[2][2]; void main() { Matrix2x2 mat = { {1.0, 2.5}, {4.5,
- 108. Передача массива в функцию #include typedef double Matrix2x2[2][2]; void Fn(Matrix2x2 mat) { mat[0][0] = 3.0; }
- 109. Указатели, динамическая память
- 110. Указатели Указатель – используются для хранения адресов переменных в памяти Основные области применения Работа с динамической
- 111. #include typedef struct tagPoint { int x, y; }Point; void PrintPoint(Point *pPoint) { printf("point is (%d,
- 112. Хранение данных В C++ есть три разных способа выделения памяти для объектов Статическое: пространство для объектов
- 113. Организация памяти в языке C++ С точки зрения языка С++ память представляет собой массив последовательно пронумерованных
- 114. Пример int i = 1000; char a = 15;
- 115. Что такое указатель? Указатель – это переменная, которая может хранить адрес другой переменной в памяти заданного
- 116. Объявление указателя Указатель на переменную определенного типа объявляется следующим образом: * ; Например: int *pointerToInt; Указатель,
- 117. Получение адреса переменной Для взятия адреса переменной в памяти служит унарный оператор & Этот оператор возвращает
- 118. Оператор косвенного доступа Для доступа к значению, на которое ссылается указатель, необходимо его разыменование (dereferencing), осуществляемое
- 119. Пример p c char c = ‘A’; char *p = &c; *p = ‘B’; ‘A’ ‘B’
- 120. Инициализация указателей Значение неинициализированного указателя не определено Разыменование такого указателя приводит к неопределенному поведению Лучше присвоить
- 121. NULL (или 0) vs nullptr В программах на C++11 следует использовать nullptr вместо NULL или 0
- 122. #include void Print(void * p) { std::cout } void Print(int i) { std::cout } void Print(bool
- 123. Копирование указателей Как и в случае обычных переменных, значение одного указателя может быть присвоено другому при
- 124. Указатели и аргументы функций В языке Си параметры в функцию передаются по значению. Указатели – единственный
- 125. Указатели на функции В Си можно объявить указатель на функцию и работать с ним как с
- 126. #include typedef bool (*OrderedFunction)(int a, int b); void BubbleSort(int array[], int size, OrderedFunction fn) { bool
- 127. #include typedef bool (*OrderedFunction)(int a, int b); void BubbleSort(int array[], int size, OrderedFunction fn) { bool
- 128. #include #include typedef std::function OrderedFunction; void BubbleSort(int array[], int size, OrderedFunction const& isOrdered) { bool sorted;
- 129. Указатели и массивы Указатели и массивы в C/C++ тесно связаны Имя массива является синонимом расположения его
- 130. Адресная арифметика Если p – указатель на некоторый элемент массива, то p+1 – указатель на следующий
- 131. Адресная арифметика в действии a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] p p+1 p-1 q
- 132. Примеры int arr[10]; // получаем указатель на начальный элемент массива int *p = arr; // эквивалентно
- 133. Указатели на char Строковые константы – массивы символов с завершающим нулем Передача строковой константы в функцию
- 134. Особенности Присваивание символьных указателей, не копирует строки char * p = “Hello”; char * p1 =
- 135. Массивы указателей Указатели, как и другие переменные можно группировать в массивы int main(int argc, char* argv[])
- 136. Указатели на указатели В C и C++ возможны указатели, ссылающиеся на другие указатели char arr[] =
- 137. Инкремент и декремент указателя Когда указатель ссылается на определенный элемент массива, имеют смысл операции инкремента и
- 138. #include "stdio.h" // возвращаем адрес найденного символа в строке или nullptr в случае отсутствия const char*
- 139. Указатели и динамическая память Часто возможны ситуации, когда размер и количество блоков памяти, необходимых программе, не
- 140. Операторы new и delete В состав языка C++ вошли операторы new и delete, осуществляющие работу с
- 141. Прочие средства работы с динамической памятью В стандартной библиотеке языка C для работы с динамической памятью
- 142. Функции memcpy, memset и memmove Функция memcpy осуществляет копирование блока памяти из одного адреса в другой
- 143. Пример int n = 30; // выделяем память под n элементов типа int int * arr
- 144. Указатели на структуры и объединения Указатели на структуры объявляются аналогично указателям на другие типы Для доступа
- 145. Правила корректной работы с динамической памятью Объекты, выделенные при помощи оператора new должны быть удалены при
- 146. Проблемы ручного управления памятью «Висячие ссылки» (dangling pointer) После удаления объекта все указатели на него становятся
- 147. Проблемы ручного управления памятью (продолжение) Утечка памяти (Memory Leak) Причины: Программист не удалил объект после завершения
- 148. Примеры некорректной работы с динамической памятью int main(int argc, char* argv[]) { int * pIntArray =
- 149. Еще примеры некорректной работы с динамической памятью int main(int argc, char* argv[]) { int * someInt
- 150. Как не прострелить себе ногу, программируя на C++ Работа с указателями – сильная сторона C++, требующая
- 151. А как у них? Есть ЯВУ, использующие сборку мусора (Garbage collection), например Java, C#, JavaScript, D,
- 152. Автоматический сборщик мусора – не панацея Сборка мусора автоматизирует лишь работу с памятью, но не с
- 153. Ссылки
- 154. Ссылки Ссылку можно рассматривать как еще одно имя объекта Синтаксис & означает ссылку на Применение Задание
- 155. Ссылки в качестве параметров функций Функция принимает не копию аргумента, а ссылку на него При сложных
- 156. Константные ссылки в качестве параметров функций Параметр, переданный в функцию по константной ссылке, доступен внутри нее
- 157. Пример 1 #include void Swap(int & a, int & b) { int tmp = a; a
- 158. Пример 2 struct Point { int x, y; }; void Print(Point const& pnt) { printf("(x:%d, y:%d)\n",
- 159. Инициализация ссылки Ссылка должна быть обязательно проинициализирована Должен существовать объект на который она ссылается Синтаксис Тип
- 160. Пример #include int main() { int i = 1; int j = 3; // инициализация ссылки
- 161. Ссылки на временные объекты При инициализации ссылки объектом другого типа компилятор создает временный объект нужного типа
- 162. Пример 1 int a = 1; int & refA = a; // ссылка на a printf("a
- 163. Пример 2 #include int Add(int x, int y) { return x + y; } int main(int
- 164. Пространства имен
- 165. Пространства имен Пространства имен позволяют логически сгруппировать классы, переменные и функции в некоторые именованные области Позволяют
- 166. #include namespace math { int calculateX2(int x) { return x * x; } } namespace graphics
- 167. Стандартная библиотека шаблонов STL
- 168. Стандартная библиотека шаблонов (STL) Программная библиотека, содержащая большое количество готового к использованию обобщенного кода Контейнеры Итераторы
- 169. Контейнеры Классы, предназначенные для хранения элементов определенного типа STL содержит классы обобщенных реализаций различных контейнеров, которые
- 170. Основные контейнеры STL Последовательные контейнеры Строка (basic_string, string, wstring) Вектор (vector) Двусвязный список (list) Двусторонняя очередь
- 171. Строка std::string Контейнер, предназначенный для хранения строк произвольной длины В качестве элементов строк могут выступать элементы
- 172. Создание строки string emptyString; string hello = "Hello"; auto goodbye = "Goodbye"s; const char chars[] =
- 173. Размер и вместимость auto text = "This is a very long string"s; assert(text.length() == 26); assert(text.size()
- 174. Сравнение строк assert("bbb"s > "aaa"s); assert("xyz"s == "xyz"s); assert("Abc"s > "Abb"s); string s = "Hello"; assert("Hello"
- 175. Конкатенация строк string hello("Hello"); string world("world"); string helloWorld = hello + " " + world; //
- 176. Извлечение подстроки auto helloWorld = "Hello world"s; assert(helloWorld.substr(0, 5) == "Hello"s); assert(helloWorld.substr(6, 5) == "world"s); assert(helloWorld.substr(6)
- 177. Поиск внутри строки string s("Hello world"); assert(s.find('w') == 6); assert(s.find('x') == string::npos); assert(s.find_first_of("aeiouy"s) == 1); //
- 178. Замена внутри строки auto s = "Hello world"s; s.replace(0, 5, "Goodbye"s); assert(s == "Goodbye world"s); auto
- 179. string_view
- 180. string_view Объект, ссылающийся на неизменную последовательность символов в памяти Не владеет символьными данными При разрушении string_view
- 181. Конструирование string_view const char arr[] = { 'H', 'e', 'l', 'l', 'o' }; string_view v(arr, 5);
- 182. Пример auto url = "http://en.cppreference.com/w/cpp/string/basic_string_view"s; string_view scheme(&url[0], 4); assert(scheme == "http"); string_view domain(&url[7], 19); assert(domain ==
- 183. Вектор std::vector Контейнер для хранения динамического массива элементов произвольного типа Автоматизация процесса управления памятью Везде, где
- 184. Пример #include #include using namespace std; int main(int argc, char *argv[]) { // создаем массив целых
- 185. #include #include #include using namespace std; struct Point { int x, y; }; struct PointDbl {
- 186. Двусвязный список std::list Реализовывает двусвязный список элементов произвольного типа К элементам списка осуществляется последовательный доступ при
- 187. Пример #include #include #include using namespace std; int main(int argc, char *argv[]) { list listOfStrings; listOfStrings.push_back(“One”);
- 188. #include #include #include #include #include using namespace std; typedef list StringList; StringList PopulateNamesList() { StringList maleNames;
- 189. Двусторонняя очередь (double-ended queue) std::deque Аналогична вектору, но обеспечивает эффективную вставку и удаление элементов не только
- 190. Классы std::map и std::multimap Ассоциативный контейнер, хранящий пары «ключ» - «значение» Позволяет отображать элементы одного типа
- 191. Пример #include #include #include using namespace std; int main(int argc, char *argv[]) { map dictionary; dictionary.insert(pair
- 192. Пример – подсчет частоты встречаемости символов #include #include #include #include using namespace std; void main() {
- 193. Классы std::unordered_map и std::unordered_multimap Ассоциативный контейнер, хранящий пары «ключ» - «значение» Элементы хранятся не отсортированы никоим
- 194. #include #include #include using namespace std; enum class Gender { Male, Female, }; string GenderToString(Gender gender)
- 195. #include #include #include using namespace std; struct Point { int x; int y; }; // Структура
- 196. void main() { // отображение Point в string, позволяющее узнать название // объекта на картинке в
- 197. Классы множеств std::set и std::multiset Ассоциативный контейнер, хранящий множество элементов определенного типа set – дублирование элементов
- 198. Пример #include #include #include using namespace std; int main(int argc, char *argv[]) { set primeNumbers; primeNumbers.insert(2);
- 199. Итераторы Итератор – объект, позволяющий программисту осуществлять перебор элементов контейнера вне зависимости от деталей его реализации
- 200. Алгоритмы Обобщенные функции, реализующие типичные алгоритмы над элементами контейнеров Сортировка, поиск, поэлементная обработка Алгоритмы в STL
- 201. #include #include int main() { int array[5] = {3, 5, 1, 7, 9}; // Сортируем масссив
- 202. #include #include #include struct Student { std::string name; int age; }; bool CompareStudentsByAge(Student const& s1, Student
- 203. Пример #include #include #include #include using namespace std; int main(int argc, char *argv[]) { vector names;
- 204. #include #include #include using namespace std; bool IsEven(int value) { return (value % 2) == 0;
- 205. #include #include #include void SearchingForRabbit() { string animals[] = { "fox", "wolf", "snake", "turtle", "bear", "rabbit",
- 206. #include #include #include using namespace std; struct Person { string name; int age; }; void TestWhetherThereIsAtLeastOneAdult()
- 207. Контейнеры STL и умные указатели Контейнеры STL автоматически освобождают занимаемую своими элементами память std::vector – рекомендуемая
- 210. Скачать презентацию