C++


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

hello.cpp

``cpp #include <iostream

int main() { std::cout « “Привет, читы\n”; return 0; }


Компиляция и запуск

``Основной сценарий
$ g++ hello.cpp -o hello
$ ./hello
Шпаргалки по Hello

Переменные

``cpp int number = 5; // Целое число float f = 0.95; // Плавающее число double PI = 3.14159; // Плавающее число char yes = ‘Y’; // Символ std::string s = “ME”; // Строка (текст) bool isRight = true; // Булево

// Константы const float RATE = 0.8;


----

``cpp
int age {25}; // С C++11
std::cout << age; // Вывести 25

Примитивные типы данных

Тип данных Размер Диапазон
int 4 байта -2^31^ ^to^ 2^31^-1
float 4 байта N/A
double 8 байт N/A
char 1 байт -128 ^to^ 127
bool 1 байт true / false
void N/A N/A
wchar_t 2 ^или^ 4 байта 1 широкий символ
{.show-header}

Пользовательский ввод

``cpp int num;

std::cout « “Введите число: “; std::cin » num;

std::cout « “Вы ввели " « num;


### Swap

``cpp
int a = 5, b = 10;
std::swap(a, b);

// Выходные данные: a=10, b=5
std::cout << "a=" << a << ", b=" << b;

Комментарии

``cpp // Одиночный однострочный комментарий на языке C++

/* Многострочный комментарий в C++ */


### Оператор If

``cpp
if (a == 10) {
    // сделайте что-нибудь
}

См: Conditionals

Циклы

``cpp for (int i = 0; i < 10; i++) { std::cout « i « “\n”; }


См: [Loops](#c-loops)

### Функции

``cpp
#include <iostream
 
void hello(); // Объявление
 
int main() { // главная функция
    hello(); // Вызов
}
 
void hello() { // Определение
    std::cout << "Hello CheatSheets!\n";
}

См: Функции

Ссылки

``cpp int i = 1; int& ri = i; // ri - это ссылка на i

ri = 2; // i теперь меняется на 2 std::cout « “i=” « i;

i = 3; // i теперь изменяется на 3 std::cout « “ri=” « ri;


`ri` и `i` ссылаются на одну и ту же ячейку памяти.

### Пространства имен

``cpp
#include <iostream
namespace ns1 {int val(){return 5;}}
int main()
{
    std::cout << ns1::val();
}

``cpp #include <iostream namespace ns1 {int val(){return 5;}} using namespace ns1; using namespace std; int main() { cout « val(); }


Пространства имен позволяют использовать глобальные идентификаторы под одним именем

Массивы в C++
------

### Декларация

``cpp
std::array<int, 3> marks; // Определение
marks[0] = 92;
marks[1] = 97;
marks[2] = 98;

// Определение и инициализация
std::array<int, 3> = {92, 97, 98};

// С пустыми членами
std::array<int, 3> marks = {92, 97};
std::cout << marks[2]; // Выходные данные: 0

Манипуляция

``cpp ┌─────┬─────┬─────┬─────┬─────┬─────┐ | 92 | 97 | 98 | 99 | 98 | 94 | └─────┴─────┴─────┴─────┴─────┴─────┘ 0 1 2 3 4 5


---

``cpp
std::array<int, 6> marks = {92, 97, 98, 99, 98, 94};

// Печать первого элемента
std::cout << marks[0];

// Изменим второй элемент на 99
marks[1] = 99;

// Принимаем ввод от пользователя
std::cin >> marks[2];

Отображение

``cpp char ref[5] = {‘R’, ’e’, ‘f’};

// Цикл для работы с диапазонами for (const int &n : ref) { std::cout « std::string(1, n); }

// Традиционный цикл for for (int i = 0; i < sizeof(ref); ++i) { std::cout « ref[i]; }


### Многомерность

``cpp
     j0 j1 j2 j3 j4 j5
   ┌────┬────┬────┬────┬────┬────┐
i0 | 1 | 2 | 3 | 4 | 5 | 6 |
   ├────┼────┼────┼────┼────┼────┤
i1 | 6 | 5 | 4 | 3 | 2 | 1 |
   └────┴────┴────┴────┴────┴────┘

``cpp int x[2][6] = { {1,2,3,4,5,6}, {6,5,4,3,2,1} }; for (int i = 0; i < 2; ++i) { for (int j = 0; j < 6; ++j) { std::cout « x[i][j] « " “; } } // Выходные данные: 1 2 3 4 5 6 6 5 4 3 2 1


Условия в C++
------------

### Клаузула If

``cpp
if (a == 10) {
    // сделайте что-нибудь
}

``cpp int number = 16;

if (number % 2 == 0) { std::cout « “чет”; } else { std::cout « “odd”; }

// Выходные данные: четные


### Else if Statement

``cpp
int score = 99;
if (score == 100) {
    std::cout << "Superb";
}
else if (score >= 90) {
    std::cout << "Отлично";
}
else if (score >= 80) {
    std::cout << "Очень хорошо";
}
else if (score >= 70) {
    std::cout << "Хорошо";
}
else if (score >= 60)
    { std::cout << "OK";
else
    std::cout << "Что?";

Операторы

Реляционные операторы

a == b a равно b
a != b a НЕ равно b
a < b a меньше b
a > b a больше b
a <= b a меньше или равно b
a >= b a больше или равно b

Операторы присваивания

Пример Эквивалентно
a += b Aka a = a + b
a -= b Aka a = a - b
a *= b Aka a = a * b
a /= b Aka a = a / b
a %= b Aka a = a % b

Логические операторы

Пример Значение
exp1 && exp2 Оба истинны (AND)
`exp1
!exp exp является ложным (NOT)

Побитовые операторы

Оператор Описание
a & b Двоичное И
`a b`
a ^ b Двоичное XOR
~ a
a << b
a >> b Двоичный сдвиг вправо

Тернарный оператор

           ┌──── True ──┐
Результат = Условие ? Exp1 : Exp2;
           └───── False ─────┘

``cpp int x = 3, y = 5, max; max = (x > y) ? x : y;

// Выходные данные: 5 std::cout « max « std::endl;


---

``cpp
int x = 3, y = 5, max;
if (x > y) {
    max = x;
} else {
    max = y;
}
// Выходные данные: 5
std::cout << max << std::endl;

Переключающее утверждение

``cpp int num = 2; switch (num) { case 0: std::cout « “Ноль”; break; case 1: std::cout « “Один”; break; case 2: std::cout « “Два”; break; case 3: std::cout « “Три”; break; default: std::cout « “Что?”; break; }


Циклы C++
------------

### While

``cpp
int i = 0;
while (i < 6) {
    std::cout << i++;
}

// Выходные данные: 012345

Do-while

``cpp int i = 1; do { std::cout « i++; } while (i <= 5);

// Выходные данные: 12345


### Продолжение утверждений

``cpp
for (int i = 0; i < 10; i++) {
    if (i % 2 == 0) {
        continue;
    }
    std::cout << i;
} // Выходные данные: 13579

Бесконечный цикл

``cpp while (true) { // true или 1 std::cout « “бесконечный цикл”; }


---

``cpp
for (;;) {
    std::cout << "бесконечный цикл";
}

``cpp for(int i = 1; i > 0; i++) { std::cout « “бесконечный цикл”; }


### for_each (с C++11)

```cpp
#include <iostream

int main()
{
    auto print = [](int num) { std::cout << num << std::endl; }

    std::array<int, 4> arr = {1, 2, 3, 4};
    std::for_each(arr.begin(), arr.end(), print);
    return 0;
}

Range-based (Since C++11)

``cpp for (int n : {1, 2, 3, 4, 5}) { std::cout « n « " “; } // Выходные данные: 1 2 3 4 5


---

``cpp
std::string hello = "CheatSheets.zip";
for (char c: hello)
{
    std::cout << c << " ";
}
// Выходные данные: Q u i c k R e f . M E

Прерывание утверждений

``cpp int password, times = 0; while (password != 1234) { if (times++ >= 3) { std::cout « “Заблокировано!\n”; break; } std::cout « “Пароль: “; std::cin » password; // input }


### Несколько вариантов

``cpp
for (int i = 0, j = 2; i < 3; i++, j--){
    std::cout << "i=" << i << ",";
    std::cout << "j=" << j << ";";
}
// Выходные данные: i=0,j=2;i=1,j=1;i=2,j=0;

Функции C++

Аргументы и возвраты

``cpp #include <iostream

int add(int a, int b) { return a + b; }

int main() { std::cout « add(10, 20); }


``add`` - это функция, принимающая 2 инта и возвращающая int

### Перегрузка

``cpp
void fun(string a, string b) {
    std::cout << a + " " + b;
}
void fun(string a) {
    std::cout << a;
}
void fun(int a) {
    std::cout << a;
}

Встроенные функции

``cpp #include #include // импорт библиотеки

int main() { // sqrt() из cmath std::cout « sqrt(9); }


Классы и объекты C++ {.cols-2}
-----------------

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

``cpp
класс MyClass {
  public:             // Спецификатор доступа
    int myNum; // Атрибут (переменная int)
    string myString; // Атрибут (строковая переменная)
};

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

``cpp MyClass myObj; // Создание объекта MyClass

myObj.myNum = 15; // Устанавливаем значение myNum равным 15 myObj.myString = “Hello”; // Установить значение myString равным “Hello”

cout « myObj.myNum « endl; // Вывести значение 15 cout « myObj.myString « endl; // Выводим “Hello”


### Конструкторы

``cpp
класс MyClass {
  public:
    int myNum;
    string myString;
    MyClass() { // Конструктор
      myNum = 0;
      myString = "";
    }
};

MyClass myObj; // Создание объекта MyClass

cout << myObj.myNum << endl; // Выводим 0
cout << myObj.myString << endl; // Вывод ""

Деструкторы

``cpp класс MyClass { public: int myNum; string myString; MyClass() { // Конструктор myNum = 0; myString = “”; } ~MyClass() { // Деструктор cout « “Объект уничтожен”. « endl; } };

MyClass myObj; // Создание объекта MyClass

// Код здесь…

// Объект уничтожается автоматически при выходе программы из области видимости



### Методы класса

``cpp
класс MyClass {
  public:
    int myNum;
    string myString;
    void myMethod() { // Метод/функция, определенная внутри класса
      cout << "Hello World!" << endl;
    }
};

MyClass myObj; // Создаем объект MyClass
myObj.myMethod(); // Вызов метода

Модификаторы доступа

``cpp класс MyClass { public: // Спецификатор доступа public int x; // Публичный атрибут private: // Спецификатор частного доступа int y; // Частный атрибут protected: // Спецификатор защищенного доступа int z; // Защищенный атрибут };

MyClass myObj; myObj.x = 25; // Разрешено (public) myObj.y = 50; // Не разрешено (private) myObj.z = 75; // Не разрешено (protected)



### Геттеры и сеттеры

``cpp
класс MyClass {
  private:
    int myNum;
  public:
    void setMyNum(int num) { // Setter
      myNum = num;
    }
    int getMyNum() { // Getter
      return myNum;
    }
};

MyClass myObj;
myObj.setMyNum(15); // Устанавливаем значение myNum равным 15
cout << myObj.getMyNum() << endl; // Выводим значение 15

Наследование

``cpp класс Vehicle { public: string brand = “Ford”; void honk() { cout « “Туут, туут!” « endl; } };

class Car : public Vehicle { public: string model = “Mustang”; };

Car myCar; myCar.honk(); // Вывод “Туут, туут!”. cout « myCar.brand + " " + myCar.model « endl; // Вывод “Ford Mustang”




Препроцессор C++
------------

### Препроцессор {.row-span-3}

- [if](https://en.cppreference.com/w/cpp/preprocessor/conditional)
- [elif](https://en.cppreference.com/w/cpp/preprocessor/conditional)
- [else](https://en.cppreference.com/w/cpp/preprocessor/conditional)
- [endif](https://en.cppreference.com/w/cpp/preprocessor/conditional)
- [ifdef](https://en.cppreference.com/w/cpp/preprocessor/conditional)
- [ifndef](https://en.cppreference.com/w/cpp/preprocessor/conditional)
- [define](https://en.cppreference.com/w/cpp/preprocessor/replace)
- [undef](https://en.cppreference.com/w/cpp/preprocessor/replace)
- [include](https://en.cppreference.com/w/cpp/preprocessor/include)
- [line](https://en.cppreference.com/w/cpp/preprocessor/line)
- [error](https://en.cppreference.com/w/cpp/preprocessor/error)
- [pragma](https://en.cppreference.com/w/cpp/preprocessor/impl)
- [defined](https://en.cppreference.com/w/cpp/preprocessor/conditional)
- [__has_include](https://en.cppreference.com/w/cpp/feature_test)
- [__has_cpp_attribute](https://en.cppreference.com/w/cpp/feature_test)
- [export](https://en.cppreference.com/w/cpp/keyword/export)
- [import](https://en.cppreference.com/mwiki/index.php?title=cpp/keyword/import&amp;action=edit&amp;redlink=1)
- [module](https://en.cppreference.com/mwiki/index.php?title=cpp/keyword/module&amp;action=edit&amp;redlink=1)
{.marker-none .cols-2}

### Включает

``cpp
#include "iostream"
#include <iostream>

Определяет

``cpp #define FOO #define FOO “hello”

#undef FOO


### Если {.row-span-2}

``cpp
#ifdef DEBUG
  console.log('hi');
#elif defined VERBOSE
  ...
#else
  ...
#endif

Ошибка

``cpp #if VERSION == 2.0 #error Не поддерживается #warning Не поддерживается #endif


### Макрос

``cpp
#define DEG(x) ((x) * 57.29)

Конкатенация токенов

``cpp #define DST(name) name##_s name##_t DST(object); #=> object_s object_t;


### Стрингизация

``cpp
#define STR(name) #name
char * a = STR(object); #=> char * a = "object";

файл и строка

``cpp #define LOG(msg) console.log(FILE, LINE, msg) #=> console.log(“file.txt”, 3, “hey”)


Разное
-------------

### Escape Sequences

| Последовательности экранирования | Символы |
|------------------|-----------------------|
| `\b` | Backspace |
| `\f` | Форма подачи |
| `\n` | Новая строка |
| `\r` | Возврат |
| `\t` | Горизонтальная вкладка |
| `\v` | Вертикальная табуляция |
| `\\\` | Обратная косая черта |
| | `\'` | Одинарная кавычка |
| | `\"` | Двойная кавычка |
| `\?` | Вопросительный знак |
| `\0` | Нулевой символ |

### Ключевые слова {.col-span-2 .row-span-2}

- [alignas](https://en.cppreference.com/w/cpp/keyword/alignas)
- [alignof](https://en.cppreference.com/w/cpp/keyword/alignof)
- [and](https://en.cppreference.com/w/cpp/keyword/and)
- [and_eq](https://en.cppreference.com/w/cpp/keyword/and_eq)
- [asm](https://en.cppreference.com/w/cpp/keyword/asm)
- [atomic_cancel](https://en.cppreference.com/w/cpp/keyword/atomic_cancel)
- [atomic_commit](https://en.cppreference.com/w/cpp/keyword/atomic_commit)
- [atomic_noexcept](https://en.cppreference.com/w/cpp/keyword/atomic_noexcept)
- [auto](https://en.cppreference.com/w/cpp/keyword/auto)
- [bitand](https://en.cppreference.com/w/cpp/keyword/bitand)
- [bitor](https://en.cppreference.com/w/cpp/keyword/bitor)
- [bool](https://en.cppreference.com/w/cpp/keyword/bool)
- [break](https://en.cppreference.com/w/cpp/keyword/break)
- [case](https://en.cppreference.com/w/cpp/keyword/case)
- [catch](https://en.cppreference.com/w/cpp/keyword/catch)
- [char](https://en.cppreference.com/w/cpp/keyword/char)
- [char8_t](https://en.cppreference.com/w/cpp/keyword/char8_t)
- [char16_t](https://en.cppreference.com/w/cpp/keyword/char16_t)
- [char32_t](https://en.cppreference.com/w/cpp/keyword/char32_t)
- [class](https://en.cppreference.com/w/cpp/keyword/class)
- [compl](https://en.cppreference.com/w/cpp/keyword/compl)
- [concept](https://en.cppreference.com/w/cpp/keyword/concept)
- [const](https://en.cppreference.com/w/cpp/keyword/const)
- [consteval](https://en.cppreference.com/w/cpp/keyword/consteval)
- [constexpr](https://en.cppreference.com/w/cpp/keyword/constexpr)
- [constinit](https://en.cppreference.com/w/cpp/keyword/constinit)
- [const_cast](https://en.cppreference.com/w/cpp/keyword/const_cast)
- [continue](https://en.cppreference.com/w/cpp/keyword/continue)
- [co_await](https://en.cppreference.com/w/cpp/keyword/co_await)
- [co_return](https://en.cppreference.com/w/cpp/keyword/co_return)
- [co_yield](https://en.cppreference.com/w/cpp/keyword/co_yield)
- [decltype](https://en.cppreference.com/w/cpp/keyword/decltype)
- [default](https://en.cppreference.com/w/cpp/keyword/default)
- [delete](https://en.cppreference.com/w/cpp/keyword/delete)
- [do](https://en.cppreference.com/w/cpp/keyword/do)
- [double](https://en.cppreference.com/w/cpp/keyword/double)
- [dynamic_cast](https://en.cppreference.com/w/cpp/keyword/dynamic_cast)
- [else](https://en.cppreference.com/w/cpp/keyword/else)
- [enum](https://en.cppreference.com/w/cpp/keyword/enum)
- [explicit](https://en.cppreference.com/w/cpp/keyword/explicit)
- [export](https://en.cppreference.com/w/cpp/keyword/export)
- [extern](https://en.cppreference.com/w/cpp/keyword/extern)
- [false](https://en.cppreference.com/w/cpp/keyword/false)
- [float](https://en.cppreference.com/w/cpp/keyword/float)
- [for](https://en.cppreference.com/w/cpp/keyword/for)
- [friend](https://en.cppreference.com/w/cpp/keyword/friend)
- [goto](https://en.cppreference.com/w/cpp/keyword/goto)
- [if](https://en.cppreference.com/w/cpp/keyword/if)
- [inline](https://en.cppreference.com/w/cpp/keyword/inline)
- [int](https://en.cppreference.com/w/cpp/keyword/int)
- [long](https://en.cppreference.com/w/cpp/keyword/long)
- [mutable](https://en.cppreference.com/w/cpp/keyword/mutable)
- [namespace](https://en.cppreference.com/w/cpp/keyword/namespace)
- [new](https://en.cppreference.com/w/cpp/keyword/new)
- [noexcept](https://en.cppreference.com/w/cpp/keyword/noexcept)
- [not](https://en.cppreference.com/w/cpp/keyword/not)
- [not_eq](https://en.cppreference.com/w/cpp/keyword/not_eq)
- [nullptr](https://en.cppreference.com/w/cpp/keyword/nullptr)
- [operator](https://en.cppreference.com/w/cpp/keyword/operator)
- [or](https://en.cppreference.com/w/cpp/keyword/or)
- [or_eq](https://en.cppreference.com/w/cpp/keyword/or_eq)
- [private](https://en.cppreference.com/w/cpp/keyword/private)
- [protected](https://en.cppreference.com/w/cpp/keyword/protected)
- [public](https://en.cppreference.com/w/cpp/keyword/public)
- [reflexpr](https://en.cppreference.com/w/cpp/keyword/reflexpr)
- [register](https://en.cppreference.com/w/cpp/keyword/register)
- [reinterpret_cast](https://en.cppreference.com/w/cpp/keyword/reinterpret_cast)
- [requires](https://en.cppreference.com/w/cpp/keyword/requires)
- [return](https://en.cppreference.com/w/cpp/language/return)
- [short](https://en.cppreference.com/w/cpp/keyword/short)
- [signed](https://en.cppreference.com/w/cpp/keyword/signed)
- [sizeof](https://en.cppreference.com/w/cpp/keyword/sizeof)
- [static](https://en.cppreference.com/w/cpp/keyword/static)
- [static_assert](https://en.cppreference.com/w/cpp/keyword/static_assert)
- [static_cast](https://en.cppreference.com/w/cpp/keyword/static_cast)
- [struct](https://en.cppreference.com/w/cpp/keyword/struct)
- [switch](https://en.cppreference.com/w/cpp/keyword/switch)
- [synchronized](https://en.cppreference.com/w/cpp/keyword/synchronized)
- [template](https://en.cppreference.com/w/cpp/keyword/template)
- [this](https://en.cppreference.com/w/cpp/keyword/this)
- [thread_local](https://en.cppreference.com/w/cpp/keyword/thread_local)
- [throw](https://en.cppreference.com/w/cpp/keyword/throw)
- [true](https://en.cppreference.com/w/cpp/keyword/true)
- [try](https://en.cppreference.com/w/cpp/keyword/try)
- [typedef](https://en.cppreference.com/w/cpp/keyword/typedef)
- [typeid](https://en.cppreference.com/w/cpp/keyword/typeid)
- [typename](https://en.cppreference.com/w/cpp/keyword/typename)
- [union](https://en.cppreference.com/w/cpp/keyword/union)
- [unsigned](https://en.cppreference.com/w/cpp/keyword/unsigned)
- [using](https://en.cppreference.com/w/cpp/keyword/using)
- [virtual](https://en.cppreference.com/w/cpp/keyword/virtual)
- [void](https://en.cppreference.com/w/cpp/keyword/void)
- [volatile](https://en.cppreference.com/w/cpp/keyword/volatile)
- [wchar_t](https://en.cppreference.com/w/cpp/keyword/wchar_t)
- [while](https://en.cppreference.com/w/cpp/keyword/while)
- [xor](https://en.cppreference.com/w/cpp/keyword/xor)
- [xor_eq](https://en.cppreference.com/w/cpp/keyword/xor_eq)
- [final](https://en.cppreference.com/w/cpp/language/final)
- [override](https://en.cppreference.com/w/cpp/language/override)
- [transaction_safe](https://en.cppreference.com/w/cpp/language/transactional_memory)
- [transaction_safe_dynamic](https://en.cppreference.com/w/cpp/language/transactional_memory)
{.marker-none .cols-5}

### Препроцессор

- [if](https://en.cppreference.com/w/cpp/preprocessor/conditional)
- [elif](https://en.cppreference.com/w/cpp/preprocessor/conditional)
- [else](https://en.cppreference.com/w/cpp/preprocessor/conditional)
- [endif](https://en.cppreference.com/w/cpp/preprocessor/conditional)
- [ifdef](https://en.cppreference.com/w/cpp/preprocessor/conditional)
- [ifndef](https://en.cppreference.com/w/cpp/preprocessor/conditional)
- [define](https://en.cppreference.com/w/cpp/preprocessor/replace)
- [undef](https://en.cppreference.com/w/cpp/preprocessor/replace)
- [include](https://en.cppreference.com/w/cpp/preprocessor/include)
- [line](https://en.cppreference.com/w/cpp/preprocessor/line)
- [error](https://en.cppreference.com/w/cpp/preprocessor/error)
- [pragma](https://en.cppreference.com/w/cpp/preprocessor/impl)
- [defined](https://en.cppreference.com/w/cpp/preprocessor/conditional)
- [__has_include](https://en.cppreference.com/w/cpp/feature_test)
- [__has_cpp_attribute](https://en.cppreference.com/w/cpp/feature_test)
- [export](https://en.cppreference.com/w/cpp/keyword/export)
- [import](https://en.cppreference.com/mwiki/index.php?title=cpp/keyword/import&amp;action=edit&amp;redlink=1)
- [module](https://en.cppreference.com/mwiki/index.php?title=cpp/keyword/module&amp;action=edit&amp;redlink=1)
{.marker-none .cols-2}

## Также см.

- [C++ Infographics & Cheat Sheets](https://hackingcpp.com/cpp/cheat_sheets.html) _(hackingcpp.com)_

- [C++ reference](https://en.cppreference.com/w/) _(cppreference.com)_
- [C++ Language Tutorials](http://www.cplusplus.com/doc/tutorial/) _(cplusplus.com)_