Website Summary Files Commits Branches @commit @diff @stats
path: root / Sem. 07
diff options
context:
space:
mode:
Commit27db17204eec2e906f8bbdaaa7ecf20b78359dad (patch)
Author
 Angel Dimitriev <achi_d@abv.bg>
2021-04-09 22:39:35 +0300
Committer
 GitHub <noreply@github.com>
2021-04-09 22:39:35 +0300
Files0f1c2e419fa268e7e13c870731dfc786005657d6 /Sem. 07
Object-oriented_programming_FMI-27db17204eec2e906f8bbdaaa7ecf20b78359dad.tar
Object-oriented_programming_FMI-27db17204eec2e906f8bbdaaa7ecf20b78359dad.tar.gz
Object-oriented_programming_FMI-27db17204eec2e906f8bbdaaa7ecf20b78359dad.zip
Parent959bc760ae370e07d00d68db34e958e032278a44 (diff)
Create README.md
1 files changed, 120 insertions, 0 deletions
-rw-r--r--Sem. 07/README.md120
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)
+ ```
+ Кодът се компилира успешно и функциите имат правилно поведение.
+### Как работят те?
+ Всяка една от тезу функции **извиква рекурсивно същите функции връху член-данните.**
+ #### Пример за конструктора по подразбиране:
+
+![enter image description here](https://i.ibb.co/s2m8XtC/1.png)
+
+ #### Пример за деструктора:
+![enter image description here](https://i.ibb.co/kmYSzP7/2.png)
+
+ #### Пример за копиращия конструктор:
+![enter image description here](https://i.ibb.co/9Vqk7Mn/3.png)
+### Проблем при функциите, генерирани от компилатора:
+
+Да разгледаме следния код:
+
+ ```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);
+}
+
+ ```
+ При горното извикване на копиращия конструктор се случва следното:
+
+![enter image description here](https://i.ibb.co/q5rfGBf/Capture.png)
+
+
+Това е **shallow copy**. В p2 са се копирали стойностите на p1, което довежда до споделяне на една и съща динамична памет.
+В тази ситуация ще трябва да се имплементират експлицитно **копиращия конструктор, оператора за присвояване и деструктора**, защото генерираните от компилатора не биха работили правилно.
+Правилното поведение на копиращия конструктор е следното:
+
+![enter image description here](https://i.ibb.co/XZq5rGT/33.png)
+
+### Собствена имплементация на функциите за копиране и деструктора
+
+ ```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**.
+
+