Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Властивості класів,,,.docx
Скачиваний:
7
Добавлен:
26.10.2018
Размер:
252.91 Кб
Скачать

3.5.2 Дружні функції

Дружні функції, хоча і не належать якомусь класу, проте мають доступ до всіх приватних і захищених членів даних зовнішніх класів. Лістинг 3.12 узагальнює синтаксис оголошення дружніх функцій за допомогою ключового слова friendперед вказівкою повертаємого типу.

class className

 

(1

public: ~

className(); // Конструктор за умовчанням // Інші конструктори friend returnType friendFunction(<список параметрів>);

};

Лістинг 3.12. Оголошення дружніх функцій.

Якщо звичайні функції-члени мають автоматичний доступ до всіх даних свого класу за рахунок передачі прихованого параметра - покажчика this на екземпляр класу, то дружні функції вимагають явної специфікації цього параметра. Дійсно, оголошена в класі Х дружня функція F не належить цьому класу, а, отже, не може бути викликана операторами х. F і xptr->F (де х- екземпляр класу X, а xptr- його покажчик). Синтаксично коректними будуть звернення F (& х) або F (xpt r).

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

3.6 Нові можливості мови C++

C++Builder забезпечує не тільки підтримку останніх нововведенні стандарту ANSI C++, але і розширює мову новими можливостями. Компоненти, властивості, методи, обробники події, а також шаблони, простори імен, явні і непостійні оголошення, RTTI і виключення - вся потужність цих засобів доступна програмістам, використовуючим C++Builder для візуальної розробки додатків.

Важливо зрозуміти, що розширення мови ніколи не є самоціллю, і ви як і раніше зможете компілювати тексти, написані в рамках стандартного C++. Проте, щоб скористатися повною мірою перевагами, які надає C++Builder для технології швидкої розробки додатків (RAD), вам доведеться прийняти введені розширення мови.

Деякі з розширень (наприклад _classid) C++Builder резервує, головним чином, для внутрішнього використання. Інші розширення абсолютно очевидні (_int8, _intl6 і так далі), і тут не розглядаються. Нашу увагу буде сфокусовано на найбільш значущих розширеннях C++, які, в основному, відносяться до компонентних класів і постійно зустрічатимуться як в тексті книги, так і у ваших застосуваннях, що розробляються в середовищі C++Builder.

3.6.1 Компоненти

Компоненти часто досягають вищого ступеня інкапсуляції, ніж стандартні класи C++. Проілюструємо це на простому прикладі розробки діалогу, що містить кнопку. У типовій програмі C++ для Windows натиснення мишею на кнопку приводить до генерації повідомлення WM_IBUTTONDOWN. Це повідомлення повинне бути "зловлене" програмою або в операторові switch або у відповідному рядку таблиці відгуків (RESPONSE_TABLE), а потім передано процедурі реакції на це повідомлення. Так, додаток, написаний в рамках OWL (Object Windows Library), використовує макрос

DEFINE_RESPONSE_TABLE1(TEventTestDlgClient, TDialog)

//({TEventTestDlgClientRSP_TBL_BEGIN}}

EV_BN_CLICKED(IDEVENTBUTTON, EventBNClicked)

//({TEventTestDlgClientRSP_TBL_END}}

END_RESPONSE_TABLE;

щоб асоціювати подію (повідомлення WM_IBUTTONDOWN), що генерується кнопкою IDEVENTBUTTON в діалозі TEventTestDlgClient, з функцією реакції EventBNClicked.

C++Builder закінчив з цими важко освоюваними трюками програмістів. Компонент кнопки вже запрограмований так, щоб реагувати на натиснення кнопки подією OnClick. Все, що треба зробити - це вибрати готовий (або написати власний) метод і за допомогою Інспектора об'єктів включити його обробник даної події.