Урок №133. Статичні методи класу

  Юрій  | 

  Оновл. 13 Лют 2021  | 

 71

На попередньому уроці ми дізналися, що статичні змінні-члени — це члени, які належать класу, а не його об’єктам.

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

Якщо статичні змінні-члени є відкритими, то ми можемо отримати доступ до них напряму через ім’я класу і оператор дозволу області видимості. Але що, якщо статичні змінні-члени є закритими? Розглянемо наступний код:

В цьому випадку ми не можемо напряму отримати доступ до Anything::s_value з функції main(), так як цей член є private. Зазвичай, доступ до закритих членів класу здійснюється через public-методи. Хоча ми могли б створити звичайний метод для отримання доступу до s_value, але нам тоді довелося б створювати об’єкт цього класу для використання методу! Є кращий варіант — ми можемо зробити метод статичним.

Подібно статичним змінним-членам, статичні методи не прив’язані до якогось одного об’єкту класу. Ось вищенаведений приклад, але вже зі статичним методом:

Оскільки статичні методи не прив’язані до певного об’єкту, то їх можна викликати напряму через ім’я класу і оператор дозволу області видимості, а також через об’єкти класу (але це не рекомендується).

Статичні методи не мають прихованого вказівника *this

У статичних методів є дві цікаві особливості.

По-перше, оскільки статичні методи не прив’язані до об’єкта, то вони не мають прихованого вказівника *this! В цьому є сенс, тому що вказівник *this завжди вказує на об’єкт, з яким працює метод. Статичні методи можуть не працювати через об’єкт, тому і вказівник *this не потрібен.

По-друге, статичні методи можуть напряму звертатися до інших статичних членів (змінних або функцій), але не можуть напряму звертатися до нестатичних членів. Це пов’язано з тим, що нестатичні члени належать об’єкту класу, а статичні методи — ні!

Ще один приклад

Статичні методи можна визначати поза тілом класу. Це працює так само, як і зі звичайними методами. Наприклад:

Результат виконання програми:

The next ID is: 1
The next ID is: 2
The next ID is: 3
The next ID is: 4

Зверніть увагу, оскільки всі змінні і функції цього класу є статичними, то нам не потрібно створювати об’єкт цього класу для роботи з ним! Статична змінна-член використовується для зберігання значення наступного ідентифікатора, який повинен бути їй присвоєний, а статичний метод — для повернення ідентифікатора і його збільшення.

Попередження про класи зі всіма статичними членами

Будьте обережні при написанні класів зі всіма статичними членами. Хоча такі «чисто статичні класи» можуть бути корисні, але вони також мають свої недоліки.

По-перше, оскільки всі статичні члени створюються тільки один раз, то кількох копій «чисто статичного класу» бути не може (без клонування класу і його подальшого перейменування). Наприклад, якщо нам потрібні два незалежних об’єкти класу IDGenerator, то це буде неможливо через «чисто статичний» клас.

По-друге, з уроку про глобальні змінні ми знаємо, що глобальні змінні небезпечні, оскільки будь-яка частина коду може змінити їх значення і, в кінцевому підсумку, змінить інші фрагменти, здавалося б, не пов’язаного з цими змінними коду. Те ж саме справедливо і для «чисто статичних» класів. Оскільки всі члени належать класу (а не його об’єктам), а класи мають глобальну область видимості, то в «чисто статичному класі» ми оголошуємо глобальні функції і змінні з усіма мінусами, які вони мають.

C++ не підтримує статичні конструктори

Якщо ви можете ініціалізувати звичайну змінну-член через конструктор, то логічно, що ви повинні мати можливість ініціалізувати статичні змінні-члени через статичний конструктор. І, хоча деякі сучасні мови програмування дійсно підтримують використання статичних конструкторів саме для цієї мети, мова C++, на жаль, не є однією з таких.

Якщо ваша статична змінна може бути ініціалізована напряму, то конструктор не потрібен: ви можете визначити статичну змінну-член, навіть якщо вона є private. Ми робили це у вищенаведеному прикладі з s_nextID. Ось ще один приклад:

Якщо для ініціалізації вашої статичної змінної-члена потрібно виконати код (наприклад, цикл), то є кілька різних способів це зробити. Наступний спосіб є кращим з них:

Результат виконання програми:

o a u i e

При визначенні статичного члену s_initializer викличеться конструктор за замовчуванням _nested() (так як s_initializer є об’єктом класу _nested). Ми можемо використовувати цей конструктор для ініціалізації будь-яких статичних змінних-членів класу Something. Найкрутіше тут — це те, що весь код ініціалізації прихований всередині вихідного класу зі статичним членом.

Висновки

Статичні методи можуть використовуватися для роботи зі статичними змінними-членами класу. Для роботи з ними не потрібно створювати об’єкти класу.

Класи можуть бути «чисто статичні» (з усіма статичними змінними-членами і статичними методами). Проте, такі класи, по суті, еквівалентні оголошенню функцій і змінних в глобальній області видимості, і цього слід уникати, якщо у вас немає на це вагомих причин.

Оцінити статтю:

1 Зірка2 Зірки3 Зірки4 Зірки5 Зірок (2 оцінок, середня: 5,00 з 5)
Loading...

Залишити відповідь

Ваш E-mail не буде опублікований. Обов'язкові поля відмічені *