Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курс лекцій.doc
Скачиваний:
15
Добавлен:
03.11.2018
Размер:
1.12 Mб
Скачать

1.4 Оголошення в операторах.

В С++ знято обмеження на розміщення описувачів. Як відомо, в базо-вому С описувач може міститись в тілі будь-якого складеного оператора (причому синтаксично більшість компіляторів вимагають його розміщення на початку тіла складеного оператора). В С++ змінну можна описувати будь-де, навіть всередині оператора:

for (int i=1;i<5;i++);

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

1.5 Перегрузка функцій.

У найпростішому випадку перегрузка функцій полягає у використанні ряду однойменних функцій, що відрізняються за сигнатурами. Тобто компілятор допускає визначення однойменних функцій FuncName виду:

type1 FuncName (type11 x1,type12 x2,..., type1N xN)

{ ...}

type2 FuncName (type21 x1,type22 x2,..., type2N xN)

{...}

typeM FuncName (typeM1 x1,typeM2 x2,..., typeMN X  )

Тут typeIJ - певний стандартний тип даних, xIJ- ідентифікатори змінних, N, N, ..., N- кількості аргументів функцій.

Приклад:

int Name (int first)

{return first*first;}

int Name (unsigned first)

{return first*first;}

int Name (int first,char*second)

{return first*strlen (second);}

main()

{printf ("%d\n",Name (4));

printf ("%d\n";(unsigned)4);

printf ("%d\n",Name (4,"abc");

}

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

float Name (int first)

{return first*first;}

то буде видане повідомлення про помилку.

1.6 Значення формальних параметрів по замовчуванню.

В мові С++ при визначенні функцій допускається конструкція виду:

ReturnType FunctionName (type1 x1,type2 x2,...,typen xn,typen1 xn1=v1,

typen2 xn2=v2,...,typenk xnk=vk)

де ReturnType, typej - ідентифікатори типів даних, FunctionName- ідентифікатор імені функції, vj- константні вирази. Бачимо, що параметрам xn1, xn2,..., xnk присвоюються якісь значення v1,v2,...,vk безпосередньо в сигнатурі функції при її визначенні. Ці параметри будемо називати параметрами по замовчуванню. Діє правило: якщо параметр є параметром по замовчуванню , то всi параметри , якi стоять справа вiд нього, теж повиннi бути параметрами по замовчуванню. Специфіка параметрів по замовчуванню полягає в тому, що всі вони чи частина з них може бути відсутньою в момент виклику функції. Тоді, якщо в момент виклику кількість фактичних параметрів не менша кількості звичайних параметрів функції і не більша кількості всіх можливих параметрів ( в противному випадку буде помилка), то після ініціалізації всіх можливих параметрів зліва направо, компілятор буде вважати, що всі інші параметри ініціалізовані значеннями, які присвоєні їм в сигнатурі .

Розглянемо приклад. Нехай визначені такі функції:

void Name1 (float x,int y,char z='b')

{printf ("x=%0.1f y=%d z=%c\n",x,y,z)

}

void Name2 (float x,int y=16,char z='a')

{printf ("x=%0.1f y=%d z=%c\n",x,y,z)}

Тоді допускається такий їх виклик:

Name1 (1.0,5,’g’);

Name1 (1.0,5);

Name2 (2.0,25,'a');

Name2 (2.0,25);

Name2 (2.0);