В С++ иногда необходимо предварительно описать сущность функции для дальнейшего её использования в программе. Такое предварительное описание называется прототипированием функций. Прототипы функций — они как эскизы. Для тех, кто не знает: "Эскиз — это предварительный набросок, фиксирующий замысел художественного произведения".
Прототипы функций служат некоторого рода словарём функций, которые будут задействованы в программе. Они, прототипы функций, помогают и нам видеть, какие функции существуют в коде (когда функций много, это имеет важное значение, легче не запутаться и не начать писать то, что уже было написано, например), и компилятору помогают понимать, что где-то в коде имеется функция с заявленным скелетом. Благодаря использованию прототипов функций — порядок написания функций не имеет никакого значения: что снизу-вверх, что сверху-вниз, что чехардой — всё равно.
Прототип функции отличается от самой функции тем, что у функции есть тело с описанием выполняемого внутри функции кода, а у прототипа функции тела нет. Прототипы функций должны быть описаны выше самих функций.
C++
1
2
3
4
5
voidfoo();//прототип функции foo
voidfoo(){};//функция foo() с пустым списком параметров и с пустым телом кода
intmain(){}//Функция main()
Пропуск точки с запятой в конце прототипа функции является синтаксической ошибкой.
Если в ваших планах было или будет создать прототип функции и вы забыли или забудете поставить точку с запятой, то предполагаемый вами прототип функции компилятор станет считать самой обычной функцией и ожидать от вас написание для неё внутреннего её кода.
В прототипе функции обязательно указывать тип функции, имя функции, типы параметров.
Хотя имена параметров в прототипах функций не обязательны (они игнорируются компилятором), многие программисты их указывают в целях документации.
Имена параметров в прототипе функции (которые, повторим, не обязательны) могут вводить в заблуждение, если они ошибочны или неосмысленны. По этой причине многие программисты создают прототипы, копируя первую строку определения соответствующей функции (если исходный код функции доступен) и добавляя в конец прототипа точку с запятой.
Под определением функции имеется в виду непосредственно функция или с пустыми фигурными скобками, или с кодом внутри фигурных скобок.
Простыми словами: ваш набросок функции должен содержать основную информацию о функции, а использование прототипов функций позволяет не заморачиваться, какая функция сверху, какая снизу:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <iostream>
usingnamespacestd;
intsum(int,int);//прототип функции с двумя параметрами
voidfoo();//прототип функции без параметров
voidfoo(constchar*);//прототип функции с одним параметром
intmain(){
foo("HELLO!");//Использование одной функции
cout<<'\n';
foo();//Использование другой функции
cout<<'\n';
cout<<sum(10,35)<<"\n=======================\n";//Использование третьей функции
cin.get();
}
//При использовании прототипов функций не имеет значения, кому быть выше, кому ниже
intsum(intx,inty){//Функция суммы двух значений
cout<<"int sum(int x, int y)\n";
return0;
}
voidfoo(){
cout<<"=======================\n";//Функция без параметров
cout<<"void foo()";
cout<<"\n=======================\n";
}
voidfoo(constchar*S){//Функция, задействующая один параметр
cout<<"=======================\n";
cout<<"void foo(const char* S)"<<endl;
cout<<S;
cout<<"\n=======================\n";
}
Прототип функции — это своеобразный скелет, который только обозначает, что где-то в коде будет использована функция, в которой этот скелет станет основой.
Маленькая информационная табличка может помочь вам быстрее сообразить:
ПРОТОТИП
ФУНКЦИЯ
void foo();
void foo(){ код_функции}
int foo();
int foo(){ код_функции}
void foo(int);
void foo(int x){ код_функции}
void foo();
void foo(){ код_функции}
Когда вы начнёте разбивать программу на файлы, то вы, возможно, вынуждено будете применять прототипирование функций. В прототипах ничего плохого нет, прототипы функций можно воспринимать как средство выразительности, способствующее лучшему пониманию кода. Прототипы функций помогают и нам видеть некоторый набросок программы, и компилятору понимать и выискивать в коде описанную прототипом функцию.
3 комментария на «“Функции в С++ для начинающих. Прототипы”»
Я не знаком с лазарусом.
Но это просто описание названий функций для компилятора.
Это как начать человеческий разговор с компилятором и душевно перечислить ему названия функций, которые используются и что для них нужно.
В итоге, для компилятора не имеет значения порядок написания самих функций. Он знает о них и как они устроены.(название и параметры в них)
Это же вроде раздела интерфейсов модуля в лазарусе, где описаны заголовки функций? Очень похоже на то.
Я не знаком с лазарусом.
Но это просто описание названий функций для компилятора.
Это как начать человеческий разговор с компилятором и душевно перечислить ему названия функций, которые используются и что для них нужно.
В итоге, для компилятора не имеет значения порядок написания самих функций. Он знает о них и как они устроены.(название и параметры в них)