diff options
Create README.md
1 files changed, 120 insertions, 0 deletions
| -rw-r--r-- | Sem. 07/README.md | 120 |
diff --git a/Sem. 07/README.md b/Sem. 07/README.md new file mode 100644 index 0000000..4c1fce5 --- /dev/null +++ b/Sem. 07/README.md @@ -0,0 +1,120 @@ +# Голямата четворка (Rule of four) + + - Конструктор по подразбиране (конструктор без параметри) + - Конструктор за копиране + - Оператор = + - Деструктор + +Да разгледаме следната структура: +```c++ +struct Test +{ + char str[20]; + A obj2; + B 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**. + + |
