Поняття про вбудовані функції

Перед тим, як продовжити засвоєння механізмів роботи з класами, дамо невелике, але важливе пояснення. Воно не належить конкретно до об' єктно - орієнтованого програмування, але є дуже корисним засобом мови програмування 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. Вусі, що знаходиться між тією, що відкриває і закриває фігурними дужками, вважається тілом функції.