Список ініціалізації елементів Створюючи деякий об’єкт, його необхідно проініціалізувати. Для цієї мети С++ представляє функцію-член, яка називається конструктором. Конструктор класу викликається завжди, коли створюється об’єкт його класу. Конструктор має таке ж ім’я, що і клас, членом якого він є, і не має значення, яке повертається. Наприклад: #include <iostream.h> class AnyClass { int var; public: AnyClass();//Коструктор void Show(); }; AnyClass:: AnyClass() { cout<<”В конструкторі\n”; var=0; } void AnyClass::Show() { cout<<var; } int main() { AnyClass ob; ob.Show(); return0; } В цьому прикладі конструктор класу AnyClass виводить повідомлення на екран та ініціалізує значення закритої змінної класу var. Зауважимо, що програміст не повинен писати код, який викликає конструктор класу. Всю необхідну роботу виконує компілятор. Конструктор викликається тоді, коли створюється об’єкт його класу. Об’єкт, в свою чергу, створюється при виконанні оператора, який оголошує цей об’єкт. Таким чином, в С++ оператор оголошення змінної є виконавчим оператором. Для глобальних об’єктів конструктор викликається тоді, коли починається виконання програми. Для локальних об’єктів конструктор викликається завжди при виконанні оператора, який оголошує змінну. Функція-член, яка виконує дії, зворотні конструктору, називається деструктором. Ця функція-член викликається при видаленні об’єкта. Деструктор зазвичай виконує роботу по звільненні пам’яті, яка є зайнята об’єктом. Він має те ж саме ім’я, що і клас, якому він належить, з попереднім символом “~” і не має значення, яке повертається. Розглянемо приклад класу, який містить в собі деструктор: #include<iostream.h> class AnyClass { int var; public: AnyClass(); //Конструктор ~AnyClass(); //Деструктор void Show(); }; AnyClass:: AnyClass() { cout<<”Ми в конструкторі\n”; var=0; } AnyClass::~ AnyClass() { cout<<”Ми в деструкторі\n”; } void AnyClass::Show() { cout<<var<<”\n”; } int main() { AnyClass ob; ob.Show(); return 0; } Деструктор класу викликається в момент видалення об’єкта. Це означає, що для глобальних об’єктів він викликається при завершенні програми, а для локальних — коли вони виходять з області видимості. Зауважимо, що неможливо отримати вказівники на конструктор і деструктор. Зазвичай конструктор містить параметри, які дозволяють при побудові об’єкту задати йому деякі аргументи. В переглянутому вище прикладі конструктор ініціалізував закриту змінну var класу AnyClass значенням 0. Якщо потрібно проініціалізувати змінні класу, використовується конструктор з параметрами. Модифікуємо попередній приклад: #include<iostream.h> class AnyClass { int a, b; public: //Конструктор з параметрами AnyClass(int x, int y); //Деструктор ~AnyClass();void Show(); }; AnyClass:: AnyClass(int x, int y) { cout<<”Ми в конструкторі\n”; a = x; b = y; } AnyClass::~AnyClass() { cout<<”Ми в деструкторі\n”; } void AnyClass::Show() { cout<<a<<” ”<<b<<”\n”; } int main() { AnyClass ob(3,7); ob.Show(); return 0; } Тут значення, передане в конструктор при появі об’єкту ob, використовується при ініціалізації закритих змінних а і b цього об’єкту. Фактично, синтаксис передачі аргументу конструктору з параметрами є скороченою формою запису наступного виразу: AnyClass ob = Any Class(3,7); Проте майже завжди використовується скорочена форма синтаксису, яка наведена в прикладі. На відміну від конструктора, деструктор не може мати параметрів. Зрозуміло, чому це зроблено: не потрібно передавати аргументи об'єкту, який видаляється. Наведемо правила, які існують для конструкторів: · для конструктора не вказується тип значення, яке повертається; · конструктор не може передавати значення; · конструктор не успадковується; · конструктор не може бути оголошений з модифікатором const, volatile, static, virtual. Якщо в класі не визначений конструктор, компілятор генерує конструктор по замовчуванню, який не має параметрів. Для деструкторів існують наступні правила: · деструктор не може мати параметрів; · деструктор не може повертати значення; · деструктор не успадковується; · клас не може мати більше одного деструктора; · деструктор не може бути оголошений з модифікатором const, volatile, static, virtual; Якщо в класі не визначений деструктор, компілятор генерує деструктор по замовчуванню. Підкреслимо ще раз: конструктори і деструктори в С++ викликаються автоматично, що гарантує правильне створення і видалення об'єктів класу. Зазвичай дані члени класу ініціалізуються в тілі конструктора, але існує і інший спосіб ініціалізації — за допомогою списку елементів ініціалізації. Список ініціалізації елементів виділяються двокрапкою від заголовка визначення функції і містить дані члени і базові класи, розділені комами. Для кожного елемента в круглих дужках безпосередньо вказуються один чи декілька параметрів, які використовують при ініціалізації. В наступному прикладі для ініціалізації класу використовується список ініціалізації елементів. Class AnyClass() { int a, b; public: anyClass(int x, int y) }; //Конструктор використовує список ініціалізації AnyClass::AnyClass(int x, int y): a(x), b(y) { … } Хоча виконання ініціалізації в тілі конструктора чи за допомогою списку ініціалізації — справа смаку програміста, список ініціалізації є тільки одним методом ініціалізації даних-констант посилань. Якщо членом класу є об'єкт, то конструктор, який вимагає задання значень одного чи декілька параметрів, то єдиним можливим способом його ініціалізації є список ініціалізації. |