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);
тело derived::derived() (см. #8.5.5).
Порядок, в котором вызываются конструкторы для членов, не ус-
тановлен. Если базовый класс имеет конструктор, который можно
вызывать без параметров, не надо давать никакой список пара-
метров. Если класс члена имеет конструктор, который можно вы-
зывать без параметров, для этого члена не надо давать никакой
список параметров.
[Назад] [Содержание] [Вперед]
| Главная |