Объявление, определение, параметры и вызов функции

Операция sizeof

Операция sizeof позволяет опреде­лить, сколько памяти занимает то или иное значение. Например,

sizeof (int)

определяет число байтов, отводимое под переменные типа int, а

sizeof b

– число байтов, занимаемое переменной b.

Операндом унарной операции sizeof является имя типа или выраже­ние. Операнд заключается в скобки (если операнд – выражение, скобки не обязательны). Результат операции – целое число, равное количеству байтов, необходимых для хранения в памяти заданной величины.

4. Язык C++: функции

Подпрограммы в C/C++ называются функциями. Функции могут возвращать результат своего выполнения. Такие функции в язы­ке C++ имеют практически тот же смысл, что и функции в математике. Функция вызывается с определенными аргументами (фактическими параметрами), выполняет необходимые действия и возвращает результат в точку вызова. Результаты выполнения таких функций могут являться составными частями выражений.

Функции могут не иметь параметров, они выполняют одни и те же действия при всех вызовах, однако возвращаемый ими результат может быть разным, например, если он зависит от вводимых или получаемых извне значений.

Программа на языке C++ состоит, по крайней мере, из одной функ­ции – функции main. Программа может содержать и другие функции. Выполнение программы всегда начинается с функции main, других особенностей у функции main нет.

В C++ нет вложенных функций, то есть невозможно определить функцию внутри другой функции.

Каждая функция в C++ – это обособленный фрагмент программы, блок. Доступ к операторам функции нельзя получить с помощью какого-либо оператора перехода (например, невозможно, используя goto, перейти в середину другой функции). Единственный возможный способ выполнения операторов функции – ее вызов.

Для того, чтобы использовать функции, необходимо сделать их известными в программе. Различают объявление и определение функции.

Предварительное объявление функции, часто называемое прототипом функции, сообщает компилятору тип возвращаемого функцией значения, имя функции и (в круглых скобках) список ее параметров и заканчивается точкой с запятой:

// Прототип функции func с одним целым параметром,

// возвращающей в качестве результата целое число:

int func (int a);

// Прототип функции s с двумя параметрами типа int,

// возвращающей результат типа double:

double s (int x, int y);

// Прототип функции f без параметров, возвращающей целое число:

int f ();

Такое объявление функции подобно объявлению переменной, оно определяет сигнатуру функции (ее имя, количество, типы и порядок параметров), а также тип возвращаемого значения. Имена параметров в прототипе функции избыточны и могут отсутствовать:

int func (int);

double s (int, int);

Определение функции описывает дей­ствия, выполняемые функцией для получения результата. Оно начинается заголовком, который указывает тип возвращаемого функцией значения, имя функции, список параметров функции и их типы. После заголовка в фигурных скобках записываются операторы (тело) функции – действия, которые данная функция выполняет. Пример определения функции, принимающей в качестве параметра значение типа int, вычисляющей и возвращающей его квадрат:

int func (int a) // заголовок функции

{

int sq = a * a; // тело функции...

return sq;

}

Параметры, указанные в заголовке функции называются формальными параметрами. При выполнении функции вместо них подставляются фактические параметры, указываемые при обращении к функ­ции.

Для того, чтобы выполнить операторы функции, необходимо вызвать эту функцию (обратиться к ней), указав в нужной точке программы имя функции и следом в скобках ­– список фактических (передаваемых в функцию) параметров.

При вызове функции управление передается на ее начало и начинается выполнение ее операторов. Формальные параметры принимают значения фактических параметров, заданных при вызове, и функция выполняется в соответствии с ее определением. При достижении конца функции или оператора return происходит выход из функции, управление возвращается в ту точку, откуда функция была вызвана, а вместо имени функции подставляется вычисленный результат.

Несколько примеров использования определенной выше функции func, имеющей один параметр типа int и возвращающей значение этого же типа (a, b, c, d, k, m, n, x, y, z – переменные типа int):

a = func (3);

b = n + func (m);

c = func (z-y) + func (y+4);

cout << func (x);

d = func (func (k)); // "вложенный" вызов функции

Объявить функцию необходимо перед ее первым вызовом и сделать это можно одним из двух способов.

Во-первых, можно использовать предварительное объявление (прототип) функ­ции, “анонсируя” последующее ее определение. Анонсированное прототипом определение функции может располагаться в любом последующем месте программы, например:

int func(int); // объявление (прототип) функции func

...

int main ()

{

int x, y;

...

x = func(y); // вызов (обращение к) функции func

...

}

int func(int a) // определение функции func

{

...

}

Понятно, что прототип и заголовок функции должны совпадать по типу возвращаемого значения и по последовательности типов параметров.

Еще один способ объявить функцию – расположить определение функции перед первым ее вызовом:

int func(int a)

{

...

}

int main ()

{

int x, y;

...

x = func(y);

...

}

Функция может не возвращать никакого значения. В этом случае её результат должен быть объявлен с типом void, а её вызов не может быть использован в выражении:

void func_2(int a)

{

cout << a * a;

}

int main ()

{

...

func_2 (10); // вызов функции func_2 типа void

...

}