Статичні компоненти класу
Як уже зазначалося, кожен новостворюваний об'єкт класу має свою власну копію компонентних даних. Щоб ці компоненти класу були в єдиному екземплярі і не тиражувалися при визначенні кожного нового об'єкта класу, вони повинні бути оголошені в класі як статичні (static):
static імя_тіпа імя_статіческого_компонента_данних;
Як бачимо, статичний компонент даних є частиною класу, але не є частиною об'єкта цього класу. Всі об'єкти класу, в якому були оголошені статичні компоненти даних, так і об'єкти його похідних класів, тепер можуть спільно використовувати ці загальні для них компоненти.
Статичні компоненти даних класу розміщуються в пам'яті окремо від його нестатичних компонентів, причому пам'ять статичним компонентів виділяється тільки після їх визначення поза визначення класу.
Для зовнішнього визначення статичних компонентних даних можна скористатися наступними конструкціями:
імя_тіпа ім'я_класу. імя_статіческого_компонента_данних;
імя_тіпа ім'я_класу. імя_статіческого_компонента_данних = ініціалізатор;
імя_тіпа ім'я_класу. імя_статіческого_компонента_данних (ініціалізатор);
Ці конструкції повинні бути розміщені в глобальній області (global scope) після визначення класу.
Клас - абстрактний тип даних
Як бачимо, на відміну від звичайних компонентних даних статичні компоненти класу необхідно ще додатково визначати поза визначення класу. Зауважимо, що за замовчуванням значенням статичного компонента даних вбудованого типу є 0. перетворений в відповідний тип.
Нагадаємо тут, що конструктори статичних компонентних даних класу в одиниці трансляції викликаються до виклику функції main () в порядку їх визначень. Після виходу з функції main () будуть викликані деструктори для кожного такого об'єкта в порядку, зворотному викликам їх конструкторів.
Отже, статичному компоненту даних пам'ять виділяється тільки після його визначення поза класом, і лише після цього він стає доступним. Статичні компоненти даних після визначення можна використовувати в програмі ще до визначення об'єктів даного класу. По суті, статичний компонент даних - це просто глобальна змінна, область видимості якої обмежена класом, в якому вона і була оголошена. Основний сенс підтримки в С ++ статичних компонентів даних класу полягає в тому, що тепер відпадає необхідність у використанні глобальних змінних. При цьому не слід забувати про те, що використання класів поряд з глобальними змінними майже завжди порушує принцип інкапсуляції. Зауважимо також, що в деяких випадках клас використовується просто як область дії, в яку глобальні імена містяться під виглядом статичних компонентів, щоб не засмічувати глобальний простір імен.
Для звернення до статичних компонентів даних використовуються наступні імена:
кваліфікація без вказівки імені об'єкта
кваліфікація із зазначенням імені об'єкта
імя_об'екта .імя_класса. імя_статіческого_компонента_данних
Інший спосіб доступу до статичних компонентів даних передбачає явне використання покажчика на об'єкт класу:
або за допомогою оператора вибору члена ->
імя_указателя_на_об'ект_класса -> імя_статіческого_компонента_данних
або за допомогою оператора разименованія * і оператора вибору члена.
Формат визначення статичної компонентної функції: static імя_тіпа імя_статіческой_компонентной_функціі
Основи об'єктно-орієнтованого програмування в прикладах на С ++
Формат зовнішнього визначення статичної компонентної функції:
імя_тіпа ім'я_класу. імя_статіческой_компонентной_функціі (спісок_формальних_параметров_функціі) <тело_функции>
Статична компонентна функція зберігає всі основні особливості звичайних (нестатичних) компонентних функцій, тобто до неї можна звертатися, використовуючи ім'я вже існуючого об'єкта класу або покажчик на такий об'єкт.
Додатково статичну компонентну функцію можна викликати, використовуючи кваліфікацію без вказівки імені об'єкта:
ім'я_класу. імя_статіческой_компонентной_функціі (спісок_аргументов_визова)
За допомогою такої кваліфікації статичні компонентні функції можна викликати до визначення конкретних об'єктів класу, так як для доступу до статичних компонентів даних цих функцій зовсім не потрібно, щоб вони викликалися для конкретного об'єкта класу.
Наприклад, в наступному визначенні класу Complex введемо два статичних компонента класу - компонент даних counter для підрахунку кількості створених в програмі об'єктів класу Complex (конструктор буде здійснювати операцію инкрементирования, а деструктор - операцію декрементірованія) і компонентну функцію get_counterValue (). яка буде повертати значення лічильника counter:
// C ++ Абстрактний тип даних - комплексне число
#include // Компонентні дані - все загальнодоступні (public) double re; static int counter;Схожі статті