Попередня сторінка Зміст Наступна сторінка Електронні посібники ВНТУ
ЛАБОРАТОРНА РОБОТА № 13
ПОЛІМОРФІЗМ. ПЕРЕВАНТАЖЕННЯ ФУНКЦІЙ, ОПЕРАТОРІВ І МЕТОДІВ КЛАСУ
Мета роботи
- Засвоїти правила створення перевантажених функцій.
- Навчитись перевантажувати унарні та бінарні оператори.
- Навчитись на практиці перевантажувати функції і операції у класах.
ТЕОРЕТИЧНІ ВІДОМОСТІ
Перевантаження функцій
При визначенні функцій в своїх програмах необхідно вказати тип значення, що повертається функцією, а також кількість параметрів і тип кожного з них. Припустимо, є функція з ім'ям add_values, яка працює з двома цілими значеннями, а нам треба використовувати подібну функцію для додавання трьох цілих значень. Тоді слід створити функцію з іншим ім'ям, наприклад, add_two_values і add_three_values. Аналогічно якщо ви хотіли використовувати подібну функцію для складання значень типу float, то була б необхідна ще одна функція з ще одним ім'ям.
Для уникнення дублювання функції C++ дозволяє вам визначати декілька функцій з одним і тим же ім'ям. У процесі компіляції C ++ бере до уваги кількість аргументів, що використовуються кожною функцією, і потім викликає саме потрібну опцію. Надання компілятору вибору серед декількох функцій називається перевантаженням функцій.
Обмеження на перевантажені функції:
- Будь-які перевантажені функції повинні мати різні списки параметрів (при цьому аргумент даного типу і посилання на цей тип розглядаються як одне те саме).
- Не допускається перевантаження функцій із співпадаючими списками параметрів лише на основі типу повертаємих значень.
- Функції-члени не можуть бути перевантажені лише на основі того, що одна з них – статична, а друга – ні.
- Typedef- визначення не впливають на механізм перевантаження, оскільки вони не вводять нові типи, а є лише синонімами існуючих. Наприклад, якщо є визначення
- Всі еnum-типи розглядаються як різні і тому можуть використовуватись для перевантаження функцій.
- Типи “масив (чогось)” і “покажчик (на щось)” розглядаються як ідентичні з точки зору перевантаження. Наприклад,
typedef char *ptr;
то дві функції
void setval (char *s) та void setval ( ptr s)
не є різними. Це буде помилкою.
void setval(char pz);
void setval (char *ptr);
є помилкою при перевантаженні.
Але це стосується тільки одномірних масивів. Для багатомірних масивів друга, третя,..... розмірності розглядаються як частина типу даних.
Наприклад, не буде помилки:
void setval (char sz [ ]);
void setval (char sz [ ][4]);
Приклад 1. Наступна програма перевантажує функцію з ім'ям add_values. Перше визначення функції складає два значення типу int. Друге визначення функції складає три значення.
#include <iostream.h>
int add_values(int a,int b){
return(a + b);
}
int add_values (int a, int b, int c){
return(a + b + c);
}
void main(void){
cout<<"200 + 801 = "<<add_values(200,801)<<endl;
cout<<"10 + 21 + 70 = "<<add_values(10,21,70)<<endl;
}
Приклад 2. Наступна програма перевантажує функцію show_message. Перша функція виводить стандартне повідомлення, параметри їй не передаються. Друга виводить передане їй повідомлення, а третя виводить два повідомлення.
#include <iostream.h>
void show_message(void){ cout << "Стандартное сообщение: "
<< "Учимся программировать на C++" << endl;
}
void show_message(char *message){
cout << message << endl;
}
void show_message(char *first, char *second){
cout << first << endl;
cout << second << endl;
}
void main(void){
show_message();
show_message("Учимся программировать на языке C++!");
show_message("B C++ нет предрассудков!","Перегрузка-это круто!") ;
}
Перевантаження операторів
Перевантаження оператора полягає у зміні сенсу оператора при використанні його з певним класом. Перевантаження операторів може спростити найбільш загальні операції класу і поліпшити читабельність програми
Для перевантаження операторів програми використовують ключове слово operator.
Якщо програма перевантажує оператор для певного класу, то сенс цього оператора змінюється тільки для зазначеного класу, решта програми буде використовувати цей оператор для виконання його стандартних операцій.
У загальному випадку програми можуть перевантажити майже всі оператори С ++, окрім таких:
- оператор вибору члена (оператор “.”);
- оператор вибору члена за покажчиком (оператор “.*”);
- оператор розширення області бачення (оператор “::”);
- оператор умови (“? : “);
- препроцесорний оператор (“#”) та препроцесорний символ (“##”).
Приклад 3. Нижче наведено визначення класу strings. Цей клас містить один елемент даних, який являє собою власне символьний рядок. Крім того, цей клас містить декілька перевизначених операторів:
#include <iostream>
#include <string.h>
#include <locale.h>
using namespace std;
class strings
{
public:
strings(char *); // Конструктор
void operator +(char *);
void operator -(char);
void show_string(void);
private:
char data[256] ;
};
strings::strings(char *str){
strcpy(data, str);
}
void strings::operator +(char *str){
strcat(data, str);
}
void strings::operator -(char letter){
char temp[256] ;
int i, j;
for (i = 0, j = 0; data[i]; i++)
if (data[i]==letter) temp[j++] = data[i];
temp[j] = NULL;
strcpy(data, temp);
}
void strings::show_string(void){
cout << "\n\t"<<data << endl;
}
void main(void){
setlocale(0,"");
strings title( "\n\tУчимся программировать на C++");
strings lesson("\n\tПерегрузка операторов");
title.show_string();
title + " и я учусь тоже!";
title.show_string() ;
lesson.show_string();
lesson – 'р';
lesson.show_string();
system("pause");
}
Порядок виконання роботи
- Засвоїти теоретичний матеріал. Використовуючи лекційний матеріал і інші інформаційні джерела, навчитись створювати і перевантажувати функції, перевантажувати оператори для операцій над об’єктами класу.
- Розібратись у наведених прикладах і здійснити компіляцію програм з прикладів 1,2,3.
- Розробити програми згідно індивідуального завдання.
- Підготувати звіт з лабораторної роботи, у якому представити такі матеріали (спільний звіт для усіх задач):
- зміст завдання і варіант;
- математична формалізація задачі (для завдання 2);
- лістинг програми;
- результати роботи розробленого програмного засобу в різних режимах;
- висновки.
Варіанти індивідуальних завдань
Завдання 1. Визначившись з власними силами, вибрати собі для виконання одну із задач. При цьому номер задачі обрати таким чином:
- − для задач низької складності: номер_задачі = номер_варіанту % 5;
- − для задач середньої і високої складності:
номер_задачі = номер_варіанту % 3.
Протестуйте визначені функції на тестових наборах даних.
(низька складність – оцінка "задовільно") | |
---|---|
1 | Визначте перевантажені функції square для знаходження квадратів цілих чисел, чисел з плаваючою комою одинарної та подвійної точності. |
2 | Визначте перевантажені функції triple для потроювання значень цілих чисел, чисел з плаваючою комою одинарної та подвійної точності. |
3 | Визначте перевантажені функції minimum для знаходження найменшого з трьох цілих чисел, чисел з плаваючою комою одинарної та подвійної точності. |
4 | Визначте перевантажені функції maximum для знаходження найбільшого з трьох цілих чисел, чисел з плаваючою комою одинарної та подвійної точності. |
(середня складність – оцінка "добре") | |
1 | Визначте перевантажені функції power для піднесення до цілого невід’ємного степеня цілих чисел, чисел з плаваючою комою одинарної та подвійної точності. |
2 | Визначте перевантажені функції round_value для округлення чисел з плаваючою комою подвійної точності до заданої точності. Точність може бути задана у вигляді цілого числа, що вимагає необхідне число знаків після коми, та у вигляді числа з плаваючою комою у форматі 0,0…01 (наприклад, 0,01 означає округлення до сотих). |
(висока складність – оцінка "відмінно") | |
1 | Визначте перевантажені функції power для піднесення до цілого степеня цілих чисел, чисел з плаваючою комою одинарної та подвійної точності. Значення показника степеня може бути від’ємним, нульовим та додатнім. |
2 | Визначте перевантажені функції round_value для округлення чисел з плаваючою комою подвійної точності до заданої точності. Точність може бути задана у вигляді цілого числа, що вимагає необхідне число знаків після коми, та у вигляді числа з плаваючою комою у форматі 0,0…01 (наприклад, 0,01 означає округлення до сотих). Передбачте можливість округлення за необхідністю до першої значущої цифри у випадку, якщо округлене до заданої точності число рівне нулю. |
Завдання 2. Описати клас, що реалізує вказаний тип даних згідно індивідуального завдання. Клас повинен містити:
- множину конструкторів для створення об'єктів певного типу (конструктор за замочуванням, конструктор з параметрами, конструктор копіювання);
- вказані операції над об'єктами класу з використанням механізму перевантаження операцій.
Написати програму, яка демонструє роботу з об'єктами створеного класу. Програма повинна містити меню для перевірки усіх методів класу і операцій. Організувати виведення та введення даних за допомогою класів-потоків сin та cout.
№ | Предметна область | Операції для перевантаження | |
---|---|---|---|
1 | Матриця | Віднімання, множення на матрицю, додавання цілого числа | |
2 | Комплексні числа | Сума, добуток на комплексне число, добуток на дійсне число інкремент | |
3 | Вектор у просторі | Додавання векторів, векторний добуток двох векторів | |
4 | Множина | Вилучення елемента, об'єднання множин, перетин множин | |
5 | Точка на площині | Додавання двох точок, множення на число, дзеркальне відображення | |
6 |
Дроби |
Віднімання, множення, порівняння | |
7 | Лінія | Порівняння, зменшення, пересування по горизонталі | |
8 | Цілі числа | Інкремент, декремент, додавання, віднімання, логічні операці | |
9 | Вектор на площині | Скалярний добуток, порівняння векторів, множення вектора на число | |
10 | Матриця | Додавання, множення на число, транспонування | |
11 | Прямокутник | Збільшення, пересування по вертикалі, перевірка на попадання точки в прямокутник | |
12 | Дроби | Додавання, інкремент, пошук оберненого дробу | |
13 | Дійсне число | Модуль числа, сума, добуток на ціле, добуток на дійсне | |
14 | Комплексні числа | Різниця, порівняння, ділення на дійсне число, декремент | |
15 | Комплексні числа | Обчислення оберненого комплексного числа, додавання до комплексного числа дійсного і навпаки |
Контрольні питання
- Для чого використовують перевантаження функцій?
- Які обмеження на перевантажені функції?
- Як компілятор діє з перевантаженими функціями?
- Наведіть приклад перевантаження функцій.
- В чому сенс перевантаження операторів?
- Наведіть приклади перевантаження унарних та бінарних операторів.
- Які оператори не можна перевантажувати?
- Для чого перевантажують конструктори класів?
- Наведіть приклад перевантаження конструкторів.
- Що таке конструктор копіювання? Наведіть приклад такого методу.
- Чи можна перевантажувати деструктори?