Website Summary Files Commits Branches @commit @diff @stats
path: root / Sem. 04 / README.md
blob: 68dc04a88eac48914aca85d547d86b2db28a719b (plain) (blame)
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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
# Член-функции. Конструктори и деструктор. Модификатори за достъп. Капсулация.

## Член-функции.
Член-функциите са функции, които работят с член-данните на обекта от дадена структура.
 ```c++
struct Point
{
	int x;
	int y;
};
bool isInFirstQuadrant(const Point& p)
{
	return p.x >= 0 && p.y >= 0;
}

void revert(Point& p)
{
	p.x = -p.x;
	p.y = -p.y;
}

int main()
{
	Point p1 = {3, 4};
	Point p2 = {-9, 8};
	cout << isInFirstQuadrant(p1) << endl;
	cout << isInFirstQuadrant(p2) << endl;
}
 ```
 
 Може функцията да бъде член-функция:
 ```c++
struct Point
{

	int x;
	int y

	bool isInFirstQuadrant() const
	{
		return x >= 0 && y >= 0;
	}
	
	void revert()
	{
		x = -x;
		y = -y;
	}
};

int main()
{
	Point p1 = {3, 4};
	Point p2 = {-9, 8};
	cout << p1.isInFirstQuadrant() << endl;
	cout << p2.isInFirstQuadrant() << endl;
}
 ```
#  
**Член-функциите**:

 - Работят с член-данните на класа.
 -  Извикват се с обект на класа
 
 - Компилаторът преобразува всяка **член-функция** на дадена структура в
   обикновена функция с уникално име и един допълнителен параметър
   –**указател към обекта**.

**Константни член-функции**:

 - Не променят член-данните на структурата.
 -  Оказва се чрез записването на ключовата  дума **const** в декларацията и в края на заглавието в дефиницията им
 -  Могат да се извикват от константни обекти.
## Конструктори и деструктор.

**Жизнен цикъл на обект**:
 - Създаване на обект в даден scope – заделя се памет и член-данните се инициализират.
 - Достига се до края на скоупа(област).
 - Обектът и паметта, която е асоциирана с него се разрушава.

**Конструктор**:
 - Извиква се веднъж - при създаването на обекта.
 - Не се оказва експлицитно тип на връщане (връща констатна референция).
 - Има същото име като класа.
 
 **Деструктор**:
 - Извиква се веднъж - при изтриването на обекта.
 - Не се оказва експлицитно тип на връщане.
 - Има същото име като класа със симовла '~' в началото.

 ```c++

#include <iostream>

using namespace std;


struct Test 
{
  Test()
  {
  	cout << "Object is created" <<endl;
  }
  
 ~Test()
  {
  	cout << "Object is destroyed" <<endl;
  }
  int a;
  int b;
};

int main()
{
	while ()
	{
		Test t;// Object is created 
		if ()
		{
			Test t2; // Object is created 

		}// Object is destroyed (t2)

	}//Object is destroyed (t)
}

 ```
 ## Конструктори и деструктор при влагане на обекти.
 
  ```c++
#include <iostream>
#include <iomanip>

using namespace std;

struct A
{
	A()
	{
		std::cout << "Constructor(default) of A" << std::endl;
	}

	~A()
	{
		std::cout << "Destructor of A" << std::endl;
	}
};

struct B
{
	B()
	{
		std::cout << "Constructor(default) of B" << std::endl;
	}

	~B()
	{
		std::cout << "Destructor of B" << std::endl;
	}
};

struct C
{
	C()
	{
		std::cout << "Constructor(default) of C" << std::endl;
	}

	~C()
	{
		std::cout << "Destructor of C" << std::endl;
	}
};

struct X
{
	A first;
	B second;
	C obejectsArray[3];

	X()
	{ //calls Constructor(default) of A, Constructor(default) of B, Constructor(default) of C" (x3)
		std::cout << "Constructor of X" << std::endl;
	}
	~X()
	{
		std::cout << "Destructor of X" << std::endl;
	} //calls Destructor of C" (x3) , Destructor of B, Destructor of A

};

int main()
{
	X  obj; //Constructor of X
} // Destructor of X
 ```