Return 0;
}
Програма 11.4
Клас Counter містить єдине поле count типу unsigned int, оскільки значення лічильника не може бути від’ємним, і три методи: конструктор Counter(); inc_count(), що інкрементує поле count і get_count, що повертає значення лічильника.
Автоматична ініціалізація
Коли створюється об’єкт типу Counter, хотілося б, щоб його поле count було ініціалізоване нульовим значенням, оскільки більшість лічильників починає свій відлік саме з нуля. Ми могли б провести ініціалізація за допомогою функції set_count() з аргументом, рівним 0, чи створити спеціальний метод zero_count, який обнулює значення функції. Недолік такого підходу полягає в тому, що ці функції необхідно викликати явно кожен раз при створенні об’єктів типу Counter:
Counter c1;
c1.zero_count();
Подібні дії легко можуть спричинити неправильну роботу всієї програми, оскільки програмісту для цього достатньо забути проініціалізувати хоч одну змінну після її створення. Якщо в програмі створюється багато таких змінних, значно простіше і надійніше було б ініціалізувати їх відразу ж після створення. В програмі 11.4 цю дію виконує конструктор Counter(). Конструктор викликається автоматично при створенні кожного з об’єктів. Таким чином, в функції main() оператор
Counter c1,c2;
створює два об’єкти типу Counter. При створенні кожного з них викликається конструктор Counter(), що присвоює полю сount нульове значення. Таким чином, крім створення змінних, даний оператор ще й присвоює їх полям початкове (нульове) значення.
Ім’я конструктора
В конструктора є кілька особливостей, що відрізняють його від інших методів класу. По-перше, ім’я конструктора точно співпадає з іменем класу. Таким чином, компілятор відрізняє конструктори від інших методів класу. По-друге, конструктор не повертає ніякого значення. Це пояснюється тим, що конструктор автоматично викликається системою і, отже, не існує викликаючої програми чи функції, якій конструктор міг би повернути значення. відсутність типу повернутого значення у конструкторів є другою ознакою, за якою компілятор може відрізнити їх від інших методів класу.
Список ініціалізації
Найчастіше на конструктор покладається задача ініціалізації полів об’єкту класу. Для кожного об’єкту класу Counter конструктор виконує ініціалізацію поля count нулем. Але це робиться не звичайним способом, наприклад:
Counter()
{count=0; }
Така форма запису не рекомендується, хоча вона й не містить помилок. Ініціалізація в нашому прикладі відбувається інакше:
Counter():count(0) //Конструктор
{ };
Ініціалізація розміщена між прототипом методу і тілом функції, перед нею проставлена двокрапка. Ініціалізуюче значення поміщене в лапках після імені поля.
Якщо необхідно ініціалізувати відразу кілька полів класу, то значення розділяють комами і в результаті виходить список ініціалізації
someClass(): m1(7), m2(33), m3(4);
Причини, через які ініціалізація не проводиться в тілі конструктора, достатньо складні. Ініціалізація полів за допомогою списку ініціалізації відбувається до початку виконання тіла конструктора, що в деяких випадках буває важливо. Так, наприклад, список ініціалізації – це єдиний спосіб задати початкові значення констант і посилань. В тілі конструктора, як правило, відбуваються складніші дії, ніж звичайна ініціалізація.
Результати роботи програми з лічильником
Щоб переконатися. що конструктор викликається при кожному описі змінної об’єктного типу, дещо зміними вигляд конструктора:
Counter():count(0) //Конструктор
{cout << “constructor”<<endl; };
і запустимо програму на виконання. Фраза «constructor» з’явиться на екрані двічі.
Конструктори і власні типи даних
Розробники компіляторів повинні потурбуватися, щоб для будь-якої змінної стандартного типу, яку програміст визначає у своїй програмі, викликався необхідний конструктор. Наприклад, якщо в програмі зустрічається змінна цілого типу, десь повинен існувати конструктор, який виділить для цієї змінної 4 байти пам’яті. Таким чином, навчившись створювати власні конструктори, ми можемо виконувати задачі, з якими стикаються розробники компіляторів. Ми зробили ще один крок на шляху до створення власних типів даних.
Дата добавления: 2015-08-26; просмотров: 754;