Списки ініціалізаторів
С++ дає можливість ініціалізовувати члени-дані класу за допомогою списка ініціалізаторів (initializer list).
Візьмемо два конструктори для класу Rect та ініціалізуємо члени-дані за допомогою списка, а не в тілі функції, як раніше. Ось як це виглядатиме:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Rect::Rect(): Left(0), Top(0), Bottom(0), Right(0) { } Rect::Rect(int _left, int _top, int _bottom, int _right): Left(_left), Top(_top), Bottom(_bottom), Right(_right) { } |
Зверніть увагу, що список ініціалізаторів починається з двокрапки. А змінні в списку розділяються комами.
Деструктори
Деструктор – це спеціальна функція, яка автоматично викликається перед знищенням об’єкта.
Деструктор можна розглядати як протилежність конструктору. Зазвичай він використовується для вивільнення пам’яті, виділеної класу, чи виконує інші задачі по наведенню порядку після роботи класу. Клас не може мати більше одного деструктора. Наявність деструктора не є обов’язковою. Деструктор не повертає ніякого значення й не приймає аргументів. Його ім’я співпадає з ім’ям класу з додаванням символу тильда (~) попереду.
Як говорилося, деструктор викликається безпосередньо перед руйнуванням класу. Клас може бути зруйнований при виході з області видимості (у випадку розміщення у стеку), чи в результаті застосування оператора delete (у випадку динамічного розміщення). В будь-якомку випадку, виклик деструктора буде останньою дією перед остаточним зникненням класу.
Змінемо код для класу Rect:
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 |
class Rect { public: Rect(); Rect (int _left, int _top, int _bottom, int _right); ~Rect(); // доданий деструктор int GetWidth(); int GetHeigth(); void SetRect (int _left, int _top, int _bottom, int _right); private: int left; int top; int bottom; int right; char* text; // доданий новий член класу }; Rect::Rect(): Left(0), Top(0), Bottom(0), Right(0) { text=new char[256]; strcpy(text, “Hello!”); }
// проміжний код програми опущено Rect::~Rect() { Delete[] text; } |
Члени-дані
Члени-дані класу – це просто змінні, оголошені в опису класу. Їхньою областю видимості за замовчуванням є клас. У порівнянні з членами-даними структур, ви можете управляти доступом до членів-даних класу, оголошуючи їх як private, public чи protected. Незалежно від встановленого рівня доступу, члени-дані класу можуть використовуватись усіма функціями цього класу. Рівень доступу визначає видимість членів-даних поза класом. Наприклад, до закритих чи захищених членів-даних доступ ззовні неможливий. Звернення до відкритих членів-даних можливий лише через клас.
Розглянемо клас Rect. В ньому відсутні відкриті члени-дані. При спробі звернення до змінних цього класу ви отримаєте повідомлення про помилку:
1 2 |
Rect rect(10, 10, 200, 200); int x=rect.left; // помилка компіляції |
Змінна left є закритим членом класу й ви не можете звертатися до неї з програми. Якщо оголосити left в розділі public, то компіляція пройде успішно.
Для роботи з закритими членами-даними ви можете написати спеціальні функції. Одна функція буде повертати значення певного члена класу, а інша – змінювати його значення. Це будуть відкриті функції, що працюють із закритими членами-даними.
Проілюструємо це прикладом:
1 2 3 4 5 6 7 8 9 10 11 |
int Rect::GetLeft(); { return left; } void Rect::SetLeft(int newLeft) { left =newLeft; } //Тепер для отримання значення члена ви маєте дати команди: Rect rect; int x=rect.GetLeft(); |
