Приклад рішення задачі
Див. проект «Task12».
Контрольні питання
Як використовують спадкоємство в ООП?
Що таке атрибути та властивості класу?
Як реалізується поведінка сутності в ООП?
Які типи конструкторів використовують в C++?
Як реалізують доступ до схованих даних?
Що таке і які бувають аксесори?
Що таке стекові об’єкти?
Що таке динамічні об’єкти?
Які є особливості використання стекових та динамічних об’єктів?
Що таке діалоговий режим роботи програми?
13 Перевантаження функцій і операторів. Друзі
Лабораторна робота №13
Мета: вивчити можливості перевантаження функцій і особливості використання дружніх стосунків в класах при розробці програм на мові С++.
Індивідуальне завдання
При розробці проекту використовувати раніше обрану прикладну область та реалізовану функціональність.
Для обробки Об’єктів 2 і 3:
виконати перевантаження операторів =, <<, >>;
в iншому класi забезпечити:
введення даних для об’єкта з клавіатури;
виведення даних екземпляра класу на термiнал у розгорнутому виглядi;
виведення даних екземпляра класу на термiнал у виглядi одного форматованого рядка.
Продемонструвати використання дружніх стосунків.
Термінологія
Перевантаження процедур і функцій – можливість використання однойменних підпрограм (процедур або функцій) в мовах програмування.
Перенавантажені функції мають однакове ім’я, але різну кількість або типи аргументів. Питання про те, яку з функцій викликати, вирішується за списком її аргументів. Перевантажена функція фактично являє собою кілька різних функцій, і вибір відбувається на етапі компіляції.
Перевантаження функцій дозволяє використовувати одне і те ж ім’я для кількох функцій з різними типами параметрів.
Сигнатура функції визначається:
ім’ям функції;
класом чи простором імен (namespace), що містить функцію;
кваліфікаторами const і volatile;
типами параметрів функції.
Перевантаження операторів – особливість мови C++ – дає можливість розширення сенсу операторів. Це спрощує читання програми, оскільки робить можливим інтуїтивне сприйняття.
Оператори (наприклад, +) використовуються у двох варіантах: як особлива синтаксична форма або як функція.
class One {... };
One x, y, z;
z = x + y; // Інфіксна (нормальна) форма
z = operator+(x, y); // Функціональна форма (зовнішня функція)
z = x.operator+(y); // Функціональна форма (функція класу)
Перевантажені оператори успадковують пріоритети і атрибути угруповання від вбудованих операторів. Не існує обмежень на тип значення, що повертається перевантаженим оператором, і один оператор можна перевантажувати довільне число раз за умови, що сигнатури залишаються унікальними.
Перевантаження операторів можливе у формі зовнішніх функцій.
Будь-який оператор може бути перевантажений у формі функції класу і такий спосіб перевантаження є кращим.
Найпоширеніший приклад перевантаження у формі зовнішньої функції – оператор << в бібліотеці ostream.
class String {
friend ostream& operator<<(ostream& os, const String& str);
private:
char* s;
...
};
ostream& operator<<(ostream& os, const String& str) {
os << str.s; // friend
return os;
}
void main ( void ) {
String s1 = «Hello»;
cout << s1;
}
Клас може оголосити своїх друзів (friend). Друзі компілюються звичайним чином, за винятком того, що всі захищені і закриті елементи дружнього класу видно так, немов друг є функцією цього класу. Друзями можна оголошувати глобальні функції, класи і методи класів. У всіх методах класу-друга «видно» всі елементи того класу, другом якого він є.
Друзів прийнято оголошувати спочатку, перед елементами класу і перед ключовими словами public, protected і private, т.к. на них не діють звичайні атрибути видимості.
Do'stlaringiz bilan baham: |