Значення аргументів функції за замовчуванням, програмування на c і ​​c

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







Тепер функція f () може бути викликана двома способами, як показано нижче:

f (10); // явна передача значення
f (); // функція використовує значення за замовчуванням

У першому випадку аргументу i буде присвоєно значення 10. У другому випадку i отримає значення за замовчуванням, рівне 1.

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

Щоб краще уявити собі причини використання аргументів за замовчуванням, розглянемо наступний практичний приклад. Він містить наступну корисну функцію xyout ():

// виводить рядок в позиції X, Y
void xyout (char * str, int x = 0, int у = 0)
if (! x) x = wherex ();
if (! y) у = wherey ();
gotoxy (x, y);
cout <>

Ця функція виводить на екран рядок, на яку вказує змінна str, причому цей рядок розміщується на екрані в координатах х і у. Однак, якщо жодна з координат х або у не указу-на, то рядок виводиться в те місце екрану, яке відповідає поточним значенням у. (Можна уявити собі цю функцію як вдосконалену версію функції puts ()). Функції wherex (), wherey () і gotoxy () є бібліотечними функціями Borland С ++. Функції wherex () і wherey () повертають поточні значення координат х і у. Ці поточні координати визначають, куди будуть виводитися дані. Функція gotoxy () переміщає курсор в точку із заданими координатами х і у.

Наступна коротка програма демонструє використання функції xyout ().

#include
#include
void xyout (char * str, int x = 0, int у = 0)
if (! x) x = wherex ();
if (! y) у = wherey ();
gotoxy (x, y);
cout <>
int main ()
xyout ( "hello", 10, 10);
xyout ( "there");
xyout ( "l like З + +", 40); // як і раніше на десятому рядку
xyout ( "This is on line 11. \ n", 1, 11);






xyout ( "This follows on line 12. \ n");
xyout ( "This follows on line 13.");
return 0;
>

Подивіться уважно на виклик функції xyout () у функції main (). Ця програма виводить на екран дані, як показано нижче. Як показує ця програма, хоча іноді буває корисно вказати, куди саме на екран виводити дані, часто можна просто продовжувати висновок з тієї точки, де закінчився висновок попередньої порції даних. Використання аргументів за замовчуванням дозволяє застосовувати одну й ту ж функцію в обох випадках, так що немає необхід-мости в двох окремих функціях.

Приклад виведення функції xyout ()
hello there I like С ++
This is on line 11.
This follows on line 12.
This follows on line 13.

Звернемо увагу, що функції main () і xyout () викликаються з трьома, двома або одним аргу-ментом. У разі виклику з одним аргументом величини х і у задається за замовчуванням. Коли Ви телефонуєте з двома аргументами величина у задається за замовчуванням. Однак неможливо викликати функцію xyout () з величиною х, заданої за замовчуванням, і величиною у, заданої при виконанні функції. У загальному випадку при виконанні функції її аргументи поєднуються з відповідними параметрами зліва направо. Після того, як всім використаним при виконанні функції аргументів поставлено-ни у відповідність параметри, які залишилися аргументів присвоюються їх значення за замовчуванням.

При створенні функції, що має аргументи за умовчанням, їх значення повинні бути указу-ни тільки один раз, причому в той самий момент, коли функція вперше оголошується в файлі. Наприклад, якщо функція xyout () визначена після функції main (), то аргументи за умовчанням
повинні оголошуватися в прототипі функції xyout (), але ці значення більше не повинні повто-ряться при визначенні функції xyout (). Наступна програма ілюструє сказане:

#include
#include
void xyout (char * str, int x = 0, int у = 0)
int main ()
xyout ( "hello", 10, 10);
xyout ( "there");
xyout ( "l like С ++", 40); // як і раніше на десятому рядку
xyout ( "This is on line 11. \ n", 1, 11);
xyout ( "This follows on line 12. \ n");
xyout ( "This follows on line 13.");
return 0;
>
/ * Оскільки значення за замовчуванням для х і у вже визначені в прототипі xyout (), то вони не можуть бути повторені тут * /
void xyout (char * str, int x, int y)
if (! x) x = wherex ();
if (! y) у = wherey ();
gotoxy (x, y);
cout <>

Якщо спробувати ще раз вказати ті ж самі значення за замовчуванням у визначенні функції xyout (), то компілятор повідомить про помилку і не буде продовжувати компіляцію програми.

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

// некоректно!
void xyout (int х = 0, int у = 0, char * str)

Нижче показана ще одна некоректна спроба використання параметра за замовчуванням:

// некоректно!
int f (int i, int j = 10, int k)

Після того як почалися параметри за замовчуванням, в списку не можуть з'явитися параметри, які не мають значення за замовчуванням.

Також можна використовувати параметри зі значеннями за замовчуванням в конструкторі об'єкту. Як приклад нижче наведена нова версія конструктора класу queue:

/ * Конструктор, який використовує значення за замовчуванням * /
queue :: queue (int id = 0)
sloc = rloc = 0;
who = id;
cout <<"Queue " <>

створюються два об'єкти - а й b. Значення id для об'єкта а дорівнює 0, а для об'єкта b дорівнює 2.







Схожі статті