Міністерство освіти і науки України
Національний університет „Львівська політехніка”
Кафедра “Електронних обчислювальних машин”
Звіт з лабораторної роботи №1
з дисципліни «Програмування, частина 2.(Об’єктно-орієнтоване програмування)»
на тему:
“Перевантаження функцій ”
Тема: Перевантаження функцій
Мета: познайомитися із перевантаженням функцій.
Теоретичні відомості: У мові С++, на відміну від мови С дозволяється визначати декілька функцій з одним і тим же іменем за умови, що дані функції мають різну сигнатуру (різні типи та кількість аргументів функції). При цьому тип значення що повертається при перевантаженні до уваги не приймається.
Розглянемо дії компілятора коли він зустрічає при компіляції в коді програми виклики перевантажених функцій.
При виклику функції з ім‘ям func спершу компілятор намагатиметься знайти функцію, формальні аргументи якої відповідають фактичним аргументам без усяких перетворень типів або з використанням тільки неминучих перетворень - наприклад, імені масиву до покажчика або значення змінної до константи або навпаки.
Якщо відповідна функція не знайдена, то здійснюється пошук такої функції, щоб для відповідності формальних і фактичних аргументів досить було використати тільки такі стандартні перетворення, що не спричиняють перетворень цілих типів до типів з плаваючою крапкою і навпаки. При цьому підбирається функція, для якої число таких перетворень було б мінімальним.
Третім етапом є пошук такої функції, для виклику якої досить здійснити будь-які стандартні перетворення аргументів (і знову так, щоб цих перетворень було якнайменше).
Далі здійснюється пошук функції, для якої аргументи можна одержати за допомогою всіх перетворень, розглянутих до цього, а також перетворень типів, визначених самим програмістом. Якщо й у цьому випадку єдина потрібна функція не знайдена, то на останньому етапі компілятор пробує знайти відповідність з урахуванням списку невизначених аргументів. Так, виклик функції func (1, 2, 3) може бути співставлений лише з функцією, що оголошена як іnt func(float, ...).
Якщо компілятор не знайде жодної підходящої функції, або виклик функції не може бути однозначно співставлений з однією з оголошених функцій, то програма не скомпілюється і буде виведене повідомлення про помилку.
Подрядок виконання:
1. Запустити Microsoft Visual Studio.
2. Створити новий порожній проект в стилі Visual С++ Win 32 Console application. Якщо ви використовуєте MS Visual Studio версії 2012 або вище, то для того, щоб використовувати ключове слово auto для встановлення автоматичного класу пам‘яті, а не для автоматичного виведення типу змінної, в проекті слід в властивостях проекту на вкладці «Властивості конфігурації» -> «С/С++» -> «Командний рядок» у вікні «Додаткові параметри» додати параметр /Zc:auto-.
3. Створити новий *.cpp файл та включити його в проект.
4. Написати і скомпілювати код програми, що реалізує поставлене завдання, та виводить результат виконання на екран.
5. Оформити та захистити звіт.
Індивідуальне завдання:
Оскільки мій варіант №3, я виконую завдання :
Написати реалізацію перевантажених функцій:
int func(int* arr, int length, int number);
int func(char* str, char ch);
Функція func повертає позицію першого входження шуканого числа чи символу.
Текст набраної програми:
#include <iostream>
#include <ctime>
using namespace std;
int func(int* arr, int length, int number);
int func(char* str, char ch);
int main()
{
setlocale(LC_ALL, "rus");
srand(time(NULL));
int SIZE;
cout << "Введiть розмiр цiлочисельного массиву = ";
cin >> SIZE;
int *arr = new int[SIZE];
cout << "Введiть число яке будете шукати = ";
int number;
cin >> number;
int pozition = func(arr, SIZE, number);
for (int i = 0; i < SIZE; i++) {
cout << arr[i] << "\t";
}
cout << endl;
if (pozition == 0) {
cout << "Дане число не знайдено" << endl;
}
else {
cout << "Позицiя першого входження заданого числа = " << pozition << endl;
}
delete[] arr;
char string[128];
cout << "Введiть ряд = ";
cin >> string;
cout << "Введiть символ який будете шукати = ";
char symbol;
cin >> symbol;
pozition = func(string, symbol);
if (pozition == 0) {
cout << "Даний символ не знайдено" << endl;
}
else {
cout << "Позицiя першого входження заданого символу = " << pozition << endl;
}
system("pause");
}
int func(int* arr, int length, int number) {
int poz = 0;
for (int i = 0; i < length; i++) {
arr[i] = rand() % 10;
}
for (int i = 0; i < length; i++) {
if (arr[i] == number) {
poz = i + 1;
break;
}
}
return poz;
}
int func(char* str, char ch) {
int dlina = strlen(str);
static int poz = 0;
for (int i = 0; i < dlina; i++) {
if (str[i] == ch) {
poz = i + 1;
break;
}
}
return poz;
}
Скріншоти виконаної програми:
Рис.1 Виконана програма
Висновок: на лабораторній роботі №1 я познайомився із перевантаженням функцій, класами пам’яті і вбудованими функціями.