Оператор описание используется для введения нового идетификатора в блоке; он имеет вид
Оператор_описание: описание
Если введенный описанием идентификатор был описан ранее во внешнем блоке, внешнее описание становится скрытым на пртяжении блока, после чего оно вновь всупает в силу.
Каждая инициализация auto и register переменных произвдится каждый раз, когда выполняется их оператор_описание. Можно передавать управление в блок, но не таким путем, котрый приводит к невыполнению инициализаций, см. #9.11. Иницилизации переменных класса памяти static (#4.4) производятся только один раз, когда программа начинает выполняться. 10. Определения Функций
Программа состоит из последовательности описаний. Код (текст программы) функции может быть задан только вне всех блоков и внутри описаний классов. Определения функций имеют вид
определение_функции: спецификаторы_описания opt описатель_функции инициализатор_базового opt тело_функции
Спецификаторы_описания register, auto, typedef не могут использоваться внутри описания класса (#8.5), а friend и virtual могут использоваться только там. Описатель функции – это описатель «функции, возвращающей ...» (#8.4).Формальные параметры находятся в области видимости самого внешнего блока тела_функции. Описатели функции имеют вид
описатель_функции:
описатель ( список_описаний_параметров )
Если параметр специфицирован как register, то соответтвующий фактический параметр будет по возможности копироватся в регистр на входе в функцию. Если для параметра специфцировано константное выражение в качестве инициализатора, то это значение используется как значение параметра по умолчнию.
Тело функции имеет вид
тело_функции: составной_оператор
Вот простой пример полного определения функции:
int max(int a, int b, int c) (* int m = (a « b) ? a : b; return (m » c) ? m : c; *)
Здесь int – это спецификатор_типа; max(int a, int b, int c) – это описатель_функции; (* ... *) – это тело_функции.
Поскольку в контексте выражения имя моссива (в особености, как фактического параметра) принимается как означающее указатель на первый элемент массива, описания формальных праметров, которые описаны как «массив из ...», корректируются так, чтобы читались как «указатель на ...».
В определении конструктора могут быть заданы инициализторы для базового класса и для членов. Это главным образом полезно для объектов класса, констант и ссылок, где семантика инициализации и присваивания различаются. Инициализатор_базвого имеет вид
инициализатор_базового: : список_инициализаторов_членов
список_инициализаторов_членов: инициализатор_члена инициализатор_члена , список_инициализаторов_членов
инициализатор_члена: идентификатор opt ( список_параметров opt )
Если в инициализаторе_члена дан идентификатор, то список параметров используется для инициализации названного члена; если нет, то список параметров используется для базового класса. Например:
struct base (* base(int); ... *);
struct derived : base (* derived(int); base b; const c;
*);
derived::derived(int a) : (a+1), b(a+2), c(a+3) (* /* ... */ *)
derived d(10);
Сначала конструктор базового класса вызывается для обекта d с параметром 11, затем вызывается конструктор для члна b с параметром 12 и конструктор для члена c с параметром 13. Затем выполняется тело derived::derived() (см. #8.5.5). Порядок, в котором вызываются конструкторы для членов, не утановлен. Если базовый класс имеет конструктор, который можно вызывать без параметров, не надо давать никакой список парметров. Если класс члена имеет конструктор, который можно взывать без параметров, для этого члена не надо давать никакой список параметров.