diff options
clean up
1 files changed, 0 insertions, 121 deletions
| -rw-r--r-- | Sem. 07/README.md | 121 |
diff --git a/Sem. 07/README.md b/Sem. 07/README.md deleted file mode 100644 index 1d3b9a6..0000000 --- a/Sem. 07/README.md +++ /dev/null @@ -1,121 +0,0 @@ -# Голямата четворка (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**. - - |
