# 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 - проверяет что вычисляется в момент компиляции ```