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

8.3.2. Порівняння можливості передачі аргументів функції за замовчуванням з її перевантаженням

Як згадувалося на початку цього розділу, одним із застосувань передачі аргументів функції за замовчуванням є "скороченою формою" перевантаження функцій. Щоб зрозуміти це, уявіть, що Вам потрібно створити дві "адаптовані" версії стандартної функції strcpy(). Одна версія повинна приєднувати весь вміст одного рядка до кінця іншої. Друга ж приймає третій аргумент, який задає кількість символів, що конкатенуються (приєднуються). Іншими словами, ця версія повинна конкатенувати тільки задану кількість символів одного рядка до кінця іншої.

Допустимо, що Ви назвали свої функції іменем myStrcpy() і запропонували такий варіант їх прототипів:

void myStrcpy(char *s1, char *s2, int len);

void myStrcpy(char *s1, char *s2);

Перша версія повинна скопіювати len символів з рядка s2 у кінець рядка s1. Друга версія копіює весь рядок, яка адресується покажчиком s2, у кінець рядка, яка адресується покажчиком s1, тобто діє подібно до стандартної функції strcpy().

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

Код програми 8.12. Демонстрація можливості передачі аргументів функції за замовчуванням з її перевантаженням

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

#include <cstring> // Для роботи з рядковими типами даних

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

void myStrcpy(char *s1, char *s2, int len = -1);

int main()

{

char str1[80] = "Це тест.";

char str2[80] = "0123456789";

myStrcpy(str1, str2, 5); // Приєднуємо 5 символів.

cout << str1 << "\n";

strcpy(str1, "Це тест."); // Відновлюємо str1.

myStrcpy(str1, str2); // Приєднуємо весь рядок.

cout << str1 << "\n";

getch(); return 0;

}

// Призначена для користувача версія функції strcpy().

void myStrcpy(char *s1, char *s2, int len)

{

// Знаходимо кінець рядка s1.

while(*s1) s1++;

if(len == -1) len = strlen(s2);

while(*s2 && len) {

*s1 = *s2; // Копіюємо символи.

s1++;

s2++;

len--;

}

*sl = '\0'; // Завершуємо рядок s1 нульовим символом.

}

У цій програмі функція myStrcpy() приєднує len символів рядка, який адресується покажчиком s2, до кінця рядка, яка адресується покажчиком s1. Але, якщо значення len дорівнює -1, як і у разі дозволу передачі цього аргументу функції за замовчуванням, то функція myStrcpy() приєднає до рядка s1 весь рядок, яка адресується покажчиком s2. Іншими словами, якщо значення len дорівнює -1, то функція myStrcpy() діє подібно до стандартної функції strcpy(). Використовуючи для параметра len можливість передачі аргументу функції за замовчуванням, обидві операції можна об'єднати в одній функції.

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