# Жёстко замаркоденный конспект про C++, пользуйтесь на свой страх и риск # 2.04.2022 * <b>volatile</b> означает что оптимизатор не должен трогать эту переменную(данные не должны кешироваться). * <b> int (*p) (int a,int b)</b> указатель на <b>int f(a,b);</b> * <b>f;</b> возращает указатель на функцию. Это часто используют для выбора оптимальной функции на данной системе(храним адресса как глобальные константы). * <b>realloc(pointer,new_size)</b> изменяет размер указателя до <b>new_size</b>, при это у нас меняется значение указателя <b>pointer</b>, правильное ииспользование <b>realloc</b>- > int pt = realloc(p,new size); > if(pt) > { > p =pt; > } > else > { > //throw error > <b>NB: realloc(p,0)</b> не чистит память! #### А на этом С всё * В C++ мы не можем неявно скастовать *void в *type, нужен явный * В плюсах есть перегрузка функций. Плюсы не меняют линкер относительно С, но меняют названия функций, по возвращаемым значения нельзя перегрузить это обеспечивается <b>name mangling</b> из за этого у нас есть совместимость только с данным компилятором на данной версией. * Есть дефолтное значение аргумента # 16.04.2022 * в плюсах f() это функция от 0 аргументов * также константа у нас может быть равна вызову функции, но здесь у нас могут быть мемы с тем что у нас пееменные могут иницилизироватся не в том порядке. * <b>static</b> переменная будет жить как глобальная переменная, но объявляется как локальная переменная и имеет видимость локальной переменной(в многопоточности с этим всё плохо). * если мы уазываем <b>static</b> к глобальному объекту, то это означает что этот объект имеет область вдиимости только этот файл. * В c++ у нас для этой цели есть <b>namespace</b> > namespace ex{ >int a >} >ex::a * все стандартные библиотеаа запихнуты в <b>namespace std</b> * Можно удобно обращатся если использовать <b>using namespace</b> * Ещё есть анонимные <b>namespace</b> +- аналог static в глобальном смысле, <b>namespace</b> без имени * в С++ появился спопосбо передачи по ссылке,ссылка создаётся так >int & a = 10; выглядит как передача по объекту, но работает как передача по указателю * А ещё есть <b>rvalue ссылки</b> //TODO * А ещё есть константая ссылка * ### Шаблончики! * Штука что уменьшить копипасту пергруженных функций без вызовым этих функций не будет генерироваться * Перед функцией пишем <b>template \<typename T\> </b> * auto, register, static в C были рекомендациями для копилятора куда класть переменную(дефолтно auto) * В C++ auto переменная имеет тот тип, который её инициализоровали и его нельзя менять.И в шаблонах стало можно возвращать <b>auto</b>. # 23.04.2022 ## Структуры(почти классы) * кроме полей можно ещё описывать функции. Можно создать внешнею функцию и передавать по указателю/ссылке. * А ещё можно создать метод и это будет даже похоже на что-то адекватное.При этом методы имеют скрытый аргумент this(указатель на того от кого вызвали это метод). * Можем указывать что у нас данные константые если указать <b>const</b> в конце заголовка метода. * Конечно можно перегружать методы,аргументы по умолчанию ставить * Можно покидать <b>static</b> по элементам структуры, к таким элементам можно обращатся без имени объекта(но нужно сначала создать один обект этого типа) * поля класса рекомендуется называть с следущим префиксом <b>m_</b> * <b>static</b> метод это де факту просто глобальная функция в области видимости структуры, но мы не можем обращатся к не <b>static</b> полям и функциям * У структур есть конструктор(создаётся через CLASS_NAME{}), если его нет,то просто создаётся пустой конструктор * конструктуры имеют перегрузку * Вызов пустого конструктора делается через вызов без скобочек * Можно писать аргументы конструктора в фигурных скобочках,тогда от нуля аргументов {} нужны * деструктор это метод который вызывается перед тем как объект умирает, удобно освбождать память в нём. * malloc/free ничего не знает про консструкторы, дестукторы, для их работы есть <b>new/delete</b>(При этом строго выделяем/освобождаем память по парам new/delete malloc/free) * ест скалярный(без [])/векторный( с []) оператор new/delete которые тоже должны быть оба одинакового типа. * Нет аналога realloc. * Placement new - new( p ) My(x,y) вызываем конструктор в выделеной памяти по адресу p, очищаем через p->~My() * если new не смог выделил память, то он кидает исключение(ещё есть специальная форма new(std::nothrow) которая кидает NULL если не удалось выделить память) ## Ещё немного о перегрузках Мы можём перегрузить оператор через >T operator_OPERATORNAME(T &x,T &y) * Это же можно написать через внутренную форму, где у нас первый элемент это <b>this</b> *операторы стандартных типов нельзя перезагрузить. *операторы логического или/и не имеют скоращённог действия(Они всегда вычисляют полностью обе части выражения). * префиксные и постфиксные операторы перегружаются отдельно. # 30.04.2022 ## Инкапсуляция * <b>public:</b> начиная с этого момента и до конца структуры у нас всё видимо снаружи * <b>private:</b> тоже самое что <b>public</b> но наоборот * Разница между <b>struct</b> и <b>class</b> в том что <b>struct</b> по умолчанию <b>private</b>, <b>class</b> наоборот. * <b>friend</b> предоставляет внешний доступ к приватным полям и методам класса.Отношение дружбы односторонее. * Если мы хотим нарушить инкапсиляцию, то можно всегда <b>#define class struct</b> 🤡🤡🤡 ## Наследование > >class A{ class B{} } * ещё есть <b> protected</b>, который аналогичен одноименному параметру в javе. * ещё можно уменьшить видимость указанием типа наследование(clangprotected,private) * разрешено множественное наследование, но есть проблемы с одинаковыми именами функций от разных родителей(надо чётко указывать от кого мы её взяли). * И при множественным наследование у нас может получится так что поля будт несколько раз храниться будут *Для решения этой проблемы есть <b>virtual</b>, где у нас по результате у нас будет храниться одно поле. * обращение к <b>virtual</b> полям происходит через указатели. * если мы укажем функцию как <b>virtual</b>, то у нас будет выполнятся функция элемента максимально дочернего в иерархии наследования. * перед чем как создать/удалить объект наследник мым должны вызвать все конструктуры/деструкторы его родителей. * конструктуры не могут быть виртуальными * а вот деструкторы могут > vitrual int f() =0 говорит о том что функция тут не определена и будет оопределена в наследниках. # 7.05.2022 ## Exceptions * можно возвращать зарезерваирование значение если что-то пошло не так в функции * можно просто передевать указатель на ошибку в функцию и в зависимости от его значения обрабатывать ошибки.(ну или наоборот будем возвращать код ошибки, а передавать через указатель будем результат) * есть три формата ошибок boolen(всё ок= true),нулевой код возврата = Ок, остальное плохо,возвращаемый код больше нуля = всё ок, иначе ошибка * в c++ же есть throw, которые нельзя игнорировать(иначе система убивает программу) * То что может выкинуть ошибку оборачиваем блоками try и catch(типизированы) * catch... ловит всё * в сигнатуре мы не указываем нужно ли обрабатывать * выделеине ресурсов есть инициализация * try catch не бесплатно сточки зрения ресурсов * ::nothrow говорит компилятору что тут ничего не будет выбрасыватся * исключения опять же ловятся компиляторно зависивыми * но try catch не ловит исключения, он ловит только то что ему кинули # 14.05.2022 * В c++ если в классе есть {x=2},то у нас в начале конструктора будет присваиватся x=2 * если у нас есть конструктор с единственым параметром типа T , то, при вызове x = T у нас будет вызыватся этот конструктор. * чтобы избежать этого,надо пометить конструктор как <b>explicit</b> * ещё есть оператор <b>bool</b> с которыми мы можем делать вот так > if(z){} * без указание <b>explicit</b> у нас это будет кастоыатся к интам. * оператор [] можем обращаться к нашему оъекту как с массивами. * ещё есть оператор запятая(нахер это нужноя не понял) * в c++ можно создавать переменную в ifе * можно указать тип константы типа T как _T. ## Функторы * классы где определён класс вызова функции * коречке просто функции с контекстом * лмбда функция это тоже самое только анонимное > auto a=[] (args){return f(args)}; * const expr более мощный const который должен быть вычислен в моменте компиляции * тоже самое указанное к функции говорит нам что эта функция подоходит для вычисления const expr переменных.