| Name | Size | |
|---|---|---|
| .. | ||
| Person | 112 B | log stats plain |
| PersonAdvanced | 128 B | log stats plain |
| README.md | 3.6 KiB | log stats plain blame |
Голямата четворка
- Конструктор по подразбиране (конструктор без параметри)
- Конструктор за копиране
- Оператор =
- Деструктор
Да разгледаме следната структура:
c++
struct Test
{
A obj1;
B obj2;
C obj3;
};
Понеже функциите (от голямата четворка) не са дефинирани в структурата, компилаторът ще създаде такива:
```c++
int main()
{
Test currentObject; //default constructor
Test object2(currentObject); //copy constructor
currentObject = object2; //operator =
} //destructor (x2) ``` Кодът се компилира успешно и функциите имат правилно поведение.
Как работят дефинираните от компилатора функции?
Всяка една от тези функции извиква 'рекурсивно' същите функции върху член-данните. #### Пример за конструктора по подразбиране:

#### Пример за деструктора:

#### Пример за копиращия конструктор:

Проблем при функциите, генерирани от компилатора:
Да разгледаме следния код:
```c++ struct Person { PersonA(const char* name, int age) { this->name = new char[strlen(name) + 1]; strcpy(this->name, name); this->age = age; } private:
char* name;
int age;
};
int main() { Person p1; Person p2(p1); }
``` Горното извикване на копиращия конструктор има неправилно поведение:

Това е shallow copy. В p2 са се копирали стойностите на p1, което довежда до споделяне на една и съща динамична памет. В тази ситуация ще трябва да се имплементират експлицитно копиращия конструктор, оператора за присвояване и деструктора, защото генерираните от компилатора не биха работили правилно.
Правилното поведение на копиращия конструктор е следното:

Собствена имплементация на функциите за копиране и деструктора
```c++ struct Person { Person(const char* name, int age) : name(nullptr), age(age) { setName(name); setAge(age); }
Person(const Person& other)
{
copyFrom(other); // копираме
}
Person& operator=(const Person& other)
{
if (this != &other)
{
free(); //трием
copyFrom(other); //копираме
}
return *this;
}
~Person()
{
free(); //трием
}
.
.
.
};
```
При всички класове, които използват динамична памет, тези функции изглеждат по този начин. Разликите са в имплементациите на функциите free и copyFrom.
