Муҳаммад ал-Хоразмий номидаги ТАТУ Самарқанд филиали
Лаборатория машғулотлари
ФАН |
|
ДАСТУРЛАШ (С++)
| Ҳафта рақами |
|
2
| Машғулот мазмуни |
| Инкапсуляция имкониятларини кўрсатадиган дастур тузиш. | Мақсад: |
| Инкапсуляция тўғрисида маълумотга эга бўлиш;
Маълумотлар майдонини инкапсуляциясини ўрганиш;
Маълумотлар майдони инкапсуляциясини қўллаган ҳолда дастурлар тузиш.
|
Маълумотларт майдонининг инкапсуляцияси.
Синф хусусиятлари (маълумотлар майдони)ни тўғридан-тўғри алмаштирилишини олдини олиш учун, мазкур майдонларни ёпиқ ҳолатда эълон қилиш мақсадга мувофиқ бўлади, буни эса С++ нинг калит сўзи private ёрдамида амалга оширилади. Бу ўз навбатида маълумотлар майдонининг инкапсуляцияси ҳисобланади. Circle синфидаги radius маълумот майдонини хусусий ҳолатда эълон қилган ҳолда синфни қуйидагича эълон қилиш мумкин:
class Circle
{
public:
Circle();
Circle(double);
double getArea();
private:
double radius;
};
Хусусий ҳолатдаги маълумотлар майдонига синф ташқарисидан тўғридан-тўғри мурожаат қилиш мумкин эмас, лекин кўп ҳолатларда мазкур маълумотларни ўзгартириш керак бўлади. Хусусий маълумотларни намойиш этиш учун get функциясини қўллаб маълумотларни олиш имконини яратинг, ҳамда маълумотлар майдонини ўзгартириш учун set функциясини қўллаш мақсадга мувофиқ бўлади.
get функцияси қуйидагича синтаксисга эга:
returnType getPropertyName()
Агарда returnType - bool, бўлса get у ҳолда функция қуйидагича эълон қилинади:
bool isPropertyName()
set функцияси қуйидагича синтаксисга эга:
void setPropertyName(dataType propertyValue)
1-Машқ. Радиуси хусусий бўлган синф яратган ҳолда мазкур маълумотлар майдонига аксессор ва мутатор функциялар ёрдамида уланиб маълумотларни ўзгартирадиган дастур яратинг.
UML диаграммаси:
Дастур коди:
Листинг 1 CircleWithPrivateDataFields.h
1 #ifndef CIRCLE_H
2 #define CIRCLE_H
3
4 class Circle
5 {
6 public:
7 Circle();
8 Circle(double);
9 double getArea();
10 double getRadius();
11 void setRadius(double);
12
13 private:
14 double radius;
15 };
16
17 #endif
Листинг 2 CircleWithPrivateDataFields.cpp
1 #include "CircleWithPrivateDataFields.h"
2
3 // Konstruktor obyekta Circle
4 Circle::Circle()
5 {
6 radius = 1;
7 }
8
9 // Konstruktor s parametrom
10 Circle::Circle(double newRadius)
11 {
12 radius = newRadius;
13 }
14
15 // Vozvrasheniye ploshadi kruga
16 double Circle::getArea()
17 {
18 return radius * radius * 3.14159;
19 }
20
21 // Vozvrasheniye radiusa kruga
22 double Circle::getRadius()
23 {
24 return radius;
25 }
26
27 // Izmeneniye radiusa kruga
28 void Circle::setRadius(double newRadius)
29 {
30 radius = (newRadius >= 0) ? newRadius : 0;
31 }
getRadius() функцияси (22–25 сатрлар) радиусни қайтаради, setRadius(newRadius) (строки 28–31) функцияси эса радиус қийматини ўзгартиради.
Листинг 3 TestCircleWithPrivateDataFields.cpp
1 #include
2 #include "CircleWithPrivateDataFields.h"
3 using namespace std;
4
5 int main()
6 {
7 Circle circle1;
8 Circle circle2(5.0);
9
10 cout << "Ploshad kruga s radiusom "
11 << circle1.getRadius()<<" = "<12 cout << " Ploshad kruga s radiusom "
13 <" = "<< circle2.getArea()<14
15 // Modify circle radius
16 circle2.setRadius(100);
17 cout << " Ploshad kruga s radiusom "
18 <" = "<< circle2.getArea()<19
20 return 0;
21 }
Натижа:
Ploshad kruga s radiusom 1 = 3.14159
Ploshad kruga s radiusom 5 = 78.5397
Ploshad kruga s radiusom 100 = 31415.9
ДАСТУРЛАШ (С++) фанидан 2.2-лаборатория машғулотлари
Do'stlaringiz bilan baham: |