Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
О.О.П / ооп / 4_кол / Лекції / 11. 9. Об'єктно-орієнтоване програмування, л.2.5.ppt
Скачиваний:
28
Добавлен:
30.05.2020
Размер:
953.34 Кб
Скачать

У функції Geron є звернення до функції Line, а в основній функції — звернення тільки до функції Geron. Для компілятора важливо, щоб перед зухвалою функцією був присутнім або прототип, або визначення функції, що викликається. Тому якщо з цієї програми прибрати прототип функції Line, то помилки не буде. Але якщо одночасно з цим поміняти місцями визначення функцій Line і Geron, то компілятор видасть повідомлення про помилку.

Рекурсивні визначення функцій

В мовах Сі/Сі++ допускається рекурсивне визначення функцій. Проілюструємо визначення рекурсивної функції на класичному прикладі обчислення факторіалу цілого позитивного числа

У випадку якщо при виклику функції буде заданий негативний аргумент, вона поверне нульове значення — ознаку невірного звернення.

Передача значень через глобальні змінні

Зоною дії опису програмного об'єкту називається

частина програми, в межах якої діє (враховується) цей опис. Якщо змінна описана усередині деякого блоку, то вона локалізована в цьому блоці і з інших блоків, зовнішніх по відношенню до даного, «не видна». Якщо опис змінною знаходиться поза блоком і передає йому в тексті програми, то цей опис діє усередині блоку і називається глобальним. Глобальна змінна «видно» з блоку.

Наприклад:

double x ; int funcl() (int у;... } void main() {float у;...}

Змінна x є глобальною по відношенню до функцій funcl, main і, отже, може в них

використовуватися. У функціях funcl і main є локальні змінні з однаковим ім'ям у. Проте це різні величини, ніяк не пов'язані один з одним. Оскільки змінна х є загальною для обох функцій, то вони можуть взаємодіяти через х один з одним.

При зверненні до функції передача значень можлива як через параметри, так і через глобальні змінні. У наступній програмі вирішується завдання отримання найбільшого, що вже розглядається

нами, з трьох значень.

Приклад 6:

Результат виконання функції MAX заноситься в глобальну змінну z, яка «видно» також і з основної функції.

Тому при другому зверненні ця змінна грає одночасно роль аргументу і результату. Тут оператор звернення до функції виглядає подібно до звернення до процедури в Паскале, а глобальна змінна z грає роль var -параметра .

Класи пам'яті

Під всяку змінну, використовувану в програмі, має бути виділене місце в пам'яті ЕОМ. Виділення пам'яті може відбуватися або на стадії компіляції (компонування) програми, або під час її виконання. Існують 4 класи пам'яті, що виділяється під змінні:

автоматична (ключове слово auto);

зовнішня (extern);

статична (static);

регістрова (register).

Під глобальні змінні виділяється місце в зовнішній пам'яті (це оперативна пам'ять класу extern). Глобальну змінну можна оголосити або поза програмними блоками, або усередині блоку з ключовим словом extern. Зазвичай це робиться в тих випадках, коли програмний модуль зберігається в окремому файлі і, отже, окремо компілюється.

Нехай, наприклад, основна і допоміжна функції зберігаються в різних файлах.

Приклад 7

Тут обмін значеннями між основною і допоміжною функцією func() відбувається через загальну глобальну змінну var, для якої під час компіляції виділяється місце в зовнішньому розділі пам'яті. В результаті виконання цієї програми на екран виведеться число 50.

Локальні змінні, оголошені усередині блоків, розподіляються в автоматичній пам'яті, працюючій за принципом стека. Виділення пам'яті відбувається при вході виконання програми у блок, а при виході з блоку пам'ять звільняється. Ключове слово auto писати необов'язково (мається на увазі за умовчанням).

Статична пам'ять виділяється під змінні, локалізовані усередині блоку, але на відміну від автоматичної пам'яті не звільняється при виході з блоку. Таким чином, при повторному входженні у блок статична змінна зберігає своє колишнє значення. Приклад оголошення статичної змінної :

f()

{static int schet=10; ...}