Website Summary Files Commits Branches @commit @diff @stats
path: root / Sem. 11 / README.md
diff options
context:
space:
mode:
Commit8cf1283a4ffb9fe1901c29c087fa376de82726af (patch)
Author
 angeld55 <angel_dimitriev@abv.bg>
2022-02-19 23:30:52 +0200
Committer
 angeld55 <angel_dimitriev@abv.bg>
2022-02-19 23:30:52 +0200
Filesabdfe6bf526100dcce87a88563100e02adf7605e /Sem. 11/README.md
Object-oriented_programming_FMI-8cf1283a4ffb9fe1901c29c087fa376de82726af.tar
Object-oriented_programming_FMI-8cf1283a4ffb9fe1901c29c087fa376de82726af.tar.gz
Object-oriented_programming_FMI-8cf1283a4ffb9fe1901c29c087fa376de82726af.zip
Parentd73a7ec225516657dec74472a0491330e9999217 (diff)
clean up
1 files changed, 0 insertions, 129 deletions
-rw-r--r--Sem. 11/README.md129
diff --git a/Sem. 11/README.md b/Sem. 11/README.md
deleted file mode 100644
index 485b956..0000000
--- a/Sem. 11/README.md
+++ /dev/null
@@ -1,129 +0,0 @@
-# Move семантики
-#### Подаване на стойност по референция
-```c++
-#include <iostream>
-using namespace std;
-
-void f(int& n)
-{
- cout << n << endl;
-}
-int main()
-{
- int number = 10;
- f(number); // OK!
- f(3); // Error!
-}
- ```
-"Висящата" константа 3 **няма адрес в паметта**. За това подаването и като параметър на функцията f ще доведе до компилационна грешка.
-
-**&&** - за стойности без адрес в паметта
-```c++
-#include<iostream>
-using namespace std;
-
-void f(int& n)
-{
- cout << n << endl;
-}
-int main()
-{
- int number = 10;
- f(number); // OK!
- f(3); // Error!
-}
- ```
-
-#### Пример за използването на &&
-```c++
-#include<iostream>
-using namespace std;
-
-void f(int&& n)
-{
- cout << n << endl;
-}
-int main()
-{
- int number = 10;
- f(number); // Error!
- f(3); // OK!
-}
- ```
-Тук грешката възниква при подаването на променлива, която **има адрес в паметта.**
-#### lvalue и rvalue
-
- - **lvalue** - обект, който заема някакво конкретно място в паметта. (стойността в паметта може да се модифицира)
- - **rvalue** - обект, който не е *lvalue* .
-
-
-#### Излишни копия?
-Да разгледаме следният програмен фрагмент:
-
-```c++
-#include<iostream>
-#include<iostream>
-#include "Person.h"
-using namespace std;
-
-Person createPerson(const char* name, int age)
-{
- Person p(name, age);
-
- return p;
-}
-
-int main()
-{
- Person p2("Petur",18);
- p2 = createPerson("Ivan", 23);
-}
- ```
-Тук се изпълняват следните функции на Person:
-
- 1. Конструктор на Person (за p2)
- 2. Конструктор за Person (на p).
- 3. Копиращ конструктор (за *return p*)
- 4. Деструктор (в края на функцията *createPerson*)
- 5. Оператор = (за *p2 = create...* )
- 6. Деструктор (в края на функцията *main*)
-
-Проблемът тук е, че правим излишни копия. Обектът създаден в *createPerson* **се копира два пъти докато се присвои** на p2.
-#### Move конструктор и move оператор =.
-За да избегнем излишните копия, може да "преместим" данните на обектът, който се създава във функцията, в данните на p2.
-```c++
-
-//Move constructor
-Person::Person(Person&& rhs)
-{
- name = rhs.name;
- age = rhs.age;
-
- rhs.name = nullptr;
-}
-
-//Move operator=
-Person& Person::operator=(Person&& rhs)
-{
- if (this != &rhs)
- {
- free();
-
- name = rhs.name;
- rhs.name = nullptr;
- }
- return *this;
-}
- ```
-
- Важно е да се обърне внимание, че тук данните **не се копират**, а се **местят**. Т.е приемаме, че rhs **няма да се използва след изпълнението на функцията.**
- Сега при изпълнението на първоначално разгледания код:
- 1. Конструктор на Person (за p2)
- 2. Конструктор за Person (на p).
- 3. **Move конструктор** (за *return p*)
- 4. Деструктор (в края на функцията *createPerson*)
- 5. **Move oператор =** (за *p2 = create...* )
- 6. Деструктор (в края на функцията *main*)
-
-
-Т.е тук си спестихме 2 копия за динамичната памет в Person.