Короткі теоретичні відомості. Анатомія класу
Клас є описом того, як буде виглядати та вести себе його представник – екземпляр класу. Отже, клас можна представити як деякий шаблон, що визначає формат об’єкта класа.
Клас є типом даних. Він схожий на структуру. Клас, як і структура, являє собою набір даних та функцій, призначених для сумісного виконання певної задачі. Кажуть, що клас інкапсулює задачу. Класи мають наступні характерні елементи:
Засоби контролю доступу
Конструктори та деструктори
Члени-дані
Функції-члени
Спеціальний прихований покажчик з ім’ям this
Клас, як і структура, має бути попередньо оголошений. Оголошення класу зазвичай міститься в заголовному файлі. Для простих класів оголошення й визначення можуть бути розміщені в єдиному вихідному файлі програми. Проте при написанні реальних програм так не поступають. Як правило, для класу створюють окремий вихідний файл з ім’ям, близьким до імені класу, та розширенням .cpp. Заголовний файл для класу зазвичай має таке саме ім’я, що й вихідний файл, але з розширенням .h. Наприклад, якщо у вас є клас з ім’ям МyСlass, то вихідний файл слід назвати myclass.cpp, а заголовний - myclass.h.
Рівні доступу до членів класу
Ми говорили, що ключовою особливістю ООП є можливість приховування даних. В тому розумінні, що дані знаходяться всередині класу та захищені від несанкціонованого доступу функцій, розташованих поза класом.
Члени класів можуть мати три рівні доступу: закритий (private), відкритий (public) чи захищений (protected).
Рівні доступу до членів класу визначають спосіб роботи користувачів із класом. Програмуючи самостійно, ви можете бути як створювачем, так й їхнім користувачем.
Можна сказати, що структура є класом, всі члени якого відкриті. Фактично, це єдина відмінність структури від класу в С++. Структура може містити функції поряд із даними. Але структура не може використовувати модифікатори доступу, оскільки вона має тільки відкритий доступ.
Щоб зрозуміти роль рівнів доступу, перш за все необхідно розібратися в тому, як використовуються класи. Будь-який клас містить відкриту частину, до якої можливий доступ ззовні класу, та закриту частину. Закрита частина класу визначає його внутрішню реалізацію. В гарно спроектованому класі від користувача приховано все, що йому не потрібно знати.
Абстрактне представлення даних (data abstraction) – це закриття внутрішньої реалізації властивостей класу від погляду ззовні.
Абстрактне представлення даних дає користувачу можливість знати про клас рівно стільки, скільки необхідно, й запобігає від втручання туди, куди втручатися не слід.
Аналогія. Коли ви сідаєте в авто й повертаєте ключ запалювання, чи потрібно вам знати всі подробиці щодо роботи машини? Звичайно, ні. Ви хочете знати рівно стільки, скільки необхідно для безпечної поїздки. В цій аналогії кермо, педалі, ручка перемикання передач, спідометр і т. і. являють собою інтерфейс між водієм та авто. Водій знає, якими з цих елементів потрібно користуватися, щоб машина їхала туди, куди він хоче. Можна сказати, що двигун, трансмісія та електрообладнання авто приховані від погляду ззовні. Двигун буде працювати навіть в тому випадку, якщо ви ніколи не захочете відкрити капот. (Це робота СТО). Його будова – це деталі, які вам не потрібно знати. Вони скриті від вас. Уявіть, про яку кількість речей доведеться турбуватися, якщо слідкувати за всім, що відбувається в машині: чи правильно карбюратор готує суміш? Чи достатньо мастил у диференціалі? Чи вистачає напруги генератора? І т. д., і т. п. Кому це потрібно?
Таким самим чином в класах закритий доступ до внутрішніх деталей, щоб користувач міг не турбуватися про те, що відбувається „під капотом”. Внутрішня робота класу закрита, тоді як інтерфейс користувача є відкритим.
Захищений рівень доступу пояснити дещо складніше. До захищених членів класу, як і до закритих, користувач звертатися не може. Проте ці члени можуть бути доступні для класів, які є похідними даного класу.
В мові С++ є три ключові слова, що встановлюють рівні доступу. Це слова private, public та protected. Рівні доступу до членів класу встановлюються при оголошенні класу. Для оголошення класу слугує ключове слово class. Оголошення класу виглядає схожим на оголошення структури, але з додаванням модифікаторів доступу. Синтаксис класу може бути таким:
1 2 3 4 5 6 7 8 9 |
class МyСlass { public: // оголошення відкритих членів protected: // оголошення захищених членів private: // оголошення закритих членів }; |
Наприклад, клас Avto
1 2 3 4 5 6 7 8 9 10 11 12 13 |
class Avto { public: bool haveKey; bool Start(); void ShutDown(); protected: void StartUp(); private: void StartElectronicalSystem(); bool started; int speed; }; |
Наприклад, клас Rect, що слугує для представлення прямокутника.
1 2 3 4 5 6 7 8 9 10 11 |
{ public: int GetWidth(); int GetHeigth(); void SetRect(int _left,int _top,int _bottom,іnt _right); private: int left; int top; int bottom; int right; }; |
Ви не зобов’язані використовувати всі три рівні доступу в своїх класах. За бажанням можна взагалі не встановлювати рівні доступу, але зазвичай у вас будуть присутні щонайменше два з них – public та private.
За замовчуванням члени класу мають рівень доступу private. Якщо ви не використовуєте при оголошенні класу модифікатори доступу, всі дані і функції класу будуть закритими.
Приклад демонструє простий невеликий об’єкт
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
#include <iostream> #include <conio.h> // для getch() using namespace std; class Object // визначення класу { private: int data; // поле класу public: void setdata(int d) // метод класу, змінюючий значення поля { data = d; } void showdata() // метод класу, відображуючий значення поля { cout << "Значення поля дорівнює " << data << endl; } }; int main() { Object s1, s2; // визначення двох об’єктів класу Object s1.setdata(1066); // виклики методу setdata() s2.setdata(1776); s1.showdata(); // виклики методу showdata() s2.showdata(); getch(); return 0; } |
