Статичні методи та статичні поля в Сі

Статичні методи та статичні змінні

Розглянемо ще раз клас Box. Тут для простоти всі поля зроблені публічними:

Box.h Box.cpp main.cpp

Код дуже простий, тут немає особливих моментів. Особливо хочеться звернути знімання те що, кожен екземпляр класу Box має власний набір значень depth, width, height. Поля класу належать екземпляру класу.

Метод getVolume, незважаючи на те, що є загальним для всіх екземплярів класу, застосовується до конкретного об'єкта та працює з його конкретними полями.

Крім таких полів та методів класу можна також визначати статичні поля та методи. Статичні члени класу належать класу, а чи не його екземплярам. Тобто вони будуть спільними для всіх створених об'єктів.

Наприклад, створимо статичне поле counter, яке збільшуватиметься на 1 щоразу, коли створюється новий екземпляр.

Статичне поле створюється за допомогою службового слова static

Тут слід звернути увагу на такі моменти.

  • 1. Звернення до статичного поля ведеться через ім'я класу Тим не менш, звертатися до статичного поля можна і через покажчик цього
  • 2. Статичне поле необхідно ініціалізувати. Ініціалізація відбувається у будь-якому місці cpp файлу. Для ініціалізації необхідно написати повне ім'я статичної змінної, опустивши static. У нашому випадку
  • 3. Статична змінна оголошена як protected. Тобто звернутися ззовні до неї зможе лише спадкоємець. Як і зі звичайними нестатичними змінними методи класу можуть без проблем звертатися до своєї власної змінної.

Тепер необхідно якимось чином отримати доступ до нашої змінної. Для цього напишемо метод, який повертаєзначення Counter.

В даному випадку, звернення a.getCounter() еквівалентне зверненню b.getCounter(), оскільки вони звертаються до загальної змінної counter.

Так як метод звертається до статичного поля, то він не потребує екземпляра класу для того, щоб його можна було викликати. Зробимо метод getCounter статичним

Визначення залишиться тим самим

Звертатися до методу можна через ім'я класу

Тим не менш, звертатися до статичного методу можна і через екземпляр класу

Але це погана практика.

Якщо метод статичний, то до нього можна звертатися до того, як було створено хоча б один екземпляр змінної. Тому статичний метод неспроможна звертатися до нестатичних полів класу. Крім того, статичний метод просто не знатиме, до якого екземпляра звернутися – всередині нього немає доступу до покажчика цього.

Наприклад, якщо ми оголосимо метод getVolume статичним, буде помилка компіляції з повідомленням

Оператор цього можна використовувати тільки всередині нестатичної функції-члена.

Для використання статичного методу, таким чином, не потрібно створювати окремого екземпляра класу, а звернення ведеться через ім'я класу та оператор ::

Статичні поля та методи, як і нестатичні, можуть мати модифікатори доступу private, protected і public.

Додамо статичний захищений метод, який перевірятиме поля переданого аргументу

Цей метод можна переписати так

Або, скориставшись законом де-Моргана, так

При використанні статичних методів заборонено модифікатор const методу, оскільки метод визначення не може звертатися до нестатичних полів і змінювати їх.