# Жёстко замаркоденный конспект про 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 переменных.