Прежде чем приступить к параметрам функции, следует упомянуть, что переменные могут иметь различную область действия. В функциях область действия переменных имеет большое значение: функции должны быть написаны так, чтобы они были как можно более закрытыми от доступа извне, и это как раз касается области действия переменных.
Глобальные переменные
Переменные, объявленные вне функций, действительны во всех функциях программы – такие переменные называются глобальными. Хотя значения глобальных переменных и устанавливаются равными 0 при их объявлении, рекомендуется инициализировать их самостоятельно.
#include
using namespace std;
//Объявление глобальных переменных
int a, b;
void change() {
int r;
r = a;
a = b;
b = r;
}
void main() {
cin a b;
change();
cout
}
Для глобальных переменных, так же как и для функций, можно использовать прототипы. Такое объявление отличается от обычного определения переменной тем, что под нее не выделяется память. Определение «знакомит» переменную с компилятором. При этом также указывается ее имя и тип. Поэтому определение является также и объявлением. Переменная может быть объявлена единожды, но определять ее можно сколько угодно раз, пока определение соответствует объявленным параметрам.
Переменная объявляется без ее определения, если перед ней указано ключевое слово extern. При этом extern не означает, что определение переменной должно находиться в другом файле. Это говорит только о том, что это не определение переменной, а ее объявление.
В большинстве случаев рекомендуется избегать глобальных переменных, хотя в некоторых случаях их использование значительно упрощает интерфейс функции. Многие глобальные переменные могут легко привести к тому, что код программы потеряет читаемость и гибкость. Передача данных между функциями должна реализовываться с помощью параметров. Если данные о длительности вызова функции требуется получить во время ее выполнения, используется локальная переменная.
Локальные переменные
Если внутри блока объявлена переменная, она называется локальной. Вне функции нельзя получить доступ к этой переменной. Она создается и инициализируется при ее определении, и удаляется, когда программа покидает блок, в котором переменная была объявлена.
Везде, где это возможно, следует использовать локальные переменные. Память станет оптимально использоваться, поскольку она задействована только во время выполнения функции. Функции, которые используют глобальные или статические переменные, с большой вероятностью не могут работать параллельно.
Переменные параметров также являются локальными. Они помещаются в стек и удаляются из него при завершении функции, а инициализируются с параметрами вызова функции. Только ссылочные переменные не могут быть локальными, поскольку они являются ссылкой на переменную программы, вызывающей функцию.
Статические переменные
Локальные переменные могут быть объявлены в качестве статических. Такие переменные создаются и инициализируются, когда их определение встречается в программе первый раз. Переменная и ее содержимое при этом сохраняется до конца выполнения программы. Для определения переменной в качестве статической используется ключевое слово static.
Такие переменные видимы только в блоке, в котором они определены. В отличие от глобальных переменных к ним нельзя получить доступ извне. Статическая переменная — средство выбора, если функция требует некоторого подобия памяти для хранения информации о ее предыдущем вызове.
#include
using namespace std;
int globvar = 1;
void func(){
static int statvar = 1;
int locvar = 1;
cout
cout
cout
statvar++;
globvar++;
locvar++;
}
int main(){
func();
func();
func();
globvar = 8;
func();
func();
}
Локальная переменная locvar создается по-новому при каждом вызове функции и удаляется, когда программа покидает функцию. Каждый раз переменная инициализируется заново и принимает значение 1. После инкрементирования внутри функции переменная имеет значение 2. Но при завершении функции, данная переменная удаляется, а при вызове функции создается и инициализируется заново. Если мы попытаемся изменить ее значения за пределами блока, в котором она объявлена, компилятор выдаст ошибку, что такая переменная не была объявлена.
Глобальная переменная globvar создается и инициализируется при старте программы. Внутри функции она инкрементируется и выводится. Поскольку эта переменная является глобальной, она доступна во всех функциях и в главной функции.
Статическая переменная statvar ведет себя частично как локальная, частично как глобальная переменная. Как локальная переменная она защищена от неконтролируемого доступа извне. С другой стороны, она не теряет своего значения после завершения работы функции. Если мы попытаемся изменить ее значение за пределами блока, в котором она объявлена – компилятор выдаст нам ошибку, но, в отличие от локальной переменной, при выходе из функции статическая переменная не удаляется, и при следующем вызове функции, мы сможем продолжить работу с переменной.
Параметры функции
Функция может иметь параметры, которые служат для передачи в нее значений. Это делает работу с ней более гибкой. В параметрах открыто указывается, какую информацию функция получает извне. При этом можно говорить об интерфейсе функции.
Объявление параметров функции аналогично объявлению переменных. Тип параметров важен для проверки соответствия передаваемого значения внутреннему параметру функции. Через имена параметров функция получает их значения извне. Значение, которое при вызове передается в функцию, копируется. Поэтому возможно передавать также константы.
Передача данных между программой и функцией всегда должна осуществляться с помощью параметров. Даже если вам кажется, что удобнее использовать глобальную переменную, это следует делать только в хорошо обоснованных исключительных ситуациях.
При объявлении параметров можно написать тип без соответствующего ему имени переменной.
float func(bool, float);
Естественно, внутри функции нельзя получить доступ к этому параметру. Однако есть случаи, в которых задан интерфейс функции и нужно написать его техническую реализацию. В связи с этим может оказаться, что какой-то параметр вообще не будет использоваться. Поскольку изменение интерфейса может повлиять на работу других частей программы, лишний параметр оставляют.
Параметр с точки зрения функции — самая обычная локальная переменная, в которую при вызове функции копируется значение передаваемого параметра. Поскольку речь идет о копии, функция не имеет доступа к передаваемым переменным. Ей доступна только локальная переменная. Она может быть прочитана внутри функции. Поскольку эта переменная локальна, она также может быть изменена. Такие изменения переменной внутри функции не затрагивают передаваемый в нее параметр.