Advertisement
Alex_St

Untitled

Jan 16th, 2023
39
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 32.27 KB | None | 0 0
  1. Препроцессор
  2.                             // Комментарий до конца строки
  3.                             /* Многострочный комментарий */
  4. #include  <stdio.h>         // Вставить содержимое заголовка, поиск по стандартным путям заголовков  
  5. #include "myfile.h"         // Вставить содержимое заголовка, поиск начиная с текущего каталога
  6. #define X some text         // Замена X на some text
  7. #define F(a, b) a + b       // Замена F(1, 2) на 1 + 2
  8. #define X \
  9.  some text                  // Многострочное определение макроса
  10. #undef X                    // Удаляет определение макроса
  11. #if defined(X)              // Условная компиляция (#ifdef X)
  12. #else                       // Опциональная ветвь else (эквивалент #ifndef X или #if !defined(X))
  13. #endif                      // Завершает блоки #if, #ifdef
  14.  
  15. Литералы и переменные
  16. 255, 0377, 0xff, 0b1011     // Целые числа (десятичные, восьмиричные, шестнадцатиричные, двоичные)
  17. 2147483647L, 0x7fffffffl    // Целые числа long (64bit на 64-битных UNIX платформах, 32bit на остальных)
  18. 123.0, 1.23e2               // Действительные числа двойной точности (double)
  19. 'a', '\141', '\x61'         // Символы (литеральный, восьмиричный код, шестнадцатиричный код)
  20. '\n', '\\', '\'', '\"'      // Литералы символа переноса строки, обратного слеша, одинарной кавычки, двойной кавычки
  21. "string\n"                  // Массив символов, завершённый переносом строки и нулевым символом \0
  22. "hello" "world"             // Конкатенация двух литералов
  23. true, false                 // Булевы константы ИСТИНА и ЛОЖЬ
  24. nullptr                     // Литерал указателя, указывает на нулевой (недопустимый) адрес
  25. Объявления
  26. int x;                      // Объявление переменной x типа int, т.е. целого числа (значение не определено)
  27. int x = 255;                // Объявление переменной и инициализация значением 255
  28. unsigned ing x = 255u;      // Объявление переменной типа беззнаковое целое число, инициализация значением 255.
  29. char c = 'a';               // Объявление переменной, хранящей символ (однобайтовый, знаковый или беззнаковый)
  30. unsigned char u = 255;      // Объявление переменной типа "беззнаковый символ"
  31. signed char s = -1;         // Объявление переменной типа "знаковый символ"
  32. float f;                    // Знаковое действительное число одинарной точности (обычно 4 байта)
  33. double f;                   // Знаковое действительное число двойной точности (обычно 8 байт)
  34. bool b = true;              // Булевы переменные инициализируются значением true либо false
  35. int a[10];                  // Массив из 10 целых числе (индексация начиная с нуля, от a[0] до a[9])
  36. int a[] = { 0, 1, 2 };      // Инициализированный массив (эвивалентно a[3] = { 0, 1, 2 };)
  37. int a[2][2] = { { 1, 2 },    // Двумерный массив, т.е. массив массивов целых чисел
  38.                 { 4, 5 } };
  39. char str[] = "hello";       // Строка в стиле языка C (6 элементов, включая '\0' в конце)
  40. std::string str = "Hello"   // Строка в стиле C++, инициализированная значением "Hello"
  41. std::string str = R"(Hello
  42. World)";                    // Строка в стиле C++, инициализированная значением "Hello\nWorld"
  43. int* ptr = nullptr;         // ptr - указатель на адрес в памяти, предназначенный для хранения int
  44. const char* str = "hello";  // str указывает на анонимный массив, хранящий значение "hello\0"
  45. void* ptr = nullptr;        // ptr хранит адрес нетипизированной области памяти
  46. int& ref = x;               // ref - ссылка на int x (по сути синоним x)
  47.  
  48. enum Weekend                // Weekend - это тип, способный хранить WK_SATURDAY или WK_SUNDAY
  49. {
  50.     WK_SATURDAY,
  51.     WK_SUNDAY,
  52. };
  53. Weekend day;                // day - переменная типа weekend
  54. enum Weekend                // На уровне ассембера тип Weekend представлен целым числом,
  55. {                           // Здесь для WK_SATURDAY и WK_SUNDAY явно назначаем значения 0 и 1
  56.     WK_SATURDAY = 0,
  57.     WK_SUNDAY = 1,
  58. };
  59. enum class Color            // Современный enum: константы не попадают в глобальную область видимости,
  60. {                           //  обращаться к ним можно конструкциями Color::Red и Color::Blue.
  61.     Red,
  62.     Blue,
  63. };
  64. Color color = Color::Red;   // Объявляем переменную типа color, инициализируем значением Color::Red.
  65.  
  66. typedef char* ZeroedString; // Устаревшее добавление синонима типа: объявить `ZeroedString x;` значит объявить `char* x;`.
  67. using ZeroedString = char*; // Современное добавление синонима типа.
  68.  
  69. const int c = 3;            // Константные значения инициализируются один раз и не могут быть повторно присвоены.
  70. const int pow = GetPower(); // Инициализация константы может быть динамической.
  71. const int* ptr = arr;       // Нельзя записывать значения в память, на которую указывает ptr (т.е. в элементы arr).
  72. int* const ptr = arr;       // Нельзя менять значение указателя ptr (но можно записывать в память, куда он указывает)
  73. const int* const ptr = arr; // Как ptr, так и память, на которую он указывает, недоступны для записи.
  74. const int& cref = x;        // cref не получится использовать для изменения x
  75. int8_t, uint8_t, int16_t,   // Целые числа с фиксированным числом бит, не зависящим от платформы.
  76. uint16_t, int32_t, uint32_t,
  77. int64_t, uint64_t
  78.  
  79. auto it = m.begin();        // Объявляем переменную it, тип выставляется автоматически как тип инициализатора m.begin()
  80. auto const param            // Объявляем переменную param, тип выставляется автоматически, но будет константным.
  81.     = config["param"];
  82. auto& instance              // Объявляем переменную instance, тип выставляется автоматически, но будет ссылочным
  83.     = singleton::instance();
  84. Классы памяти
  85. int x;                      // Память для x выделяется автоматически (обычно на стеке) и существует только в области видимости.
  86. static int x;               // Память для x выделяется в глобальной области (даже если x объявлена внутри функции).
  87. extern int x;               // Переменная x объявлена, но её расположение в памяти будет указано в другом месте.
  88. Инструкции
  89. x = y;                      // Любое невложенное выражение (включая вызов функции, присваивание) является инструкцией.
  90. int x = 0;                  // Объявления являются инструкциями.
  91. ;                           // Пустая инструкция.
  92. {                           // Блок внутри {} является одной инструкцией
  93.   int x;                    //  Области видимости x - от объявления до конца блока.
  94. }
  95.  
  96. if (x) a;                   // Если значение x - ИСТИНА (не 0), то выполнить инструкцию print('a');
  97. else if (y) print('b');     // Если не x и y, выполняем print('b'), else if необязателен, его можно повторять;
  98. else print('c');            // Если не x и не y, выполняем print('c') else необязателен.
  99.  
  100. while (x)                   // Повторяем 0 или более раз, пока выражение x имеет значение ИСТИНА
  101.     print(x);
  102.  
  103. for (int i = 0; i < 10; ++i)// Эквивалентно `int i = 0; while (i < 10) { doSomething(); ++i; }`
  104.     doSomething();            
  105.  
  106. int arr[] = { 5, 10, 20 };
  107. for (auto x : arr)          // Range-based цикл for, x последовательно принимает все значения элементов arr.
  108.     print(x);
  109.  
  110. do                          // Эквивалентно цепочке `foo(); while(x) foo()`;
  111. {
  112.     foo();
  113. } while (x);
  114.  
  115. switch (x)                  // Switch выполнит прыжок на один из case/default
  116. {                           //  x должен быть целочисленным типом (enum допускается, строки - нет)
  117.     case X1: a;             // Если x == X1 (X1 должно быть константой времени компиляции), продолжаем выполнение отсюда
  118.     case X2: b;             // Иначе если x == X2, продолжаем выполнение отсюда
  119.     default: c;             // В противном случае продолжаем выполнение отсюда (метка default опциональная)
  120. }
  121.  
  122. switch (x)
  123. {
  124.     case X1:
  125.         a;
  126.         break;              // break прерывает выполнение после метки до конца switch,
  127.     default:                //  если break нет, то после a будет продолжено выполнени и выполнено c, в отличии от инструкции if
  128.         c;
  129. }
  130.  
  131. break;                      // Выход из ветвления switch либо из цикла while, do, или for
  132. continue;                   // Прыжок в конец цикла while, do или for
  133. return x;                   // Завершает выполнение функции, возвращает значение x
  134.  
  135. try
  136. {
  137.     a;    
  138. }
  139. catch (const ExceptionType &ex)
  140. {
  141.     b;                      // Если a; бросает исключение типа ExceptionType, выполнение продолжается здесь
  142. }
  143. catch (...)
  144. {
  145.     c;                      // Если a; бросает какое-либо другое исключение, выполнение продолжается здесь
  146. }
  147. Функции
  148. int sum(int a, int b);      // Объявление функции sum, принимающей два параметра int и возвращающей int
  149. void fn();                  // fn - это процедура без параметров (псевдо-тип void означает, что возвращаемого значения нет)
  150. void fn(int a = 12);        // можно написать fn(), и это будет эквивалентно f(12), т.е. параметр имеет значение по умолчанию
  151.  
  152. int sum(int a, int b)       // Определение функции sum: тело функции станет её реализацией.
  153. {
  154.     statements;
  155. }
  156.  
  157. T operator+(T x, T y)       // В выражении вида "a + b", где a, b имеют тип T, вызывается тело функции operator+(a, b)
  158. {
  159.     // Реализация оператора...
  160. }
  161.  
  162. T operator-(T x);           // Унарный оператор "минус", вызывается в выражениях вида "-a"
  163.  
  164. T operator++();             // Префиксная форма оператора a++ или a--
  165.  
  166. T operator++(int);          // Постфиксная форма оператора a++ или a-- (параметр типа int игнорируется)
  167.  
  168. extern "C"                  // Все функции, объявленные внутри блока extern "C", не будут подвержены name mangling.
  169. {                           // Это полезно, если функции могут быть вызваны из другого языка (например, из C).
  170.     void fn();
  171. }
  172. Типы параметров и возвращаемого значения функции могут быть любыми. Функция должна быть либо объявлена (без тела), либо определена (с телом функции) до первого вызова. Можно сначала объявить функцию (и вызвать где-либо), а затем определить (возможно, в другом файле). Каждая программа состоит набора файлов, каждый файл содержит набор глобальных переменных и набор функций. Одна из функций — main — служит точной входа в программу.
  173. int main()
  174. {
  175.     statements...
  176. }
  177.  
  178. int main(int argc, char* argv[])
  179. {
  180.     statements...
  181. }
  182. • argv является массивом длины argc, хранящим строки параметров командной строки
  183. • по общему соглашению, main возвращает 0 при успешном выполнении программы, ненулевой код после возникновения ошибки
  184. Функции с различными параметрами могут иметь одинаковое имя (это называется перегрузка функций).
  185. Могут быть перегружены все операторы, кроме “::”, “.”, “.*”, “?:”. Перегрузка не меняет приоритет оператора.
  186. Выражения
  187. Операторы сгруппированы по приоритету, сперва наивысший приоритет. Унарные операторы и присваивание вычисляются справа налево, все остальные слева направо. Во время выполнения программы не происходит проверок на выход за границы массива, на недопустимые указатели и т.п.
  188. T::X                        // Доступ к символу X, объявленному в классе T
  189. N::X                        // Доступ к символу X, объявленному в пространстве имён N
  190. ::X                         // Доступ к глобальному имени X (может помочь избежать конфликтов имён)
  191.  
  192. t.x                         // Поле или метод объекта t (структуры или класса)
  193. ptr->x                      // Поле или метод того объекта (структуры или класса), на который указывает ptr
  194. arr[i]                      // i-й элемент массива arr
  195. fn(x, y)                    // Вызов функции fn с аргументами x и y
  196. T(x, y)                     // Конструирование объекта класса T, в конструктор передаются значения x и y
  197. x++                         // Увеличивает x на единицу, но возвращает старое значение (постфиксная форма)
  198. x--                         // Вычитает единицу из x, но возвращает старое значение (постфиксная форма)
  199. typeid(x)                   // Вычисляет значение типа std::type_info для объекта x
  200. typeid(T)                   // Вычисляет (обычно при компиляции) значение типа std::type_info для типа T
  201. dynamic_cast<T>(x)          // Приводит x к типу T во время выполнения, выполняет проверку с помощью
  202.                             //  информации о виртуальных методах объекта.
  203. static_cast<T>(x)           // Приводит x к типу T без каких-либо проверок
  204. reinterpret_cast<T>(x)      // Интерпретирует байты объекта x как байты объекта типа T
  205. const_cast<T>(x)            // Конвертирует x к типу T, убирая модификаторы const и volatile
  206.  
  207. sizeof x                    // Вычисляет число байт, используемое для хранения объекта x
  208. sizeof(T)                   // Вычисляет число байт, используемое для хранения типа T
  209. ++x                         // Увеличивает x на единицу, возвращает новое значение (префиксная форма)
  210. --x                         // Вычитает единицу из x, возвращает новое значение (префиксная форма)
  211. ~x                          // Битовая операция: вычисляет битовое дополнение x
  212. !x                          // Возвращает true если x имеет значение ЛОЖЬ или 0, иначе false
  213. -x                          // Унарный минус
  214. +x                          // Унарный плюс
  215. &x                          // Вычисление адреса x
  216. *ptr                        // Доступ к памяти, на которую указывает ptr (т.е. разыменование, *&x эквивалентно x)
  217. new T                       // Выделяет память для объекта типа T, возвращает его адрес
  218. new T(x, y)                 // Выделяет память для объекта типа T, в конструктор передаёт x, y, возвращает адрес
  219. new T[n]                    // Выделяет память для массива из n элементов типа T
  220. delete ptr                  // Удаляет объект, на который указывает ptr, возвращает системе занятую им память
  221. delete[] ptr                // Удаляет массив объектов, на которые указывает ptr
  222. (T) x                       // Преобразует x к типу T (устаревшая форма, используйте static_cast или в крайнем случае reinterpret_case)
  223.  
  224. x * y                       // Умножение
  225. x / y                       // Деление (для целых чисел происходит отбрасывание дробной части)
  226. x % y                       // Получение остатка (знак результата совпадает со знаком x)
  227. x + y                       // Сложение целых чисел либо целочисленного смещения и указателя
  228.                             //  (для указателей эквивалентно выражению &x[y])
  229. x - y                       // Вычитание целых чисел либо получение смещения от указателя y к указателю x
  230. x << y                      // Битовая операция: смещение x на y бит влево, эквивалентно x * pow(2, y)
  231. x >> y                      // Битовая операция: смещение x на y бит вправо, эквивалентно x / pow(2, y)
  232.  
  233. x < y                       // ИСТИНА, если x меньше чем y
  234. x <= y                      // ИСТИНА, если x меньше или равен y
  235. x > y                       // ИСТИНА, если x больше чем y
  236. x >= y                      // ИСТИНА, если x больше или равен y
  237.  
  238. x & y                       // Битовая операция "И": 3 & 6 равно 2
  239. x ^ y                       // Битовая операция "ИСКЛЮЧАЮЩЕЕ ИЛИ": 3 ^ 6 равно 5
  240. x | y                       // Битовая операция "ИЛИ": 3 | 6 равно 7
  241. x && y                      // Логическое "И": вычисляет x, и если x ЛОЖЬ, возвращает ЛОЖЬ, иначе
  242.                             //  вычисляет y и возвращает его булево значение (ИСТИНА или ЛОЖЬ).
  243. x || y                      // Логическое "ИЛИ": вычисляет x, и если x ИСТИНА, возвращает ИСТИНА,
  244.                             //  иначе вычисляет y и возвращает его булево значение (ИСТИНА или ЛОЖЬ).
  245. x = y                       // Присваивает значение y переменной x, возвращает новое значение x
  246. x += y                      // Эквивалент x = x + y, также существуют -= *= /= <<= >>= &= |= ^=
  247. x ? y : z                   // Тернарный оператор: возвращает y если x ИСТИНА, иначе z
  248. throw x                     // Выбрасывает исключение, а если оно не поймано, аварийно завершает программу
  249. x, y                        // Вычисляет x и y, затем возвращает y (редко используется)
  250. Анонимные функции
  251. Анонимные функции поддерживают замыкание, т.е. захват и удержание внешних переменных.
  252. auto fn1 = [] {             // Простая анонимная функция типа `void()`
  253.     /* тело функции */;
  254. };
  255. auto fn2 = [] {
  256. };
  257. static_assert(!std::is_same_v(fn1, fn2),
  258.               "Две одинаковые с виду лямбды имеют разные типы."
  259.               "Каждая лямбда принадлежит уникальному типу данных,"
  260.               "имеющему operator().");
  261.  
  262. int value1 = 10;            // Захватим value1 по значению: [value]
  263. int value2 = 10;            // Захватим value2 по ссылке: [&value2]
  264. auto fn = [value1, &value2] {
  265.     ++value1;
  266.     ++value2;
  267. };
  268. assert(value1 == 10);       // Значение не изменилось (изменялась копия)
  269. assert(value2 == 11);       // Значение изменилось
  270.  
  271. auto sum = [](int a, int b) -> int {
  272.     return a + b;
  273. };
  274. int x = sum(10, 50);        // sum принимает 2 параметра int, возвращает int
  275.  
  276. int count = 0;              // mutable означает, что захваченное
  277.                             //  по значению сохраняется между вызовами
  278. auto bump = [count]() mutable {
  279.     ++count;
  280.     printf("count: %d", count);
  281. };
  282. bump();                     // печатает 'count: 1'
  283. bump();                     // печатает 'count: 2'
  284.  
  285. auto sum = [](auto && a, auto && b) {
  286.     return a + b;           // возвращаемый тип определится автоматически
  287. };
  288. double x = sum(10.2, 40);   // sum - обобщённая анонимная функция,
  289.                             //  псевдо-тип auto служит местом
  290.                             //  для параметра любого типа
  291.  
  292. // Условие в if constexpr вычисляется при компиляции,
  293. //  это позволяет в одной обобщённой анонимной функции
  294. //  обработать разные типы данных.
  295. auto println = [](auto && value) {
  296.     if constexpr (typeid(value) == typeid(int)) {
  297.         printf("%d\n", value);
  298.     }
  299.     if constexpr (typeid(value) == typeid(std::string)) {
  300.         printf("%s\n", value.c_str());
  301.     }
  302. };
  303. Классы
  304. class T                     // Новый тип данных T
  305. {
  306. private:                    // В этой секции символы доступны только для методов класса T
  307. protected:                  // В этой секции символы доступны ещё для классов-наследников класса T
  308. public:                     // В этой секции символы доступны для всех желающих
  309.     int x;                  // Поле класса, располагается в памяти как часть объекта класса
  310.     void f();               // Метод (функция, являющаяся членом класса)
  311.     void g() { return; }    // Метод с телом, встроенным в класс
  312.     void h() const;         // Метод не сможет модифицировать какие-либо поля класса
  313.     int operator+(int y);   // t + y превращается в вызов метода-оператора t.operator+(y)
  314.     int operator-();        // -t превращается в вызов метода-оператора t.operator-()
  315.     T(): x(1) {}            // Конструктор использует списки инициализации конструктора: ": x(1)"
  316.     T(const T& t): x(t.x) {}// Конструктор копирования
  317.     T& operator=(const T& t)// Оператор присваивания
  318.     {
  319.         x = t.x;
  320.         return *this;
  321.     }
  322.     ~T();                   // Деструктор (автоматически вызываемая процедура очистки)
  323.     explicit T(int a);      // Позволяет писать t = T(3), но не t = 3
  324.     T(float x): T((int)x) {}// Делегирующий конструктор, делегирует инициализацию в T(int)
  325.     operator int() const
  326.     {return x;}             // Оператор преобразования в int, допускает код x = int(t)
  327.     static int y;           // Поле y становится единственным и глобальным для всех объектов типа T
  328.     static void l();        // Метод становится методом класса, доступен для вызова через T::l()
  329.     class Z {};             // Вложенный класс T::Z
  330.     typedef int Int;        // T::Int - синоним типа int
  331. };
  332. void T::fn()                // Тело метода fn класса T
  333. {
  334.     this->x = x;            // this - это адрес текущего объекта (здесь поле x копируется в поле x)
  335. }
  336. int T::y = 2;               // Инициализация статической переменной
  337.                             //  (должна быть вне класса для всех типов, кроме целочисленных)
  338. T::l();                     // Вызов статического метода (метода класса)
  339. T t;                        // Создание объекта t типа T с неявным вызовом конструктора T()
  340. t.f();                      // Вызов метода f объекта t
  341.  
  342. struct T {                  // Эквивалентно коду class T { public:
  343.     virtual void i();       // Реализация виртуального метода i может быть перегружена классом-наследником  
  344.     virtual void g() = 0;   // Чисто виртуальный метод, должен быть перезаписан в классе-наследнике
  345. };
  346. class U : public T          // Дочерний класс U наследует все поля и методы базового класса T
  347. {
  348. public:
  349.     void g(int) override;   // Перегрузка метода g
  350. };
  351. Все классы по умолчанию имеют конструктор копирования, оператор присваивания и деструктор, которые рекурсивно вызывают соответствующие методы для базовых классов и полей. Примитивные типы, такие как целые числа, указатели и т.п., копируются прямым копированием памяти, а их деструктор ничего не делает. Конструкторы, операторы присваивания и дееструкторы никогда не копируются. Если у класса не указан ни один конструктор, то у него есть конструктор по умолчанию без аргументов, который лишь вызывает другие конструкторы.
  352. Шаблоны
  353. template <class T>          // Функция fn будет перегружена для любых типов-аргументов
  354. T fn(T t);
  355.  
  356. template <class T>
  357. class X                     // Класс параметризуется типом T
  358. {
  359.     X(T t);                 // Конструктор принимает значение типа T
  360. };
  361.  
  362. template <class T>
  363. X<T>::X(T t)                // Определение конструктора (метода) за пределами класса
  364. {
  365. }
  366.  
  367. X<int> x(3);                // Тип объекта x - это X<int>, специализация шаблонного класса X
  368.  
  369. template <class T, class U = T, int n = 0>
  370. class A                     // Шаблон имеет типы-параметры с типами по умолчанию
  371. {
  372. };
  373. Пространства имён
  374. namespace N {class T {};}   // Помещает имя T в пространство имён N
  375. N::T t;                     // Используем имя T из пространства имён N
  376. using namespace N;          // Все символы из пространства имён N теперь доступны без префикса N::
  377. using N::T;                 // Символ N::T теперь доступен без префикса N::
  378. Отладочный механизм assert
  379. #include <cassert>          // Включаем cassert
  380. assert(cond);               // Если условие cond не выполняется, распечатать сообщение и аварийно
  381.                             //  завершить программу. В Release-конфигурациях объявлен макрос
  382.                             //  NDEBUG, который превращает assert в пустой макрос. Пустой макрос
  383.                             //  ничего не выполняет и не вычисляет выражение cond.
  384.  
  385.  
  386.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement