# 12 лекция - C++
(14.05.2022)
## Комментарии
> НЕ надо выделять 10 байт динамически
> НЕ надо читать посильвольно
> Нужно ставить ограничение на количество вводимых символов
## Плюсовые штучки
```c++
struct My
{//описывает тип, здесь нет никакого реального объекта
int x = 2; //добавляется во все конструкторы в качестве инициализации (как после :)
//например через malloc конструктор не вызывается (plasment new Для последующего выделения конструктора)
int y;
};
```
```c++
struct My
{//описывает тип, здесь нет никакого реального объекта
int x, y;
My (int a, int b) : x(a), y(b) {}
My (double b) : x (b*10), y (1) {}
explicit My (int a) : x(a), b(0) {} //не будет вызываться через =
};
My z(2, 3); //первый конструктор
My z = 4.0; //второй конструктор
//My z = 4; //Ошибка
My z(4); //третий конструктор
int a = z;
```
```c++
struct My
{//описывает тип, здесь нет никакого реального объекта
int x, y;
My (int a, int b) : x(a), y(b) {}
operator int() {return x+y;} //оператор приведения типа к int
explicit operator bool() const {return x!=0;} //оператор приведения типа к bool
//приведение к bool распространенн
// не приведет к конвериям в другие типы
// не меняет My, кроме mutable полей
};
int a = z; //скомпилируется, будет вызван int
if(z) //скомпилируется
{
}
float b = z; //будет вызван int, если бы не было explicit у bool, нескомпилировалось
```
```c++
struct My
{
int x, y;
int operator[] (int a) {return a+x;} //можно указать любой тип, не только int
// например int operator[] (string a) {return a+x;}
int operator[] (int a, int b) {return a+b+x;} //в 23 стандарте можно будет
};
int a = z[10]; //12
int b = z[10, 3]; //15 //c 23 стандарта
int c = z[10, 3]; //3 //до 23 стандарта, будет задипликейтен
int x = 10, 3; //в x записывается 10, потом 3 и отдается результат последнего присваения
if () x = 0, y = 3;
//int i,j - перечисление переменных
//i++, j++ - оператор ,
for (int i, j; f(); i++, j++);
//В си++ разрешили создавать переменные в условие if
if(int a = 3) {} //в си нельзя так
if(int a = 3; float b = f()) {} // вноовом стандарте, if будет по второй инициализации //пременные будут внутри if и else
if (auto x = f(); x && g()) {} //будет учитываться то, что после ;
```
```c++
10 //int
10u //unsigned int
10ull //unsigned long long
10_my //operator user literal который получает значение до _, в качестве long или string
L"ABC" // массив из char_t
u8"ABC" // 1-4 char на каждый символ как в utf-8
```
### Функторы и лямбда функции
Классы в которых определен оператор вызова функции
```c++
struct My
{
int i;
My(int a = 0) {i = a;}
int operator() (int a) {return a+i;} //можно использовать обьект My как функцию
int operato() (int a)
};
My x;
My y(2);
int a = x(3); //3
int b = y(3); //5
```
> Лямбда функции - это функторы без названия
```c++
auto z = [](int a) //безымянный функтор без полей
{
return a+2;
};
//по умолчанию метод const
int i = 3;
auto x = [=](int a){return a+i;}; //все внешние переменные копируются , в момент создания, менять их нельзя, внешние массивы ПОЛНОСТЬЮ копируются!
auto x = [=](int a) mutable{return a+i;}; //все внешние переменные копируются, в момент создания, менять можно
auto y = [&](int a){return a+i;}; //ссылка на внешние переменные
auto y = [&, i](int a){return a+i;}; //ссылка на внешние переменные, i копируется
// тип возвращаемого значения не указан и вычисляется автоматом компилятором, если не получиться - не скомпилируется
auto z = [=](int a) -> double //возвращает double
{
return a;
};
// забираются только те переменные к которым лямбда функция обращается, забираются как поля обьекта (оги будут помнить изменения)
//std:function - кушает указатели на функции или функторы
```
### Constexpr
Есть разные `const`, в момент компиляции и нет
```c++
int main(int argc, char **argv)
{
int i = 10;
const int j = 10;
const int k = argc;
//constexpr int p = argc; //не скомпилируется
// должно быть вычисленно в момент компиляции
int a [i]; //VLA
int b [j]; //VLA в си, не VLA в си++
int c [k]; //VLA
}
constexpr int mymax(int x, int y) //функция которая может иниц constexpr
//подходит для иниц в момент компияции
{
return (x > y) x : y;
}
//consteval - проверяет что вычисляется в момент компиляции
```