Міністерство освіти і науки України
Національний університет „Львівська політехніка”
Кафедра СКС
Звіт
з лабораторної роботи № 2
з дисципліни: “ООП”
на тему: “ Перевантаження функцій’’
Львів 2009
Мета роботи: познайомитися із перевантаженням функцій.
Короткі теоретичні відомості
Перевантаження функцій
С++ дозволяє визначати декілька функцій з одним і тим же іменем, якщо дані функції мають різні набори параметрів (принаймні різні типи параметрів).
Нехай оголошені наступні функції:
іnt func(іnt, іnt);
іnt func(char, double);
іnt func(long, double);
іnt func(float, ...); // Функція з невизначеним числом аргументів.
іnt func(char*, іnt);
При виклику функції з ім’ям func спершу компілятор намагатиметься знайти функцію, формальні аргументи якої відповідають фактичним аргументам без усяких перетворень типів або з використанням тільки неминучих перетворень - наприклад, імені масиву до покажчика або значення змінної до константи або навпаки.
char strіng[ ] = "Рядок - це масив символів";
іnt і = func (strіng, 13); // func (char*, іnt);
іnt j = func(1995L, 36.6); // func(long, double);
Вбудовані (іnlіne) функції
У мові С директива препроцесора #defіne використовувалась для визначення макросів (макровизначеннь) з параметрами, а саме:
#defіne sqr(x) ((x)*(x)).
Мова С++ пропонує більш безпечну заміну макросам – вбудовані (іnlіne) функції. На відміну від макросів, вбудовані функції не піддаються помилкам подвійного обчислення. Крім того типи аргументів перевіряються компілятором і при потребі виконуються всі необхідні перетворення. Таким чином, якщо у вас є маленька функція, яку доводиться часто викликати, то її можна оголосити як іnlіne. Оголошена в такий спосіб функція не буде викликатися щораз, замість цього тіло функції підставлятиметься в те місце програми, де здійснюється виклик. При цьому підвищується ефективність програми, щоправда збільшується розмір коду. Щоб оголосити функцію як іnlіne необхідно просто поставити слово іnlіne перед її оголошенням.
Класи пам‘яті
Клас пам’яті
Призначення
auto
Автоматичний клас пам‘яті. Зона дії автоматичної змінної обмежена блоком або функцією, де вона описана. Вона починає існувати після звертання до функції і зникає після виходу з неї.
external
Змінні з зовнішнім класом пам‘яті - це глобальні змінні і до них можна звертатися з будь-якої функції. Оскільки зовнішні змінні доступні скрізь, їх можна використовувати для зв'язку між функціями. Краще уникати застосування зовнішніх змінних, тому що вони часто служать джерелом помилок, що важко знайти.
static
Змінні із статичним класом пам‘яті, подібно автоматичним, локальні в тій функції або блоці, де вони описані. Різниця полягає в тім, що статичні змінні не зникають, коли функція (блок) завершує роботу, і їхні значення зберігаються для наступних викликів функції.
register
Регістрові змінні повинні зберігатися в надшвидкій пам'яті ЕОМ - регістрах. Використовуються аналогічно автоматичним змінним.
Завдання
Написати реалізацію перевантажених функцій:
int func(int* arr, int length, int number);
int func(char* str, char ch);
Функція func повертає кількість входжень числа чи символу в масив.
Виконання роботи
#include <iostream>
#include <conio.h>
#include <string.h>
using namespace std;
int func (int* arr, int length, int number){
int k=0;
for(int i=0; i<length; i++){
if(arr[i]==number){
k++;
}
}
return k;
}
int func (char* str, char ch){
int k=0;
for(int i=0; (unsigned)i<strlen(str); i++){
if(str[i]==ch){
k++;
}
}
return k;
}
void main(){
const int len=5,lens=128;
int a[len],n;
char s[lens],ch;
cout << "Vvedit rjadok: ";
cin.getline(s,lens,'\n');
cout << "ch = ";
cin >> ch;
for(int i=0; i<len; i++){
cout << "a[" << i << "] = ";
cin >> a[i];
}
cout << "n = ";
cin >> n;
cout << "Chyslo zustrichaetsja: " << func(a,len,n) << endl;
cout << "Symvol zustrichaetsja: " << func(s,ch) << endl;
}
Результати роботи програми
fghgfghgfg
f
1
2
1
2
1
1
f – 3
1 - 3
Висновок: я познайомився з перевантаженням функції, виконав завдання, а також розглянув деякі особливості перевантаження