Transcript for:
Основи об'єктно-орієнтованого програмування на C++

Вітаю вас ми приступаємо до вивчення об'єктно-орієнтованого програмування c++ де ви ознайомитеся із концепціями які дозволять вам створювати більш структуровані та ефективні програми що таке ооп об'єктно-орієнтоване програмування - це сучасний підхід до програмування який допомагає вам організувати ваш код у вигляді об'єктів що спрощують розробку та підтримку програми об'єктноорієнтоване програмування поділяється на декілька основних тем Це інкапсуляція поліморфізм та успадкування ми розберемо з вами Що таке класи ми розберемо що таке об'єкти класу Як їх можна отримати як їх створювати ми розберемо що таке методи класу які існують методи як викликати як їх створювати також розберемо модифікатори доступу класів такки як Public Private і protected Та звісно розберемо деякі основні методи які генеруються в нашому класі такі як гетери сетери ну відповідно це metр Get і Set ну і звісно Ми почнемо з першої теми це інкапсуляція об'єктноорієнтоване програмування воно поділяється на три основні теми це інкапсуляція поліморфізм і спадкування інкапсуляція - це основа база створення класу створення об'єкта відповідно реалізація методів конструкторидеструктори винесення методів за межі класу і багато додаткових моментів які пов'язані з нашими класами успадкування - це механізм взаємодія між двома класами поліморфізм - це у нас відповідно трішки складніше застосування віртуальних функцій віртуальних деструкторів абстрактних класів але все Поступово все Поступово почнемо звісно Ми з самого першої теми інкапітуляція і почнемо що таке в нас взагалі клас що таке клас клас - Це в нас набір інструментів Тобто ми можемо тепер об'єднати е методи і значення в одну якусь структуру якщо пам'ятаєте ми з вами розбирали в минулого разу структури не минулого разу а декілька років тому назад розбирали з вами структури от структури були подібні до класів Вони мають подібну структуру Відповідно ми об'єднуємо щось в одну якісь структуру в один механізм і Потім можемо створювати об'єкт в структурі Ми також створювали об'єкт і відповідно через об'єкт звертались до певних елементів клас подібний до структур але має багато своїх переваг в ньому може бути конструктори-деструктори наявність які єсть набагато ефективніше їх застосовувати в структурах також можна але в констру в класах в нас Вони більш ефективно показують свою роботу Також тут є можливість застосовувати перевантаження операторів використання специфікаторів доступу і багато інших речей важливих почнемо що таке клас і так Клас - це в нас з вами механізм який об'єднує тепер метод це функції які ми будемо класти в середину цього класу і значення це зміння які ми будемо класти в наш клас і я буду відразу вам показувати на прикладі як ми будемо реалізувати наш клас почнемо відповідно з класу перша умова що таке клас Та як нам цех клас створити створити клас person який буде представляти собою атрибути ім'я вік та відповідно стат це наші Умови за допомогою яких ми будемо орієнтуватися Що ми робимо І що відповідно ми будемо потім застосовувати і в перші умови ми будемо створювати наш клас в якому будуть знаходитися змінні це ім'я вік та стать відповідно клас буде назвати нас person створюємо клас клас створиюється за допомогою ключового слова клас змінимо мову називаємо person відкриваємо фігурні дужки і закриваючи фігурну дужку так як в структурах ми ставимо крапку з комою закриваємо її тепер в класі ми можемо реалізувати певні якісь значення змінні або методи по замовчуванню по замовчуванню нашого класу Всі поля являються закритими що значить закритими Якщо ми будемо створювати в inнтмені об'єкт нашого класу Наприклад напишемо intmain відкриємо фігурні дужки створимо об'єкт такого класу пригадуйте що для того щоб створити об'єкт такого класу ми використовуємо ім'я нашого класу і потім наприклад назва нашого об'єкта Object крапка з комою Ну якщо в класі будуть наші змінні Наприклад ми повинні створити ім'я вік та стать створимо змінні це в нас буде відповідно int H mh потім Вік а вік написали буде тоді відповідно наше ім'я використовуємо String M name і використовуємо також STD н gender крап с також M gender творили створили три змінні але ці змінні вони в нас являються закритими чому Хоча вони і знаходяться всередині класу по замовчуванню при реалізації класу Всі поля являються його закритими тобто якщо я в інтмені захочу через об'єкт мого класу звернутися до цих полів поставивши крапку я не зможу це зробити так як в мене нема до них доступу це являється основним механізмом інкапсуляції закриття даних тобто по замовчуванню в класі наші дані вони автоматично закриваються і тут нам можуть допомогти модифікатори доступу до класу тобто якщо в нас закриті якісь дані в класі то відповідно є якийсь механізм для того щоб відкрити доступ І от модифікатори доступу вони або закривають або відкривають нам доступ до середини класу в першій умові нам треба ворити клас person який буде представляти собою атрибут ім'я вік стать ми зробили першу умову створили клас створили змінні тепер далі переходимо до наступної умови що таке об'єкт класу створити кілька об'єктів класу person і встановити їхні атрибути ім'я вікть для кожного об'єкта давайте створимо ще один об'єкт Object 2 і нам треба встановити значення як ми можемо встановити значення ми використовуємо тепер модифікатор доступу і перши модифікатор який розповсюджений це Public якщо ми напишемо Public і попробуємо тепер звернутися до цих зміннив через об'єкт нашого класу пишемо Object крапка ви бачите що тепер перелік цих змінних в нас доступне через крапку це тому що ми надали доступ ми відкрили ці поля які йдуть після ключового слова Public для того щоб ми могли до них звертатися з зовні через об'єкт тепер через об'єкт ми до них можемо звертатися Object крап ім'я точніше вік наприклад вік 12 Object крап M name name з помилився name естьсть змінимо і тут так само name наприклад Антон і крапка з коми в кінці так само Object крапка і gender а воно Хай будемен крап заповнимо наш другий об'єкт пишемо Object 2h 20 Object крап name ра не знаю там Сергій хай буде і Object 2 До речі помилився тут треба нам два крапка gender також хай буде мен єсть от ми заповнили об'єкт нашого класу який складається з трьох елементів цеми виконали другу умову створили об'єкти створили декілька об'єктів класу person і встановити їхні атрибути атрибути - це їхні відповідно значеньня які там зберігаються змінні які ми використоувуємо для кожного з об'єкта і ми це досягли з вами за допомогою модифікатора доступ от використовуємо дифікатор доступу класу Public ключове слово є ще prправіт і протект яки з якими ми далі також з вами познайомимося приступаємо до третьої Умови за допомогою мірник класу за допомогою об'єкта класу створити метод displлеay info який виведе виводитиме інформацію про кожну особу Тото буде виводити ім'я вікстать на консоль і тепер побачите що всередині класу в нас можуть зберігатися як і змінні так і якісь метод і нам треба з вами тепер реалізувати по нашій умові це метод displлеayіо додаємо метод displлеay info метод нічого не повертає буде тільки виводити displлеay infфo він в нас буде константний ко це означає що всередині такої функції ми нічого змінювати не будемо а будемо виводити тільки певну інформацію пишемо Display info count виводимо що виводимо name двокрапка робимо відступ виводимо M name У нас є така змінна вредині класу Як бачите щоб звертатися до змінних в методі ми можемо напряму до них звертатись так як це в нас метод який знаходиться також всередині класу і змінні Вони знаходяться всередині класу і метод знаходиться всередині класу і ми без проблем можемо звертатись до такої змінної всредині нашого метода Void Display info і використовувати цю змінну А ми будемо її просто виводити в цьому методі зауважу що от тільки Таким чином ми можемо до них до цих змінних без ніяких там уточнень просто написавши mname звертатесь тільки всередині класу або в методах класу це метод класу Точніше це функція але так як ми її з вами реалізували всередині нашого класу То тепер це має назву метод класу так іменуються функції які реалізовуються в нашому класі всередині класу і вони являються частиною нашого класу виводимо mname далі ми повинні вивести вік пишемо H відступ крапка двокрапка виводимо mh також і виводимо gender крапка gender крапка і виводимо змінну mgender std. от реалізували метод Display info тепер ми з вами для кожного нашого об'єкту який ми створили Object викличемо метод Display info Як бачите коли я натискаю крапку тепер крім змінних mh mgender mne в мене і з'являється можливість взаємодіяти з методом disсплеayіфо я викликаю метод disплеay infо ставлю круглі дужки тому що це функція Ми повинні як її функцію викликати так як метод нічого не повертає я просто не не прописую його ні в сіауті не пишу тут перед ним равно і щось присвоюю тут просто викликається і щось виконує ну і звісно в кінці я ставлю крапку з комею далі пишу Object 2 кра знову displayinо круглідужки крапка з комою поставили компілюємо тепер нашу роботу lon 16 компілюємо запускаємо виводимо name anon h12 Enderman name H20 genderman От такі в нас можливості єсть взаємодії з нашим класом ми створили лас person додали до нього відповідно три змінні додали метод disплеay іо все це знаходиться в полях па тобто якщо ми використовуємо специфікатор доступу Public всі всі поля які йдуть після цього специфікатора доступу в нас являються відкритими і ми їх можемо використовувати і звертатися до них через об нашого класу от ми створили в intmen об'єкт нашого класу і тепер звертаємося до них через об'єкт Окей Тепер давайте приступимо до до нашого четвертої умови Додайте метод класу person який дозволяє змінювати вік особи назвіть цей метод наприклад Get А точніше Set H Окей додамо тепер метод Set h для того щоб змінити вік особи ми можемо звісно і змінити вік особи через об'єкт але в наступні умові там буде можливість точніше певне застосування іншого специфікатора доступу як privт і ви побачите що такий метод нам буде потрібен реалізовуємо метод Set H я відразу вам проговорю що таке Set А що таке Get тому що в нас є відповідно певне визначення для застосування Get і Set це методи getгетери і сетери це два основних методи які ми реалізовуємо для того щоб отримувати доступ до наших змінних метод getter нам дає можливість з вами встановити значення метод точніше getter дає можливість нам повернути значення metметод се дає нам можливість встановити значення для чого вони потрібні якщо наприклад ми маємо і так прямий доступ до наших змінних Але якщо ми наприклад прочитаємо от наступну умову змінити модифікатор доступу до атрибутів стать класу person з Public на Private винесіть необхідні зміні в код щоб забезпечити доступ до цього требуду через гетери Та сетери що це значить Ми повинні притримуватися основного принципу об'єктноорієнтованого програмування це інкапсуляція інкапсуляція - це закриття доступу прямого доступу до наших змінних то я показав вам що ми маємо можливість робити Таким чином звертатися до наших змінних H mh mname і mgender Але якщо ми будемо слідувати правил які написані які потрібно виконувати нам для того щоб правильно реалізовувати роботу об'єктноорієнтованого програмування і реалізовувати роботу класу то змінні ми завжди з вами закриваємо І тому ми переносимо з вами па трішки нижче закриваємо тепер доступ до таких змінних бачимо що доступ в нас тепер до змінних закрився в нас виникає з вами відповідно помилки що ми не можемо до них тепер розвертатися але ми зараз з вами реалізуємо такі основні методи як getter та сеter ці методи будуть допомагати нам встановлювати значення або повертати значення ми пишемо наприклад якщо це сете то він нам нічого не повертає пишемо Void пишемо Set H Set H в нас буде встановлювати значення пишемо відповідно in H відкриваємо фігурні дужки Далі пишемо M H Рав H хоча це не якоби не прямий доступ але косний доступ до нашої змінної mh ми наприклад можемо перевірити нашій в нашому методі Set H чи відповідно наший H не являється менше нуля якщо він буде не являтись менше нуля тоді ми робимо ініціалізацію нашої змінної mh інакше ініціалізуємо нашу змінну mh0 рав0 крап скоми в блоці els це додаткова обробка Тобто ми Таким чином фільтруємо ті дані які хочемо покласти в наші змінні mh mname і mgender за допомогою таких сетерів Ну а звісно реалізуємо з вами тепер і метод getter getter нас завжди повертає ми пишемо ключове слово префixс Get і потім те ж він повертає Get H він нічого не отримує а просто робить return M hкра от повертає наше відповідно ім'я реалізуємо Такі ж самі методи для наших інших змінних пишемо Void Set name круглі дужки STD String name відкриваємо фігурні дужки пишемо M nameame nameкраc Void Set Ganger відкриваємо круглі дужки також змінна String String Ganger відкриваємо фігурні дужки і тут робимо таку ж саму ініціалізацію як і попередніх як і для попередніх змінних mgender =вно gender крапка з комою все виконали Лишня N Тобто ми з вами закрили доступ до наших змінних зовні тепер до них звернутись Ми не можемо Тепер нам потрібно через об'єкти звертатися до методів сеter щоб встановити значення ми пишемо знов Set крапка В нас є Set H відкриваємо крулі дужки передаємо значення це функція ми в неї передаємо значення так само пишемо Object крапка setn відкриваємо крулі дужки пишемо Антон крапка з комою потім знову пишемо Object крапка і Set Ganger і відповідно також надаємо туди певне значення закоментуємо для objectта 2 дисплей виведення ми його заповнювати не будемо залишимо тільки один об'єкт компілюємо запускаємо знову працює Все вірно name anon h0 genderman До речі тут H в нас нуль перевіримо де в нас тут виникла помилка якщо Ага якщо H менше нуля то ми робимо навпаки ми mh присвоюємо нуль щоб туди класти щоб туди не класти від'ємні значення а в mh кладемо змінну h крапка ско змінили компілюємо повторно запускаємо h12 genderman все працює тепер в нас коректно і так це ми з вами реалізували клас реалізували що таке об'єкт використали таки наш об'єкт використали відповідно методи нашого класу використали основні методи класу Тобто це базові методи які getter Та setter сеter в нас відповідно встановлює значення для наших змінних а getter повертає значення для наших змінних використали модифікатори доступу по замовчуванню всі поля класу у нас я'являються закритими Відповідно ми можемо відкрити доступ до певних полів використовуючи модифікатор доступу Public і ми відкриваємо доступ до наших методів для того щоб до них ми мали можливість звертатися і звісно використовуємо принцип інкапсуляції принцип інкапсуляції говорить про те що ми повинні заборонити прямий доступ до наших змінних які знаходяться всередині класу а реалізувати до них доступ через гетери і сетери переходимо до наступного пункту нашого завдання модифікатори доступу ми реалізували що таке getтери і сете давай додати getгетери для методу Get gender та setter метод Set ger ми це вже додали Нам залишилось тільки додати getter ми зараз його додамо се в нас уже існує дотомо ми з вами тепер ще getетери Get H В нас тепер додаємо ми з вами і метод in Get gender круглі дужки gender M gender крапка Для чого потрібні нам getете для того щоб ми могли наприклад передати такий тип інформації якісь інші змінні gender gender дивимося доступ так return M gender виникає помилка зараз глянемо существують попідходяч функції Угу соor проблема тут Насти повертаємо значення буде не int а буде String ми повертаємо з вами strн проблема зникне для чого потрібні getте Ну наприклад Ми створимо тут дві змінні H самий банальний спосіб продемонструвати вам роботу getгетера і захочемо через наш Object то Get H покласти якусь і змінну і потім використовувати її всередині нашої функції intmain пишемо STD також String створим і змінну для енра чніше gender равно Object точка gender вибираємо метод не Set а Get крулі дужки крапка скома і тепер через C Out виведемо Ці дві зміні Подивимося що там буде зберігатися пишемо H пробіл і пишемо gender СD есть компілюємо повторно запускаємо водимо 12 імен Ми отримали ті значення які були в нашому класі але ми отримали їх як копію за допомогою Get Age і Get Enter gender ми поклали їх в інші змінні нашого відповідно нашої програми всередині inmo і тепер ці зміни можемо використовувати в разі потреби для інших якихось робіт О так працюють наші сетери і гетери давайте детальніше знову повторимо з самого початку що ми з вами реалізували і так ми з вами реалізували клас в класі В нас створені три змінні змінні ми закрили до них доступ використовуючи механізм інкапсуляції по замовчуванню наші змінні являються закритими але ми можемо додати і специфікатор доступу prпрат для чого prпраivт потрібен він закриває доступ Наприклад якщо ви хочете ваші змінні створювати не тут а ви написали от Public всі поля у вас відкрилися але потім вам треба закрити деякі Поля ви пишете Private вовокрапка і сюди переміщаєте ваші змінні Так де наші змінні не скопіював треба скопіювати копіюємо змінні тепер знову пишемо prпраivт внизу двокрапка і кладемо сюди вже змінні порядок розташування змінних Як бачите немає різниці вони можуть знаходитись і зверху і знизу відповідно Зазвичай вони прописуються знизу зверху В нас реалізація методів і Ну звісно там реалізація конструкторів і деструкторів якщо вони єсть ну зазвичай в нас відбувається структура таким чином що в класі ми починаємо з відкритих полів використовуючи специфікатор доступу Палі реалізовуємо всі необхідні нам методи далі ми використовуємо специфікатор доступу Private закриваємо всі інші поля і там де ми закрили Ми створюємо зміні Якщо нам вони потрібні звісно ну в нашому випадку вони потрібні тому ми з вами їх перемістили донизу щоб продемонструвати як працює специфікатор доступупраivт Тото він забороняє доступ до цих полів працює Аналогічно як поля по замовчуванню закриває доступ і ці поля являються тепер в нас закритими і через об'єкт класу ми до них звернутися не можемо можемо тільки використовувати сетери Ну і гетери вірно для того щоб повертати значення і так підсумуємо що таке об'єктно-орієнтоване програмування об'єктно-орієнтоване програмування - це програмування орієнтоване на об'єкти Тобто ми тепер з вами будемо більшість часу працювати з об'єктами наших класів реалізовувати об'єкти виконувати певні дії викликати методи створювати масиви створювати просто якісь дані заповнювати їх і так далі інкапсуляція поліморфізм і спадкування інкапсуляція - це закриття даних основний ключовий момент який стосується це закриття даних е в нашому класі це змінні це дані естьєсть дані можуть бути масив дані можуть бути змінні дані можуть бути якісь там об'єкти інших класів які вкладені ми покладемо дані можуть бути в нас там перераховування енум наприклад константні там змінні якийсь там ще динамічний масив Якщо ви будете створювати от всі дані які в нашому класі вони єсть ми їх інкапсулюємо щоб до них прямого доступу не мали чому Ну тому що ми можемо наприклад помилитися і покласти якісь некоректні дані а завдяки капсуляції і реалізації гетерів і сетерів до цих даних Ми маємо можливість як буферну зону для того щоб робити перевірку Чи ті дані які ми хочемо покласти в нашій змінні всередині класу являються коректними Ну от я продемонстрував примітивний спосіб перевірки нашої змінної H яку ми хочемо ініціалізувати всередині класу точніше mh за допомогою Set H ми викликаємо Set H передаємо її значення от значення ми поклали аргумент нашої Set H і потім перевіряємо нашу H чи вона не являється менше нуля якщо менше нуля це від'ємне значення то ми не ініціалізуємо нашу mh цією змінною H ми її ініціалізуємо нулем інакше просто ініціалізуємо mh тим значенням яке зберігається в h ну там вже буде або нуль або більше нуля ну умовно нуль домовимося що може бути такий вік Да От такий спосіб в нас застосування гетерів і сетерів гетери в нас відповідно Вони починаються на ключове слово на префікс Get Ми там пишемо Get H це означає що Get H повернути наприк приклад нам вік це повернення даних з нашого класу ми можемо повернути Get Age і копію цієї інформації з нашої змінної mh яка зберігалась там кладемо в якусь іншу змінну і потім її використовуємо раз для наших потреб Так саме стосується відповідно і Get gender просто ключове слово Get воно залишається незмінним а далі ми пишемо те що ми повертаємо те що ми повертаємо це А ім'я наших змінних ну відповідно Set name і Set gender так само вони встановлюють значення що таке об'єкт класу те саме що при структурі Ми створюємо об'єкт і він володіє механізмом а відповідно вредині себе і методів і змінних тобто він в собі зберігає тепер набір і методів і змінних методи класу це в нас от сетеригетери вони також являються в нас методами але вони унікальні методи се getter але в нас також може бути інш якийсь метод наприклад наший метод displлеayіo от наший метод disсплеay іфо який ми викликаємо для того щоб вивести цю інформацію там може бути метод print метод там Show is empt там створення масиву і так далі І так далі скільки потрібно вам методів Скільки ви можете їх і реалізувати Ну і модифікатор доступу класу це в нас Public Private і protected по замовчуванню в нашому класі всі поля в нас закриті от вони якщо ми приберемо всі специфікатори доступу то всі поля будуть закритими і ми ні до чого звернутися не можемо але єсть такі специфікатори доступу як Public privit і protected Public він надає доступ до всіх полів які йдуть після цього ключового слова privт навпаки він забороняє тепер доступ до всіх цих полів А прокed в нас використовується у спадкуванні коли ми будемо розбирати з вами механізм спадкування ми детальніше познайомимося з протектом Ну і таку роботу ми виконали виконали всі умови які в нас були в переліку це створити клас створити об'єкт а відповідно створити наший метод displлеay in створити Set AG закрити доступ використовувати наприклад там інкапсуляцію створити гетире сетери І некапсуляція впевнитесь що ми заборонили доступ це і якраз І інкапсуляція от ми впе якщо ми розкоментуємо попробуємо розкоментувати оцей блоккоду ми бачимо що виникають помилки от ми впевнюємося в тому що тепер напряму до них звернутися Ми не можемо до цих змінних от що таке об'єктноорієнтоване програмування на самому початку що таке клас далі вам потрібно буде ознайомитись з матеріалом який у вас буде на який буде вам наданий Ви матимете до нього доступ плюс також не забуваємо про виконання практичних завдань код який я вам демонстрував сьогодні буде також знаходитись в окремому файлу файл буде по посиланню до зустрічі на наступному уроці