From 76ab3df6a25207f2cd0a95a347561c2cf5dd18a4 Mon Sep 17 00:00:00 2001 From: Angel Dimitriev Date: Fri, 2 Apr 2021 14:28:48 +0300 Subject: Update README.md --- Sem. 06/README.md | 166 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 166 insertions(+) diff --git a/Sem. 06/README.md b/Sem. 06/README.md index e69de29..4d8cf9d 100644 --- a/Sem. 06/README.md +++ b/Sem. 06/README.md @@ -0,0 +1,166 @@ + +# Разделна компилация. Абстракция. Копиращ конструктор и оператор= + +## Разделна компилация. + +![enter image description here](https://gamedevunboxed.com/wp-content/uploads/2019/08/image.png) + +Една програма на С++ може да бъде разбита в множество файлове, които се **компилират независимо един от друг**, т.е. осъществява се **разделна компилация**. В резултат на компилацията се получават няколко **обектни файла** (файлове с разширение **.obj**). Изпълнимият код напрограмата (файл с разширение .ехе) се получава след свързване на обектните файлове (**Linking**). + +За да се възполваме максимално от разделната компилация, разделяме класовете на **.h** и **.cpp** файлове. Навсякъде където ще работим с класа, ще включваме **само .h файла.** По този начин, ако променим реализацията на някоя от функциите на класа, ще се **прекомпилира само този файл**. + +![enter image description here](https://i.ibb.co/N9RnMHv/sss.png) +## Абстракция +Пример за **лоша абстракция**: + +```c++ +struct Triangle +{ + int x1; + int y1; + + int x2; + int y2; + + int x3; + int y3; +}; +int getPer(const Triangle& t) +{ + return + sqrt( (t.x1-t.x2)*(t.x1-t.x2) + (t.y1-t.y2)*(t.y1-t.y2) + + sqrt( (t.x2-t.x3)*(t.x2-t.x3) + (t.y2-t.y3)*(t.y2-t.y3) + + sqrt( (t.x3-t.x1)*(t.x3-t.x1) + (t.y3-t.y1)*(t.y3-t.y1); +} + ``` + Пример за **по-добра абстракция**: + ```c++ +struct Point +{ + int x; + int y + double getDistTo(const Point& other) + { + return sqrt((x-other.x)*(x-other.x)+(y-other.y)*(y-other.y)); + } +}; +struct Triangle +{ + Point p1; + Point p2; + Point p3; +}; + +int getPer(const Triangle& t) +{ + return t.p1.getDistTo(t.p2) + t.p2.getDistTo(t.p3) + t.p3.getDistTo(t.p1); +} + ``` + +## Копиращ конструктор и оператор = +Заедно с конструктора по подразбиране и деструктора във всеки клас се дефинират и следните член-функции: + - Копиращ конструктор - конструктор, който приема обект от същия клас и създава новият обект като негово копие. + - Оператор= - функция/оператор, който приема обект от същия клас и променя данните на съществуващ обект от същия клас (обектът от който извикваме функцията. + +**Забележка:** Копиращият конструктор създава нов обект, а оператор= модифицира вече съществуващ такъв! + + ```c++ + +#include + +using namespace std; + +struct Test +{ + + Test() + { + cout << "Default constructor" <