Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Вказівники на функції
Самі функції мови С++ не є змінними, але можна визначити вказівник на функцію, яку можна обробляти, передавати іншим функціям, розміщати в масиви і т. ін. Розглянемо програму, яка при заданні необов’язкового аргументу – n сортує рядки чисельно, а не лексикографічно. Алгоритм сортування складається із трьох частин – порівняння (впорядковує будь-які пари об’єктів), перестановки (змінює порядок об’єктів) і сортування (розміщується об’єкт у потрібному порядку). Алгоритм сортування не залежить від операцій порівняння і перестановки, тому передача в нього різних функцій порівняння і перестановки дозволяє організувати сортування за різними критеріями. Саме такий підхід і використано в програмі сортування (див. ПП6.26 на СD). Лексикографічне порівняння рядків здійснюється функцією Strcmp, а перестановка – функцією Swap. Функція Numcmp порівнює два рядки на базі числового значення і повертає той умовний вказівник, що й Strcmp. Ці три функції описано в Main і вказівники на них передаються у Sort. Тут Strcmp, Nimcmp і Swap – адреси функцій. Передача адрес функцій організовується компілятором. Модифікація функції Sort реалізовано в програмі (див. ПП6.27. на СD) Опис int (* comp)() означає, що comp є вказівником на функцію, яка повертає значення типу int. Перші круглі дужки тут необхідні, оскільки без них опис int *comp () означав би, що comp є функцією, яка повертає вказівник на цілі значення. Використання comp у рядку if (* comp)(v [ j ], v [ j + gap ]) < = 0) повністю відповідає опису, де Функцію Strcmp, яка порівнює два рядки за першим числовим значенням, реалізовано в програмі ПП6.28. (див. на СD). Функція Swap, яка переставляє два вказівними, реалізована в програмі ПП6.29. (див. на СD).
У C++ існують наступні види вказівників: 1) вказівник на функцію; 2) вказівник на об'єкт; 3) вказівник на void. Усі ці вказівники відрізняються властивостями і набором припустимих операцій. Вказівник завжди пов'язаний з яким-небудь конкретним типом. Вказівник на функцію містить її адресу в сегменті коду (тобто адресу, за якою передається керування при виклику функції). Вказівник на функцію використовується для непрямого виклику функції (не через її ім'я, а шляхом звертання до змінної, що зберігає її адресу), а також для передачі функції в іншу функцію як параметр. Оголошення вказівника на функцію: тип (*ім'я)(список аргументів); Приклад int (*fn)(float, float) – задає вказівник з ім'ям fn на функцію, що повертає значення типу int і має два аргументи типу float. Приклад програми #include < iostream.h> #include < conio.h> double fx(double x) { double y; y=x*x; return y; } void print_tab(double (*f)(double), float a, float b, float dx) { float x; for (x=a; x< =b; x+=dx) cout< < x< < '\t'< < f(x)< < endl; } void main() { clrscr(); cout< < " Таблиця значень функції" < < endl; print_tab(fx, 10, 20, 0.5); } Дана програма містить функцію для виведення на екран таблиці значень функції в заданому діапазоні. Функція, яка буде табулюватися, передається в цю функцію як параметр. Вказівник на об'єкт містить адресу області пам'яті, у якій зберігаються дані визначеного типу. Вказівник на об'єкт має вид: тип *ім'я; При цьому тип може бути будь-яким, крім посилання. Зірочка відноситься безпосередньо до імені, тому при оголошенні декількох вказівників потрібно ставити її перед кожним з них. Приклад: int *a, *b; – визначає два вказівники на тип int. Вказівник на void застосовується тоді, коли не визначений тип об'єкта, адресу якого потрібно зберігати в вказівнику. Вказівнику на void можна присвоїти значення вказівника будь-якого типу, а також порівнювати його з будь-якими вказівниками, але перед виконанням яких-небудь дій з областю пам'яті, на яку він посилається, потрібно перетворити його до конкретного типу явно. Усі величини типу вказівник підкоряються загальним правилам визначення області дії, видимості і часу життя.
|