Так как в C++ нет вложенных функций, этот вопрос решается проще, чем на языке Pascal.
Есть несколько мест объявления переменных:
1) вне всех функций, в том числе вне main, например, в самом начале перед прототипами функций, между ними, перед функцией main или между текстами функций. Такие переменные, названные глобальными, “видны” из любой функции, размещенной после описания переменной, т. е. их можно там использовать. Память для глобальных переменных занята на всё время выполнения проекта;
2) в скобках в прототипе и в описании функции. Как видно из предыдущих примеров, не все используемые в функции переменные объявляются в заголовке. Здесь перечисляются только те переменные, которые должны быть переданы в функцию, то есть входные, и её результаты (выходные параметры), если такие есть. Такие переменные, названные формальными параметрами, доступны только в той единственной функции, в заголовке которой они описаны. Повторно в теле функции формальные параметры объявлять не надо! В прототипе функции имена параметров можно не писать, достаточно указать только их типы. Эта информация используется компилятором при проверке соответствия фактических и формальных параметров. При описании функции в её заголовке имена параметров и повторно их типы записываются обязательно:
3) переменные, содержащие некоторые промежуточные значения, объявляются в теле функции и доступны только в ней. Они не являются формальными параметрами, в заголовке функции не записываются, при вызове функции никак не передаются в неё и из функции не возвращаются.
4) как частный случай последней возможности переменные можно объявить внутри блока. Блок или составной оператор — это последовательность операторов, заключённая в фигурные скобки. Таким блоком может быть, например, тело любого из циклов, одна из ветвей if или switch, например, if (…) { float t; …}. Такую переменную (t) можно использовать только в этом блоке и во всех внутренних (вложенных) по отношению к нему. Вне данного блока она недоступна. Этим мы гарантируем, что вне блока такая переменная не будет изменена.
Переменные, объявленные по правилам 2), 3), 4), называются локальными. Они имеют следующие особенности:
· их можно объявить в любом месте функции или блока до первого их использования, то есть не обязательно в самом начале. Это, конечно, не относится к формальным параметрам, которые объявляются всегда в скобках заголовка;
· локальные переменные создаются при входе в функцию или блок и уничтожаются при выходе из них. При этом не просто теряются значения, но и освобождается память;
· локальные переменные в разных функциях или блоках, не вложенных друг в друга, могут иметь одинаковые идентификаторы. Но на самом деле это разные переменные, для них отводится разная память;
· как правило, использование локальных переменных предпочтительнее глобальных. Например, из двух вариантов функции
a) float MyMax1 (float x, float y)
{ return x>y?x:y;
}
b) float x, y;
float MyMax2 ()
{ return x>y?x:y;
}
первый лучше, так как использует локальные переменные. Во втором варианте используются глобальные переменные.
Сказанное выше относится к константам и типам. Эти элементы также могут быть локальными, то есть объявленными в функции или в блоке, и глобальными, которые доступны всем или нескольким функциям. Понятно, что не имеет смысла говорить о формальных константах или формальных типах.