-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMoveSemantics.cpp
More file actions
87 lines (74 loc) · 1.63 KB
/
MoveSemantics.cpp
File metadata and controls
87 lines (74 loc) · 1.63 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class MyClass {
private:
int value;
int* ptr = nullptr;
public:
MyClass()
{
value = 0;
ptr = new int();
}
MyClass(const MyClass& other)
{
cout << "In copy constructr" << endl;
value = other.value;
ptr = new int(*other.ptr); // deep copy
}
MyClass& operator=(const MyClass& other)
{
cout << "In copy assigment operator" << endl;
if (this != &other)
{
value = other.value;
delete ptr;
ptr = new int(*other.ptr); // deep copy
}
return *this;
}
MyClass(MyClass&& other) noexcept
{
cout << "In move copy constructor" << endl;
value = other.value;
ptr = other.ptr;
other.value = 0;
other.ptr = nullptr;
}
MyClass& operator=(MyClass&& other) noexcept
{
cout << "In move assigment operator" << endl;
if (this != &other)
{
value = other.value;
delete ptr;
ptr = other.ptr;
other.value = 0;
other.ptr = nullptr;
}
return *this;
}
~MyClass()
{
delete ptr;
}
};
// In move functions, there is no new memory allocation. Hence, we can assign noexcept,
// as there would be no throw under any circumstances
// noexcept enbales STL optimizations
void print(MyClass&& m)
{
cout << "In print()" << endl;
}
int main()
{
MyClass lkg, skg;
skg = std::move(lkg);
print(std::move(skg));
MyClass primary, secondary;
secondary = primary; // This would throw if, custom copy assigment operator is not defined
MyClass higherSecondary = secondary; // This would throw if, custom copy ctor is not defined
return 0;
}