§ 2. Класы
Сайт: | Профильное обучение |
Курс: | Інфарматыка. 11 клас (Павышаны ўзровень) |
Книга: | § 2. Класы |
Напечатано:: | Гость |
Дата: | Суббота, 19 Апрель 2025, 12:38 |
2.1. Структура класа
Нагадаем асноўныя паняцці, звязаныя з апісаннем класа. У прыкладзе 2.1 выкарыстоўваецца клас Student. Імя класа прынята пісаць з вялікай літары. У агульным выглядзе апісанне класа выглядае наступным чынам: class iмя_класа { private: /* спіс уласцівасцей і метадаў для выкарыстання ўнутры класа */ public: /* спіс метадаў, даступных іншым функцыям і аб'ектам праграмы */ protected: /*спіс сродкаў, даступных для дружалюбных класаў і наследнікаў*/ }; Усе ўласцівасці і метады класаў маюць правы доступу. Па змоўчанні ўсё змесціва класа з'яўляецца даступным для чытання і запісу толькі для яго самога. Для таго каб дазволіць доступ да даных класа звонку, выкарыстоўваюць мадыфікатар доступу public. Усе функцыі і пераменныя, якія знаходзяцца пасля мадыфікатара public, становяцца даступнымі з усіх частак праграмы. Закрытыя даныя класа размяшчаюцца пасля мадыфікатара доступу private. Калі адсутнічае мадыфікатар public, то ўсе функцыі і пераменныя па змоўчанні з'яўляюцца зачыненымі. Звычайна прыватнымі робяць усе палі класа, а публічнымі — яго метады. Усе дзеянні з зачыненымі палямі класа рэалізуюцца праз яго метады. Паколькі метад у класе з'яўляецца функцыяй, то і апісваюць метады гэтак жа, як апісваюць функцыі. Аб'яўляюць метады ўнутры класа, а вызначэнне метадаў можа быць як унутры класа, так і па-за ім. Вызначэнне метадаў па-за класа дазваляе пры неабходнасці лёгка вынесці іх у асобны файл. Вызначэннi метадаў класа вельмі падобныя на звычайныя вызначэннi функцый. Кожны з метадаў мае загаловак і цела, можа мець тып значэння, якое вяртаецца, і параметры. Але ёсць і адрозненні:
Паколькі даныя ў класе з'яўляюцца прыватнымі, карыстальнік не можа напрамую вызначыць ці змяніць значэннi даных. Для гэтых мэт выкарыстоўваюцца спецыяльныя метады. У класах прынята аб'яўляць так званыя set- i get-функцыі (у рускамоўнай літаратуры іх часам называюць сетэры і гетэры), з дапамогай якіх можна працаваць з элементамі даных. Такіх функцый у класе можа быць некалькі. На аб'екты класаў, як і на аб'екты іншых тыпаў, можна вызначаць паказальнікі. Затым праз паказальнік можна звяртацца да членаў класа — да пераменных і метадаў (прыклад 2.2). Аднак калі пры звароце праз звычайную пераменную выкарыстоўваецца сімвал кропка, то для звароту да членаў класа праз паказальнік прымяняецца стрэлка «–>» (знакi «мiнус» і «больш»). [1] Значок пазначае аперацыю «раскрыццё вобласці бачнасцi». |
Прыклад 2.1. Праграма для вырашэння наступнай задачы: «Прачытаць з тэкставага файла даныя пра студэнтаў (прозвішча, горад, год нараджэння, адзнакі ЦТ) і вывесці ў файл у парадку змяншэння сумарнага бала прозвішчы, горад і сумарны бал».
Прыклад 2.2. Зварот праз паказальнік да членаў класа Date (прыклад 22.5 навучальнага дапаможніка 10-га класа, $@BOOKVIEWBYIDCH*3574*10521@$#pr5).
Змены па паказальніку d5 у дадзеным выпадку прывядуць да зменаў аб'екта d4. У выніку выканання каманд будзе выведзена 17.3. |
2.2. Канструктары
Для пачатковай ініцыялізацыі класа выкарыстоўваюцца канструктары. Канструктар — спецыяльны тып метаду класа, які аўтаматычна выклікаецца пры стварэнні аб'екта гэтага ж класа. Канструктары звычайна выкарыстоўваюцца для ініцыялізацыі палёў аб'екта класа (прыклад 2.3). У адрозненне ад звычайных метадаў канструктары маюць пэўныя правілы наймення:
У класе можа быць некалькі канструктараў. Канструктар, які не мае параметраў, называецца канструктарам па змоўчанні. Ён выклікаецца, калі карыстальнікам не пазначаны значэннi для ініцыялізацыі. Канструктары таксама могуць быць абвешчаныя з параметрамі, якія выкарыстоўваюцца для ініцыялізацыі палёў. У класе можна вызначыць любую колькасць канструктараў, кожны з якіх павінен мець унікальныя параметры. У канструктару можа быць выкарыстаны cпіс ініцыялізацыі палёў класа. Спіс ініцыялізацыі размяшчаецца пасля параметраў канструктара. Ён пачынаецца з двукроп'я (:), а затым значэнне для кожнага поля паказваецца ў круглых дужках. У целе канструктара не трэба выконваць аперацыі прысвойвання, таму цела канструктара можа быць пустым. Спіс ініцыялізацыі членаў класа не заканчваецца кропкай з коскай (прыклад 2.4). Кожны метад класа няяўна ўтрымлівае ў якасці поля даных паказальнік: IмяКласа *this; З яго дапамогай метад класа вызначае, з данымі якога аб'екта яму трэба будзе працаваць. Паказальнік this можна выкарыстоўваць у канструктарах (прыклад 2.5). Дэструктар класа — яшчэ адзін спецыяльны метад — выклікаецца пры знішчэнні аб'екта. Імя дэструктара аналагічна іменi канструктара, толькі ў пачатку ставіцца знак тыльды: ~. Дэструктар не мае ўваходных параметраў. Дэструктар заўсёды адзін. Для простых класаў (тых, якія толькі ініцыялізуюць значэннi звычайных уласцівасцей) дэструктар не патрэбны, так як C++ аўтаматычна выканае ачыстку памяці самастойна. Дэструктары не выклікаюцца карыстальнікам яўна. Аднак іх могуць бяспечна выклікаць іншыя метады класа, таму што аб'ект не знішчыцца да таго часу, пакуль не выканаецца дэструктар. |
Прыклад 2.3. Даданне канструктараў у клас Student.
Функцыя для ўводу даных з выкарыстаннем канструктара зменіцца наступным чынам:
Прыклад 2.4. Выкарыстанне спісу ініцыялізацыі пры апісанні канструктараў у класе Student.
Пераменныя ў спісе ініцыялізацыі атрымліваюць свае значэннi не ў тым парадку, у якім яны пазначаны, а ў тым парадку, у якім абвешчаны ў класе. Таму пры выкарыстанні спісаў ініцыялізацыі лепш захоўваць той жа парадак палёў, які зададзены пры апісанні класа. Прыклад 2.5. Выкарыстанне паказальніка this у канструктару класа Date.
|
2.3. Цэлалікавы тып даных
Разгледзім прыклады выкарыстання класаў. Прыклад 2.6. Рэалізаваць клас для апісання геаметрычнай фігуры — Figure і яго наследнікаў — круг (Circle) і трохвугольнiк (Triangle). У базавага класа трэба вызначыць агульны метад square (), які вяртае плошчу геаметрычнай фігуры, а ў наследнiкаў рэалізаваць гэты метад. Прадэманстраваць працу метадаў. Этапы выканання задання 1. Апісаць базавы клас Figure.
2. Апісаць клас наследнік Circle.
3. Апісаць клас наследнік Triangle.
Прыклад 2.7. Зададзена дата нараджэння чалавека і бягучая дата. Вызначыць колькасць поўных гадоў, якія прайшлі з дня нараджэння. Для вырашэння задачы выкарыстоўваць клас Data. Падзяліць аб'яву і вызначэнне класа, стварыўшы файлы Date.h і Date.cpp. Этапы выканання задання 1. Клас Date быў апісаны ў прыкладзе 22.5 навучальнага дапаможніка 10-га класа ($@BOOKVIEWBYIDCH*3574*10521@$#pr5). У клас неабходна дадаць функцыі-гетэры для атрымання дня, месяца і года. 2. Дадаць файлы.
3. Загалоўкавы файл змяшчае аб'яву класа (рэалізацыю) і апісанне бібліятэк (калі яны неабходныя). 4. Файл Date.cpp змяшчае вызначэнне метадаў класа. Каб звязаць вызначэнне класа і яго рэалізацыю, неабходна ў файле рэалізацыі падключыць загалоўкавы файл з аб'явай класа: #include "Date.h". Звярніце ўвагу, што пры падключэнні яго імя файла бярэцца ў двукоссі, а не ў вуглавыя дужкі. 5. У файле main.cpp таксама неабходна падключыць загалоўкавы файл.
|
Прыклад 2.6. Праграма.
Тэсціраванне: Абстрактны клас, які змяшчае толькі віртуальныя метады, называецца інтэрфейсам. Тады абстрагаванне — гэта неабходнасць сканцэнтравацца на інтэрфейсе, не звяртаючы ўвагі на рэалізацыю. Інтэрфейсы дазваляюць наладзіць множнае наследаванне аб'ектаў і вырашыць праблему ромбападобнага наследавання (сітуацыя, калі два класа B і C наследуюць ад A, а клас D наследуе ад абодвух класаў B і C). Імя інтэрфейса будуецца па тых жа правілах, што і іншыя ідэнтыфікатары мовы праграмiравання. Аднак для інтэрфейсаў могуць прымяняцца дадатковыя правілы, якія дапамагаюць адрозніваць імя інтэрфейса ад імёнаў іншых элементаў праграмы. Напрыклад, у тэхналогіі COM і ва ўсіх мовах, якія падтрымліваюць яе, дзейнічае пагадненне, вынікаючы якому, імя інтэрфейса будуецца па шаблоне «I<Iмя>», гэта значыць складаецца з напісанага з загалоўнай літары асэнсаванага імені, якому папярэднічае загалоўная лацінская літара I, напрыклад IFigure.Прыклад 2.7. Змесціва файла main.cpp.
Змесціва файла Date.h.
|
Пытаннi да параграфа
![]() |
1. Якія раздзелы змяшчае апісанне класа? 2. Да якога раздзелу адносяцца палі і метады, калі назва раздзела яўна не прапісана? 3. У чым перавага паасобнай аб'явы і вызначэння метадаў класа? 4. Для чаго выкарыстоўваюцца set- i get-функцыі? 5. Для чаго патрэбен канструктар? 6. Колькі канструктараў можа быць апісана ў класе? |
Практыкаваннi
1. Падзяліце аб'яву і вызначэнне класа Student (прыклады 2.1 і 2.3), стварыўшы файлы Student.h і Student.cpp.
2. Дадайце для базавага класа, апісанага ў прыкладзе 2.6, у якасці наследнікаў трапецыю і паралелаграм. Апішыце для іх метады вылічэння плошчаў.
3. Прадумайце іерархію наследнікаў для чатырохвугольнікаў (колькасць наследнікаў не менш 2). Рэалізуйце базавы абстрактны клас і даччыныя класы. У якасці метадаў рэалізуйце функцыі для вылічэння плошчы, перыметра і даўжыні дыяганаліі.
4. Стварыце клас Parallelepiped (прамавугольны паралелепіпед). Канструктар прымае даўжыні рэбраў. Рэалізуйце функцыі вылічэння плошчаў заснавання і бакавых граняў, аб'ёму, даўжынi дыяганалей паралелепіпеда і дыяганалей заснавання і бакавых граняў. Зрабіце праверку на тое, што паралелепіпед з'яўляецца кубам.
5. У аддзеле кадраў інфармацыя аб работніках захоўваецца ў наступным выглядзе: прозвішча і ініцыялы, назва займаемай пасады, дата паступлення на працу. Выведзіце ў алфавітным парадку тых работнікаў, стаж працы якіх больш уведзенага значэння на бягучую дату (дата ўводзіцца). Апішыце клас Worker, у якім павінен быць рэалізаваны метад, які вылічае стаж працы.
6. Стварыце клас Rect для прамавугольнікаў з бакамі, паралельнымі восям каардынатаў. Рэалізуйце перамяшчэнне прамавугольніка на плоскасці (па гарызанталі, па вертыкалі, у кірунку вектара), змяненне памераў.