Поняття про вбудовані функції
Перед тим, як продовжити засвоєння механізмів роботи з класами, дамо невелике, але важливе пояснення. Воно не належить конкретно до об' єктно - орієнтованого програмування, але є дуже корисним засобом мови програмування C++, яку достатньо часто використовують у визначеннях класів. Йдеться про вбудовану функцію (inline function), або підставну функцію. Вбудованою називається функція, програмний код якої підставляється в ті місце рядка програми, з якого вона викликається, тобто виклик такої функції замінюється її кодом. Існує два способи створення вбудованої функції. Перший полягає у використанні модифікатора inline.
Наприклад, щоби створити вбудовану функцію Fun(), яка повертає int -значення і не приймає жодного параметра, достатньо оголосити її так:
inline int Fun()
{
//...
}
Модифікатор inline повинний передувати усім решта настанов оголошення самої функції.
Причиною існування вбудованих функцій є ефективність їх використання. Адже під година шкірного виклику звичайної функції виконається деяка послідовність настанов, пов'язаних з обробленням самого виклику, що містить занесення її аргументів у стік, чи поверненням їх з функції. У деяких випадках значна кількість циклів центрального процесора використовується саме для виконання цих дій.
Але, якщо функція вбудовується в рядок програми, то таких системних витрат просто немає, і загальна швидкість виконання програми зростає. Якщо ж вбудована функція виявляється великою, то загальний розмір програми може істотно збільшитися. Тому краще як вбудовані використовувати тільки маленькі функції, а ті, що є більшими, оформляти у вигляді звичайних функцій.
Продемонструємо механізм використання вбудованої функції на прикладі такої програми.
Демонстрація механізму використання вбудованої функції
##include <vcl>
##include <iostream> // Для потокового введення-виведення
##include <conio> // Для консольного режиму роботи
using namespace std; // Використання стандартного простору імен
class myClass { // Оголошення класового типу
int c; // Закритий член за замовчуванням
public:
int Put();
void Get(int d);
};
inline int myClass::Put()
{
return c;
}
inline void myClass::Get(int d)
{
c = d;
}
int main()
{
myClass Obj; // Створення об' єкта класу
Obj.Get(10);
cout << "c= " << Obj.Put() << endl;
getch(); return 0;
}
У цьому коді програми замість виклику функцій Put() і Get() підставляють їх код. Так, у функції main() рядок
Obj.Get(10);
функціонально еквівалентний такій настанові присвоєння:
Obj.c = 10;
Оскільки змінна c за замовчуванням закрита у межах класу myClass, то цей рядок не може реально існувати в коді функції main(), але за рахунок вбудованої функції Get() досягнуте того ж результату, одночасно позбавившись витрат системних ресурсів, взаємопов 'язаних з викликом функції.
Важливо розуміти, що насправді використання модифікатора inline є запитому, а не командою, за якою компілятор згенерує вбудований (inline -) код. Існують різні ситуації, які можуть не дати змоги компіляторові задовольнити наш запитий. Вісь декілька прикладів :
● деякі компілятори не генерують вбудованого коду, якщо відповідна функція містить цикл, конструкцію switch або настанову goto;
● найчастіше вбудованими не можуть бути рекурсивні функції;
● як правило, механізм вбудовування "не проходити" для функцій, які містять статичні (static) змінні.
Лістинг 1. Демонстрація частин програми C++ на прикладі програми HELLO. CPP
1: #include <iostream.h>
2:
3: int main()
4: {
5: cout << "Hello World!\n";
6: return 0;
7: }
Результат: Hello World!
Основний код програми починається в рядку 3 з виклику функції main(). Кожна програма на мові C++ містить функцію main(). Функція - це блок програми, який виконує одне або декілька дій. Зазвичай функції викликаються іншими функціями, але main() - особлива функція: вона викликається автоматичний при запуску програми.
Функція main(), подібно до усіх інших функцій, повинна оголосити тип повертаного значення. У програмі HELLO.CPP функція main() повертає значення типу int (від слова integer - цілий), а це означає, що після закінчення роботи ця функція поверне операційній системі цілочисельне значення. У даному випадку буде повернено ціле значення 0, як показано в рядку 6. Повернення значення в операційну систему не таке важливе, і загалом це значення самою системою ніяк не використовується, але стандарт мови C++ вимагає, щоб функція main() була оголошена за усіма правилами.
Деякі компілятори дозволяють оголосити функцію main() так, щоб вона повертала значення типу void. Цього більше не можна робити в C++, тому вам слід позбавлятися від старих звичок. Дозвольте функції main() повертати значення типу int і заради цього помістите в останньому рядку цієї функції вираження return 0;.
Примітка: В деяких операційних системах передбачена можливість перевірки значення, повертаного програмою. Зручно повертати значення 0 як прапор нормального завершення функції.
Усі функції починаються відкриваючою фігурною дужкою ({) і закінчуються закриваючою фігурною дужкою (}). Фігурні дужки функції main() помішані в рядках 4 і 7. Вусі, що знаходиться між тією, що відкриває і закриває фігурними дужками, вважається тілом функції.