
- •2. Види констант та константні вирази.
- •3. Вирази та операції, пріоритет операцій та порядок обчислення виразів.
- •3. Логічні операції.
- •4. Побітові операції.
- •6. Операції інкременту та декременту.
- •7. Умовна операція (умовний вираз).
- •4. Основні інструкції :
- •5. Адресація; вказівники та динамічні змінні; адресна арифметика; динамічний розподіл пам’яті в мові с.
- •6. Масиви та їх зв’язок з вказівниками; символьні масиви; двовимірні масиви.
- •7. Стандартний форматований ввід та вивід інформації в с.
- •1. Форматований стандартний вивід в с.
- •2. Форматований стандартний ввід в с.
- •9. Функції в мові с:
- •12. Об’єднання.
- •13. Організація файлів та робота з ними в мові с.
- •14. Основні директиви препроцесора, макровизначення та проблема їх використання.
- •15. Загальна структура програми в мові с.
- •16. Аргументи функції main().
- •17. Структура програми мовою с.
- •19. Вбудовані функції.
- •20. Параметри функцій за замовчуванням.
- •21. Змінні типу посилань.
- •22. Операції new та delete.
- •23. Перевантаження функцій.
- •26. Дані-члени та функції-члени класу, вказівник this.
- •27. Статичні члени класу – дані та методи.
- •28. Конструктори та деструктор класу, конструктор копіювання.
- •29. Спадкування: базовий та похідний клас, віртуальні функції, поліморфізм, абстрактний клас.
- •30. Перевантаження операторів.
- •1. Дружні функції.
- •2. Вказівник this.
- •31. Шаблони функцій та класів.
- •1. Шаблони функцій.
- •2. Шаблони класів.
- •32. Файлові потоки; стандартні потоки введення-виведення, форматування.
- •33. Контейнерні типи даних.
27. Статичні члени класу – дані та методи.
Статичні дані-члени (поля) класів використовуються для збереження даних, спільних для всіх екземплярів класу, наприклад, кількість екземплярів класу, вказівник на вершину динамічного списку, деяку глобальну для всього класу константу, тощо. Статичний член класу має бути продекларованим у класі з допомогою службового слова static, а процес виділення під нього пам'яті та його ініціалізація відбувається поза класом.Звертання до статичних членів можливе через ім'я класу або через ідентифікатор екземпляру (В С# - тільки через ім'я класу). На статичні члени розповсюджуються звичайні правила доступу.
Слід зауважити, що в класі присутня лише декларація статичного члену, для його створення необхідно виділити пам'ять під нього та в разі необхідності проініціалізувати - це відбувається поза межами класу, навіть якщо статичний член задекларований як закритий. Більше того, якщо статичний член класу (скалярного типу) помічений службовим словом const, то він може бути проініціалізований в класі, але пам'ять під нього все рівно має бути виділена поза класом!
Операція sizeof не враховує пам'ять, виділену під статичні поля.
Приклад class Example
{ public :
static int num; // декларація статичного члену класу
int key;
Example (int key_) : key (key_) {} };
int Example :: num;//виділення пам'яті під статичний член, в разі відсутності ініціалізації він = 0
int main(int argc, char *argv[])
{Example e (1), f (10);
cout « Example :: num « endl; // звертання через ім'я класу
Example :: num = 100;
cout « e.num « endl; // звертання через ім'я екземпляру
cout « f.num. « endl; // звертання через ім'я екземпляру
e.num = 1000;
cout « e.num « endl;
cout « f.num « endl;}
Статичні функції-члени класів використовуються тільки для звертання до статичних даних-членів і не можуть використовувати звичайні дані та методи класу, адже вони не прив'язані до екземпляру, їм не передається вказівник this. Службове слово static вказується лише у декларації статичної функції, при її визначенні воно не повторюється. Звертання до статичних методів так само може відбуватись і через ім'я класу, і через ідентифікатор екземпляру. Слід зауважити, що звичайні функції-члени класу мають право працювати із статичними членами класу. Конструктор та деструктор не можуть бути статичними!
28. Конструктори та деструктор класу, конструктор копіювання.
Конструктори і деструктори
Необхідність у ініціаллізації ще більш часто проявляється при роботі з об'єктами. Дійсно, якщо звернутися до реальних проблем, то, фактично, для кожного створюваного вами об'єкта потрібно якогось виду ініціалізація. Для вирішення цієї проблеми в C + + є функція-конструктор (Constructor function), яка включається в опис класу. Конструктор класу визується щоразу під час створення об'єкта цього класу. Таким чином, будь-яка необхідна об'єкту ініціалізація за наявності конструктора виконується автоматично. Конструктор має те ж ім'я, що й клас, частиною якого він є, і не має що повертається значення. Наприклад, нижче представлений невеликий клас з конструктором. Для глобальних об'єктів конструктор об'єкта викликається тоді, коли починають нается виконання програми. Для локальних об'єктів конструктор викликаючи- ється всякий раз при виконанні інструкції оголошення змінної. Функцією, зворотного конструктору, є деструктор (destructor). Ця функція викликається при видаленні об'єкта. Зазвичай при роботі з об'єктом в момент його видалення повинні виконуватися деякі дії. Наприклад заходів, під час створення об'єкта для нього виділяється пам'ять, яку необхідно звільнити при його видаленні. Ім'я деструктора збігається з ім'ям класу, але з символом ~ (тильда) на початку. Деструктор класу викликається при видаленні об'єкта. Локальні об'єкти видаляються тоді, коли вони виходять з області видимості. Глобальні об'єкекти видаляються при завершенні програми. Адреси конструктора і деструктора отримати неможливо.
Конструктори з параметрами
Конструктору можна передавати аргументи. Для цього просто додайте необхідні параметри в оголошення і визначення конструктора. Потім за оголошенні об'єкта задайте параметри в якості аргументів. Щоб поняти, як це робиться, почнемо з короткого прикладу:
Конструктор за замовчуванням.
Так називають конструктор, який дозволяє створювати екземпляри класів з неявною ініціалізацією даних. Як вже зазначалось, такий конструктор автоматично створюється для класів, в яких не визначений власний конструктор. Проте, як тільки в класі визначається хоч один конструктор, такий автоматичний конструктор перестає діяти. В разі необхідності створення екземплярів без ініціалізації, варто визначити в класі конструктор за умовчанням. Найпростіший спосіб зробити це - перевантажити конструктор, або визначити умовчання для всіх його параметрів.
Конструктор копіювання.
Справа полягає в тому, що параметр типу Student передається у функцію f () за значенням, а отже, створюється, а потім знищується зі стеку. Тому і виникає зайвий виклик деструктора. Але конструктор при створенні локального екземпляру класу у стеку не викликався! Дійсно створенням екземплярів, які необхідно ініціалізувати значенням вже існуючого екземпляру займається інший конструктор -так званий конструктор копіювання. В даному прикладі був викликаний такий конструктор, створений компілятором. Він просто поелементно копіює даний екземпляр. Але це не завжди доречно, адже, можливо, необхідне виділення пам'яті для даних членів, тощо. Для явного визначення конструктора копіювання необхідно дотримуватись особливого синтаксису: <ім'я_класу> (const <ім'я_класу> & );
Параметром конструктора копіювання є стала змінна-посилання на екземпляр класу. Його призначення - коректне створення копії екземпляру. Особливо важливо це у випадку, коли членами класу є вказівники, пам'ять під які виділяється оператором new. Адже тоді по-елементне копіювання копіює вказівник (поверхневе копіювання), а не об'єкт, на який він посилається, - для цього необхідне глибоке копіювання.