diff options
clean up
4 files changed, 0 insertions, 280 deletions
| -rw-r--r-- | Sem. 11/README.md | 129 | ||||
| -rw-r--r-- | Sem. 11/example/Person.cpp | 99 | ||||
| -rw-r--r-- | Sem. 11/example/Person.h | 35 | ||||
| -rw-r--r-- | Sem. 11/example/main.cpp | 17 |
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.
diff --git a/Sem. 11/example/Person.cpp b/Sem. 11/example/Person.cpp deleted file mode 100644 index ae78280..0000000 --- a/Sem. 11/example/Person.cpp +++ /dev/null @@ -1,99 +0,0 @@ -#include "Person.h" -#include <iostream> - -using namespace std; - -Person::Person() : Person("Unknown", 0) -{ - -} -Person::Person(const char* name, int age) : name(nullptr), age(age) -{ - cout << "Constr" << endl; - setName(name); - setAge(age); -} - -Person::Person(const Person& other) -{ - cout << "copy constr" << endl; - copyFrom(other); -} -Person::Person(Person&& other) -{ - cout << "Move constr" << endl; - - name = other.name; - age = other.age; - - other.name = nullptr; -} - -Person& Person::operator=(Person&& other) -{ - - std::cout << "Move op= " << endl; - if (this != &other) - { - free(); - - name = other.name; - other.name = nullptr; - - age = other.age; - - } - return *this; -} - -Person& Person::operator = (const Person& other) -{ - cout << "op =" << endl; - if (this != &other) - { - free(); - copyFrom(other); - } - return *this; -} -Person::~Person() -{ - cout << "Destructor" << endl; - free(); -} - -const char* Person::getName() const -{ - return name; -} - -int Person::getAge() const -{ - return age; -} - -void Person::setName(const char* name) -{ - delete[] this->name; - this->name = new char[strlen(name) + 1]; - strcpy(this->name, name); -} -void Person::setAge(int age) -{ - if (age < 0 || age > 120) - age = 40; - this->age = age; -} - -void Person::copyFrom(const Person& other) -{ - name = new char[strlen(other.name) + 1]; - strcpy(name, other.name); - - age = other.age; -} -void Person::free() -{ - delete[] name; - age = 0; -}
\ No newline at end of file diff --git a/Sem. 11/example/Person.h b/Sem. 11/example/Person.h deleted file mode 100644 index 9a404c4..0000000 --- a/Sem. 11/example/Person.h +++ /dev/null @@ -1,35 +0,0 @@ -#pragma once - -class Person -{ -public: - Person(); - Person(const char* name, int age); - - Person(const Person& other); - - Person(Person&& other); //move constr - - Person& operator=(Person&& other); // move op= - - Person& operator=(const Person& other); - ~Person(); - - void setName(const char* name); - void setAge(int age); - - const char* getName() const; - int getAge() const; - - void print(); - - -private: - - void copyFrom(const Person& other); - void free(); - - - char* name; - int age; -};
\ No newline at end of file diff --git a/Sem. 11/example/main.cpp b/Sem. 11/example/main.cpp deleted file mode 100644 index 80fef69..0000000 --- a/Sem. 11/example/main.cpp +++ /dev/null @@ -1,17 +0,0 @@ -#include<iostream> -#include<iostream> -#include "Person.h" -using namespace std; - -Person createPerson(const char* name, int age) -{ - Person p(name, age); - - return std::move(p); -} - -int main() -{ - Person p2("Petur",18); - p2 = createPerson("Ivan", 23); -} |
