Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Бичков - Основи сучасного програмування.doc
Скачиваний:
80
Добавлен:
07.03.2016
Размер:
2.67 Mб
Скачать

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");}

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

float Name(int first)

{return first*first;},

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

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

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

<ReturnType>FunctionName(<type1>x1,<type2>x2,...,<typen>xn, <type n1>xn1=v1,<typen2>xn2=v2,...,<typenk>xnk=vk),

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

Нехай визначені функції:

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);

7.4.7. Посилання й покажчики

Операція адресації буде посиланням, якщо вона вжита у контексті:

type &variablename=initexspression;

Тут variablename – ідентифікатор змінної-посилання, що визначається, initexspression – об'єкт, що має адресу в пам'яті (інколи використовується поняття L-вираз). L-вираз – це вираз, що посилається на комірку пам'яті й тому має зміст у лівій частині бінарної операції присвоювання. Найпростішим прикладом L-виразу є ідентифікатор уже визначеної змінної. Він посилається на комірку пам'яті, де зберігається значення цієї змінної. Посилання variablename визначає місцезнаходження в пам'яті iнiцiалiзуючого виразу.

Змінна-посилання має бути обов'язково iнiцiалiзована. Оголошення вигляду Type & varname; не допускаються. Розглянемо фрагмент програми:

int y=16;

int & x=y;

printf ("x=%d\n",x);

y=12;

printf ("x=%d\n",x);

Результат:

x=16

y=12

Оголошення int &x=y фактично визначає два ідентифікатори, що пов'язуються з однією й тією самою коміркою пам'яті. При зміні значення одного ідентифікатора змінюється значення й другого. Змінна x обробляється компілятором як звичайна змінна типу int. При звертанні до такої змінної немає потреби в операції зняття посилання чи яких-небудь інших діях. Описаний вище фрагмент програми можна переписати з використанням покажчиків:

int y=16;

int *x=&y;

printf("x=%d\n",*x);

y=12;

printf("x=%d\n",*x);

Бачимо, що посилання суттєво відрізняються від покажчиків.

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

а) для підтримки режиму зв'язку (аналог var у Pascal);

б) щоб не допустити копіювання змінних у стек.

Покажемо, як це зробити: