Понятие о функциях в С++
Программа на C++ состоит из функций. Обязательная функция -- main (с нее начинается выполнение программы). Функция начинает выполняться в момент вызова. Любая функция должна быть объявлена и определена. Объявлений может быть несколько, а определение только одно. Объявление функции делается раньше вызова, чтобы компилятор проверил правильность вызова.
Объявление функции задает ее имя, тип возвращаемого значения и список передаваемых параметров.
Определение функции содержит, тело функции, включающее в себя операторы и описания в фигурных скобках:
Составные части определения функции:
• Необязательный модификатор класс может явно задать область видимости функции, используя ключевые слова extern и static
• extern — глобальная видимость во всех модулях программы (по умолчанию);
• static — видимость только в пределах модуля, в котором определена функция.
• Тип возвращаемого функцией значения может быть любым, кроме массива и функции (но может быть указателем на массив или функцию). Если функция не должна возвращать значение, указывается тип void.
• Список параметров определяет величины, которые надо передать в функцию при ее вызове. Элементы списка параметров разделяются запятыми. Для каждого параметра, передаваемого в функцию, указывается его тип и имя (в объявлении имена можно опускать).
В определении, объявлении и при вызове функции типы и порядок параметров должны совпадать.
На имена параметров ограничений по соответствию не накладывается, поскольку функцию можно вызывать с различными аргументами, а в прототипах имена компилятором игнорируются (служат только для улучшения читаемости программы).
Функцию можно определить как встроенную с помощью модификатора inline, который рекомендует компилятору вместо обращения к функции помещать ее код непосредственно в каждую точку вызова. Модификатор inline ставится перед типом функции. Он применяется для коротких функций, чтобы снизить накладные расходы на вызов (сохранение и восстановление регистров, передача управления). Директива inline носит рекомендательный характер и выполняется компилятором по мере возможности.
Использование inline-функций может увеличить объем исполняемой программы. Определение функции должно предшествовать ее вызовам, иначе вместо inline-расширения компилятор сгенерирует обычный вызов.
Типы возвращаемого значения и параметров совместно определяют тип функции.
Для вызова функции в простейшем случае нужно указать ее имя, за которым в круглых скобках через запятую перечисляются имена передаваемых аргументов.
Вызов функции может находиться в любом месте программы, где по синтаксису допустимо выражение того типа, который формирует функция.
Если тип возвращаемого функцией значения не void, она может входить в состав выражений или, в частном случае, располагаться в правой части оператора присваивания.
Пример. Функция, возвращает сумму двух целых величин.
Величины, описанные внутри функции и ее параметры, являются локальными.
При выходе из функции участок стека освобождается, поэтому значения локальных переменных между вызовами одной и той же функции не сохраняются. Чтобы этого избежать, при объявлении локальных переменных используется модификатор static:
Пояснения.
Статическая переменная n размещается в сегменте данных и инициализируется один раз при первом выполнении оператора, содержащего ее определение. Автоматическая переменная m инициализируется при каждом входе в функцию. Автоматическая переменная р инициализируется при каждом входе в блок цикла.
Программа выведет на экран:
Объявление функции задает ее имя, тип возвращаемого значения и список передаваемых параметров.
Определение функции содержит, тело функции, включающее в себя операторы и описания в фигурных скобках:
[ класс ] тип имя ( [ список_параметров ]) [throw ( исключения ) ] { тело функции }
• Необязательный модификатор класс может явно задать область видимости функции, используя ключевые слова extern и static
• extern — глобальная видимость во всех модулях программы (по умолчанию);
• static — видимость только в пределах модуля, в котором определена функция.
• Тип возвращаемого функцией значения может быть любым, кроме массива и функции (но может быть указателем на массив или функцию). Если функция не должна возвращать значение, указывается тип void.
• Список параметров определяет величины, которые надо передать в функцию при ее вызове. Элементы списка параметров разделяются запятыми. Для каждого параметра, передаваемого в функцию, указывается его тип и имя (в объявлении имена можно опускать).
В определении, объявлении и при вызове функции типы и порядок параметров должны совпадать.
На имена параметров ограничений по соответствию не накладывается, поскольку функцию можно вызывать с различными аргументами, а в прототипах имена компилятором игнорируются (служат только для улучшения читаемости программы).
Функцию можно определить как встроенную с помощью модификатора inline, который рекомендует компилятору вместо обращения к функции помещать ее код непосредственно в каждую точку вызова. Модификатор inline ставится перед типом функции. Он применяется для коротких функций, чтобы снизить накладные расходы на вызов (сохранение и восстановление регистров, передача управления). Директива inline носит рекомендательный характер и выполняется компилятором по мере возможности.
Использование inline-функций может увеличить объем исполняемой программы. Определение функции должно предшествовать ее вызовам, иначе вместо inline-расширения компилятор сгенерирует обычный вызов.
Типы возвращаемого значения и параметров совместно определяют тип функции.
Для вызова функции в простейшем случае нужно указать ее имя, за которым в круглых скобках через запятую перечисляются имена передаваемых аргументов.
Вызов функции может находиться в любом месте программы, где по синтаксису допустимо выражение того типа, который формирует функция.
Если тип возвращаемого функцией значения не void, она может входить в состав выражений или, в частном случае, располагаться в правой части оператора присваивания.
Пример. Функция, возвращает сумму двух целых величин.
#includeint sum(int a, int b) ; // объявление функции int main(){ int a = 2, b = 3, c,d; с = sum(a,b); // вызов функции cin >> d; cout << sum(c, d); // вызов функции return 0; } int sum(int а, int b){ // определение функции return (а + b); }
При выходе из функции участок стека освобождается, поэтому значения локальных переменных между вызовами одной и той же функции не сохраняются. Чтобы этого избежать, при объявлении локальных переменных используется модификатор static:
#includevoid f(int a){ int m = 0; cout << "n m p\n"; while (a--){ static int n = 0; int p = 0; cout << n++ << ' ' << m++ << ' ' << P++ << '\n'; } } int main(){ f(3); f(2); return 0;}
Статическая переменная n размещается в сегменте данных и инициализируется один раз при первом выполнении оператора, содержащего ее определение. Автоматическая переменная m инициализируется при каждом входе в функцию. Автоматическая переменная р инициализируется при каждом входе в блок цикла.
Программа выведет на экран:
n m р 0 0 0 1 1 0 2 2 0 n m р 3 0 0 4 1 0