Прототип функції

Виклик функції означає використання цієї функції. Тут можна провести аналогію зі змінними: оголошення змінної ще не означає, що вона використовується, лише виконання певних операцій над змінною (наприклад, операції присвоєння) приводить до її реального використання. У той же час ми знаємо, що використання змінної без її оголошення породжує помилку. Описана ситуація залишається в силі й у випадку із функціями: заборонено використовувати функцію, яка не була оголошеною. Таке “попереднє” оголошення функції прийнято називати прототипом функції. Для визначення прототипу функції потрібно задати тип результату функції, її ім’я та список типів формальних параметрів у такому форматі:

[тип_результату] ім’я_функції(список_типів_параметрів);

Наприклад, прототипи розглянутих раніше функцій (max та divide) мають такий вигляд:

int max(int, int);

void divide(float, float);

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

Прототип функції виконує два завдання. Перше полягає в ідентифікації типу значення, яке поверне функція, так, щоб компілятор міг згенерувати коректний код для типу даних, що повертаються. Друге завдання - у визначенні типу та кількості аргументів, які використовуються функцією. Використовуючи прототип, компілятор може виконати, ретельний контроль числа аргументів і відповідність їхніх типів у викликах функції та її описі. Більше того, реалізація другого завдання прототипу функції передбачає можливість авто­ма­тичного перетворення типів фактичних аргументів до типу, що зазначений у прототипі функції. Таке перетворення типів відбувається за так званими правилами приведення типів С++, суть яких полягає в наступному: якщо типи формального параметру і аргумента функції не співпадають (але вони відносяться до одного з вбудованих типів мови С++), то відбувається автоматичне приведення значення “нижчого” типу до значення “вищого” типу згідно ієрархії основних типів, яка наведена у табл.1 (в порядку від “вищого” типу до “нижчого”).

Таблиця 1. Ієрархія приведення вбудованих типів мови С++

Типи даних
long double
double
float
unsigned long int (синонім unsigned long)
long int (синонім long)
unsigned int (синонім unsigned)
int
unsigned short int (синонім unsigned short)
short int (синонім short)
unsigned char
char

Якщо аргумент (фактичний параметр) функції має “нижчий” тип ніж тип відповідного формального параметра, то таке перетворення типу відбувається без втрати значення аргумента. У протилежному випадку, високою є імовірність втрати значення аргумента, наприклад, якщо відбувається перетворення числа типу float у число типу int. Таку ситуацію наочно демонструють результати виконання наступної програми.

#include<iostream>

#include<conio.h>

int square(int); // прототип функції

using namespace std;

void main()

{

cout<<square(4)<<endl; // хочемо отримати квадрат від 4

cout<<square(4.7)<<endl; // хочемо отримати квадрат від 4.7

_getch();

}

int square (int x) // опис функції

{

return x*x;

}

Тут, в обох випадках отримаємо значення 16, незважаючи на те, що в другому виклику функції square аргумент має значення типу double. Зауважимо, також, що прототипи функцій зазвичай розташовують на початку тексту програми відразу після директив препроцесора #include.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: