Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Не підтверджено.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
3.08 Mб
Скачать

Int mainO

{

// Створення покажчика на void-функцію з одним int-параметром, void (*fp1)(int);

/* Створення покажчика на void-функцію з одним int-параметром і одним параметром типу char. */ void (*fp2)(int, char);

fp1 = space; // Отримуємо адресу функції space(int)

fp2 = space; // Отримуємо адресу функції space(int, char)

fp1 (22); // Виводимо 22 пропуски (цей виклик є аналогічним // виклику (*fp1)(22)). cout«"І" « endl;

fp2(30, 'х'); // Виводимо ЗО символів "х" (цей виклик є // аналогічним до виклику (*fp2)(30, 'х'). cout«"І" « endl;

getchO; return 0;

}

Ось як виглядають результати виконання цієї програми:

І

хххххххххххххххххххххххххххххх|

Як зазначено у коментарях до цієї програми, компілятор здатний визначити, адресу якої перевизначеної функції він отримує, на основі того, як оголошено по­кажчики fp1 і fp2.

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

  1. Поняття про статичні члени-даних класу

Ключове слово static можна застосовувати і до членів-даних класу. Оголошу­ючи член-даних класу статичним, ми тим самим повідомляємо компілятор про те, що, незалежно від того, скільки об'єктів цього класу буде створено, існує тільки одна копія цього static-члена. Іншими словами, static-член розділяється між всіма об'єктами класу. Всі статичні дані під час першого створення об'єкта ініціалізу- ються нульовими значеннями, якщо перед цим не представлено інших значень іні­ціалізації.

Під час оголошення статичного члена-даних у класі програміст не повинен його визначати. Необхідно забезпечити його глобальне визначення поза цим кла­сом. Це реалізується шляхом повторного оголошення цієї статичної змінної за до­помогою оператора дозволу області видимості, який дає змогу ідентифікувати, до якого класу вона належить. Тільки у цьому випадку для цієї статичної змінної бу­де виділено пам'ять.

Розглянемо приклад використання static-члена класу. Вивчіть код цієї програ­ми і постарайтеся зрозуміти, як вона працює.

Код програми 11.9. Демонстрація механізму використання статичних

#include <vcl> #include <iostream> #include <conio> using namespace std;

членів-даних класу

// Для потокового введення-виведення // Для консольного режиму роботи // Використання стандартного простору імен

class ShareVar { static int n; public:

void Set(int c) {n = c;} void ShowQ {cout« n «"}

};

int ShareVar::n; // Визначаємо static-член n int mainO {

ShareVar ObjA, ObjB;

ObjA.ShowO; // Виводиться 0 ObjB.ShowO; // Виводиться 0

ObjA.Set(IO); // Встановлюємо static-членэ n дорівнює 10 ObjA.ShowO; Ч Виводиться 10 ObjB.ShowO;//Також виводиться Ю

getchO; return 0;

}

Зверніть увагу на те, що статичний цілочисельний член п оголошений і у кла­сі ShareVar, і його визначено як глобальна змінна. Як було сказано вище, необхід­

ність такого подвійного оголошення зумовлена тим, що під час оголошення члена п у класі ShareVar пам'ять для нього не виділяється. Компілятор C++ ініціалізував змінну п значенням 0, оскільки ніякої іншої ініціалізації у програмі немає. Тому внаслідок двох перших викликів функції Show() для об'єктів ObjA і ObjB відобра­жається значення 0. Потім об'єкт ObjA встановлює члену п значення, яке дорівнює 10, після чого об'єкти ObjA і ObjB знову виводять на екран його значення за допомо­гою функції ShowO- Але оскільки існує тільки одна копія змінної п, що розді­ляється об'єктами ObjA і ObjB, то значення 10 буде виведено під час виклику фун­кції ShowO Для обох об'єктів.

Нео! хідноапам ятати! Під час оголошення члена класу статичним Ви за­безпечуєте створення тільки однієї його копії, яка буде сумісно використову­ватися всіма об'єктами цього класу.

Якщо static-змінна є відкритою (тобто public-змінною), до неї можна звертати­ся безпосередньо через ім'я її класу, без посилання на будь-який конкретний об'­єкт1. Розглянемо, наприклад, таку версію класу ShareVar: class ShareVar { public:

static int n;

void Set(int c) { n = c;}; void ShowO {cou*<< n <<" }

};

У даній версії змінна n є public-членом даних класу. Це дає змогу нам зверта­тися до неї безпосередньо, як це показано в такій настанові:

ShareVar::n = 100;

У цьому записі значення змінної п встановлюється незалежно від об'єкта, а для звернення до неї достатньо використовувати ім'я класу і оператора дозволу облас­ті видимості. Більше того, ця настанова є правомірною навіть для створення яких- небудь об'єктів типу ShareVar. Таким чином, отримати або встановити значення sta­tic -члена класу можна до того, як будуть створені будь-які об'єкти.

І хоча Ви, можливо, поки що не відчули потреби в static-членах класу, проте, у міру набуття досвіду програмування мовою C++, Вам доведеться наштовхнути­ся на ситуацію, коли вони виявляться дуже корисними, тобто дадуть змогу уник­нути застосування глобальних змінних.

Можна також оголосити статичною і функцію-члена класу, але це непошире- на практика. До статичної функції-члена класу можуть отримати доступ тільки ін­ші static-члени цього класу2. Статична функція-член не має покажчика this. Ство­рення віртуальних статичних функцій-членів класу не дозволяється. Окрім цього, їх не можна оголошувати з модифікаторами const або volatile. Статичну функцію- члена можна викликати для об'єкта її класу або незалежно від будь-якого об'єкта, а для звернення до неї достатньо використовувати ім'я класу і оператор дозволу області видимості.

  1. Застосування до функцій-членів класу модифікаторів const і mutable

Функції-члени класу можуть бути оголошені з використанням модифікатора const. Це означає, що з покажчиком this у цьому випадку необхідно звертатися як з const-покажчиком. Іншими словами, const-функція не може модифікувати об'єкт, для якого вона викликана. Окрім цього, const-об'єкт не може викликати не const- функцію-члена класу. Але const-функцію-члена можуть викликати як const-, так і не const-об'єкти.

Щоб визначити функцію як const-члена класу, використовується формат, який подано у наведеному нижче прикладі: class аТуре { // Оголошення класового типу int some_var; public: