Урок 23. Конструктор і деструктор
При створенні об'єктів однієї з найбільш широко використовуваних операцій, яку ви будете виконувати в ваших програмах, є ініціалізація елементів даних об'єкта. Як ви дізналися з уроку 22, єдиним способом, за допомогою якого ви можете звернутися до приватних елементів даних, є використання функцій класу. Щоб спростити процес ініціалізації елементів даних класу, C ++ використовує спеціальну функцію, звану конструктором, яка запускається для кожного створюваного вами об'єкта. Подібним чином C ++ забезпечує функцію, звану деструктором, яка запускається при знищенні об'єкта. В даному уроці конструктор і деструктор розглядаються більш докладно. До кінця цього уроку ви освоїте наступні основні концепції:
Конструктор являє собою метод класу, який полегшує вашим програмам ініціалізацію елементів даних класу.
Конструктор має таке ж ім'я, як і клас.
Конструктор не має значення, що повертається.
Кожен раз, коли ваша програма створює змінну класу, C ++ викликає конструктор класу, якщо конструктор існує.
Багато об'єктів можуть розподіляти пам'ять для зберігання інформації; коли ви знищуєте такий об'єкт, C ++ викликатиме спеціальний деструктор, який може звільняти цю пам'ять, очищаючи її після об'єкта.
Деструкція має таке ж ім'я, як і клас, за винятком того, що ви повинні випереджати його ім'я символом тильди (
Деструкція не має значення, що повертається.
Терміни конструктор і деструктор не повинні вас лякати. Замість цього уявіть конструктор як функцію, яка допомагає вам будувати (конструювати) об'єкт. Подібно до цього, деструктор являє собою функцію, яка допомагає вам знищувати об'єкт. Деструкція зазвичай використовується, якщо при знищенні об'єкта потрібно звільнити пам'ять, яку займав об'єкт.
Конструктор являє собою метод класу, який має таке ж ім'я, як і клас. Наприклад, якщо ви використовуєте клас з ім'ям employee, конструктор також матиме ім'я employee. Подібно до цього, для класу з ім'ям dogs конструктор буде мати ім'я dogs. Якщо ваша програма визначає конструктор, C ++ буде автоматично викликати його кожен раз, коли ви створюєте об'єкт. Наступна програма CONSTRUC.CPP створює клас з ім'ям employee. Програма також визначає конструктор з ім'ям employee який присвоює початкові значення об'єкту. Однак конструктор не повертає ніякого значення, незважаючи на те, що він не оголошується як void. Замість цього ви просто не вказуєте тип значення:
У вашій програмі ви просто визначаєте конструктор так само, як будь-який інший метод класу:
employee :: employee (char * name, long employee_id, float salary)
Як бачите, конструктор не повертає значення викликала функції. Для нього також не використовується тип void. В даному випадку конструктор використовує оператор глобального дозволу і ім'я класу перед ім'ям кожного елемента, як вже обговорювалося в уроці 23. Нижче приведена реалізація програми CONSTRUC.CPP:
employee :: employee (char * name, long employee_id, float salary)
employee worker ( "Happy Jamsa", 101, 10101.0);
Якщо вашій програмі буде потрібно створити кілька об'єктів employee, ви можете форматувати елементи кожного з них за допомогою конструктора, як показано нижче:
employee worker ( "Happy Jamsa", 101, 10101.0);
employee manager ( "Jane Doe", 1022, 30000.0);
Подання про конструктора
Конструктор являє собою спеціальну функцію, яку C ++ автоматично викликає кожен раз при створенні об'єкта. Звичайне призначення конструктора полягає в ініціалізації елементів даних об'єкта. Конструктор має таке ж ім'я, як і клас. Наприклад, клас з ім'ям file використовує конструктор з ім'ям file. Ви визначаєте конструктор всередині своєї програми так само, як і будь-який метод класу. Єдина відмінність полягає в тому, що конструктор не має значення, що повертається. Коли ви пізніше оголошуєте об'єкт, ви можете передавати параметри конструктору, як показано нижче:
class_name object (valuel, value2, value3)
Конструктори і параметри за замовчуванням
Як ви вже знаєте з уроку 15, C ++ дозволяє вказувати значення за замовчуванням для параметрів функції. Якщо користувач не вказує будь-яких параметрів, функція буде використовувати значення за замовчуванням. Конструктор не є винятком; ваша програма може вказати для нього значення за замовчуванням так само, як і для будь-якої іншої функції. Наприклад, наступний конструктор employee використовує за замовчуванням значення окладу рівним 10000.0, якщо програма не вказує оклад при створенні об'єкта. Однак програма повинна вказати ім'я службовця і його номер:
employee :: employee (char * name, long employee_id, float salary = 10000.00)
Як ви вже знаєте з уроку 13, C ++ дозволяє вашим програмам перевантажувати визначення функцій, вказуючи альтернативні функції для інших типів параметрів. C ++ дозволяє вам також перевантажувати конструктори. Наступна програма CONSOVER.CPP перевантажує конструктор employee. Перший конструктор вимагає, щоб програма вказувала ім'я службовця, номер службовця і оклад. Другий конструктор запитує користувача ввести необхідний оклад, якщо програма не вказує його:
employee :: employee (char * name, long employee_id)
Всередині визначення класу програма повинна вказати прототипи для обох конструкторів, як показано нижче:
Нижче приведена реалізація програми CONSOVER.CPP:
employee :: employee (char * name, long employee_id, float salary)
employee :: employee (char * name, long employee_id)
Якщо ви откомпіліруете і запустіть цю програму, на вашому екрані з'явиться запит ввести оклад для Jane Doe. Коли ви введете оклад, програма відобразить інформацію про обох службовців.