Class v; - default initialization (вызывается конструктор по умолчанию) Class() = default; - implicitly declared explicitly defined (явно объявленный неявно определенный) если полем является ссылка или константа (неинициализированные по умолчанию) , то такой класс нельзя сконструировать по умолчанию

Complex(Type local_scope) : class_scope(local_scope)

при входе в тело конструктора поля уже проинициализированы по умолчанию. чтоб не делать присваивание к полям нужно делать member initialization lists. в них инициализация происходит не в порядке списка, а в порядке объявления полей объекта. поэтому в списке инициализации члены нужно перечислять в таком же порядке, в каком они находятся в полях, иначе может быть UB нельзя совмещать список инициализации и делегирование конструкторов - CE

делегирующие конструкторы: при входе в конструктор сначала вызвать другой свой конструктор (с С++11)

в member initializer list можно вызвать конструктор родителя, не дальше

нельзя явно вызвать конструктор у объекта: class.Class(); это CE, тк class это уже объект Class

конструктор копирования:

String (const String& other); String(String&) = default; (с С++11) (так, потому что COW-string) тривиальный copy constructor копирует все поля побитово. т.е. если в поле есть указатель на дин. память, то копия тоже будет указывать туда, что ведёт к double free в деструкторе и аборту String s = s; - вызов конструктора копирования (UB, тк инициализация полей неинициализорованными значениями)

copy assignment operator отличается от copy ctor тем, что должен очищать поля тому, кому присваивают (и правильно обрабатывать само присваивание), тогда как copy ctor присваивает значения неинициализированным полям.

если в классе есть поля, которые не допускают присваивание (например ссылки), то генерация дефолтного copy assignment operator не определена и будет CE (но дефолтный copy ctor будет работать)

чтобы запретить вызов конструктора с определёнными параметрами можно написать Class(char b) = delete; - (delete не оператор, а специальное слово, обозначающее запрет вызова функции) (с С++11) или сделать этот конструктор приватным (до С++11)

COW-string (copy on write string) такой способ реализации, в котором оставляем тривиальный конструктор копирования, а совершать копирование тогда, когда кто-то пытается изменить копию ленивое копирование, иногда делается, чтобы повысить эффективность

std::initializer_list: (с С++11)

std::vector<int> v = {1,2,3,4,5}; захардкоженый тип в компилятор при инициализации объекта с {} в первую очередь проверяется возможность создания через initializer_list, а уже после проверяются другие конструкторы, если нет конструкторов, тогда делается агрегатная инициализация

с С++11 можно наследовать конструкторы, надо написать у Derived using Base::Base; наследуются все конструкторы, кроме конструктора копирования и перемещения таким образом если в Base был Base(int x), то в Derived появится Derived(int x) но если изначально был Derived(int x), то он затмит привнесённый эти конструкторы не инициализируют поля наследника (очев)

что выведет? сколько объектов создасться? Created, Destroyed, 1 объект S s = std::move(S(S(S(S(1))))): Created, Move, Destroyed, Destroyed

результат вызова конструктора - prvalue

деструкторы

деструктор это функция, которая вызывается, перед тем, как закончится время жизни объекта (область видимости) генерируется по умолчанию всегда вызываются в порядке обратном объявлению нужен только тогда, когда конструктор захватывает какую-то дин. память дефолтный деструктор вызывает деструкторы всех полей если тип примитивный, то его деструктор ничего не сделает (снимется со стека)

вызов деструктора более 1 раза - UB вызов деструктора вручную почти всегда UB явный вызов деструктора обоснован только в паре с placement new (есть пара корнер кейсов)

сначала отрабатывает тело деструктора (поля и методы ещё доступны), потом уничтожаются поля