Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
+ООП_Навч_посібник.doc
Скачиваний:
8
Добавлен:
01.07.2025
Размер:
6.58 Mб
Скачать

7.4.2. Повернення значень

Кожна функція, окрім типу void, повертає яке-небудь значення. Це значення безпосередньо задається за допомогою настанови return. Іншими словами, будь-яку не void-функцію можна використовувати як операнд у виразі. Отже, кожний з наступних виразів допустимо у мові програмування C++:

х = power(y);

if(max(х, y)) > 100) cout << "більше";

switch(abs(х)) {

Незважаючи на те, що всі не void-функції повертають значення, вони необов'язково мають бути використані у програмі. Найпоширеніше запитання щодо значень, які повертаються функціями, звучить так: "Оскільки функція повертає певне значення, то хіба я не повинен (повинна) присвоїти це значення будь-якій змінній?". Відповідь: ні, це необов'язково. Якщо значення, що повертається функцією, не бере участі в операції присвоєння, воно просто відкидається (втрачається).

Розглянемо наведену нижче програму, у якій використовується стандартна бібліотечна функція abs().

Код програми 7.16. Демонстрація механізму використання стандартної бібліотечної функції abs()

#include <iostream> // Для потокового введення-виведення

#include <cstdlib> // Для використання бібліотечних функцій

using namespace std; // Використання стандартного простору імен

int main()

{

int izm;

izm = abs(-10); // рядок 1

cout << abs(-23); // рядок 2

abs(100); // рядок 3

getch(); return 0;

}

Функція abs() повертає абсолютне значення свого цілочисельного аргументу. Вона використовує заголовок <cstdlib>. У рядку 1 значення, що повертається функцією abs(), присвоюється змінній izm. У рядку 2 значення, що повертається функцією abs(), нічому не присвоюється, але використовується настановою cout. Нарешті, в рядку 3 значення, що повертається функцією abs(), втрачається, оскільки не присвоюється ніякій іншій змінній і не використовується як частина виразу.

Якщо функція, тип якої є відмінним від типу void, завершується внаслідок виявлення фігурної дужки, що закривається, то значення, яке вона повертає, не визначене (тобто невідоме). Через особливості формального синтаксису C++ не void-функція не зобов'язана виконувати настанову return. Це може відбутися у тому випадку, якщо кінець функції буде досягнуто до виявлення настанови return. Але, оскільки функція оголошена як така, що повертає значення, значення буде таки повернено, навіть якщо це просто "сміття". У загальному випадку не кожна зі створюваних Вами void-функцій повинна повертати значення за допомогою безпосередньо виконуваної настанови return.

Вище згадувалося, що void-функція може мати декілька настанов return. Те саме стосується і функцій, які повертають значення. Наприклад, представлена у наведеному нижче коді програми функція find_substr() використовує дві настанови return, які дають змогу спростити алгоритм її роботи. Ця функція виконує пошук заданого підрядка в заданому рядку. Вона повертає індекс першого виявленого входження заданого підрядка або значення -1, якщо заданий підрядок не було знайдено. Наприклад, якщо в рядку "Я люблю C++" необхідно відшукати підрядок "люблю", то функція find_substr() поверне число 2 (яке є індекс символу "л" у рядку "Я люблю C++").

Код програми 7.17. Демонстрація механізму використання двох настанов return, які значно спрощують алгоритм її роботи

#include <iostream> // Для потокового введення-виведення

using namespace std; // Використання стандартного простору імен

int find_substr(char *sub, char *str);

int main()

{

int index;

index = find_substr("три", "один два три чотири");

cout << "Індекс дорівнює " << index; // Індекс дорівнює 9.

getch(); return 0;

}

// Функція повертає індекс шуканого підрядка або -1,

// якщо його не було знайдено.

int find_substr(char *sub, char *str)

{

int t;

char *p, *p2;

for(t=0; str[t]; t++) {

p = &str[t]; // Встановлення покажчиків

p2 = sub;

while(*p2 && *p2==*p) { // перевірка збігу

p++;

p2++;

}

/* Якщо досягнуто кінець р2-рядка (тобто підрядка)

то підрядок було знайдено. */

if(!*p2) return t; // Повертаємо індекс підрядка.

}

return -1; // Підрядок не був виявлений.

}

Результати виконання цієї програми є такими:

Індекс дорівнює 9

Оскільки шуканий підрядок існує в заданому рядку, виконується перша настанова return. Для прикладу змінимо програму так, щоб нею виконувався пошук підрядка, який не є частиною заданого рядка. У цьому випадку функція find_substr() повинна повернути значення -1 (завдяки другій настанові return).

Функцію можна оголосити так, щоб вона повертала значення будь-якого типу даних, дійсного у мові C++ (за винятком масиву: функція не може повернути масив). Спосіб оголошення типу значення, що повертається функцією, аналогічний тому, який використовують для оголошення змінних: імені функції повинен передувати специфікатору типу даних. Застосування специфікатора типу даних повідомляє компілятор, значення якого типу даних повинна повернути функція. Указаний в оголошенні функції тип повинен бути сумісним з типом даних, що використовується в настанові return. Інакше компілятор відреагує повідомленням про помилку.