|
|
список-членов:
описание-члена список-членов opt
спецификация-доступа : список-членов opt
описание-члена:
спецификации-описания opt список-описателей-членов opt ;
определение-функции ; opt
уточненное-имя ;
список-описателей-членов:
описатель-члена
список-описателей-членов , описатель-члена
описатель-члена:
описатель спецификация-чистой opt
идентификатор opt : выражение-константа
спецификация-чистой:
= 0
С помощью конструкции список-членов можно описать данные, функции,
классы, элементы перечисления ($$R.7.2), битовые поля, друзей
($$R.11.4) и имена типов ($$R.7.1.3, $$R.9.1). Кроме того,
список-членов может содержать описания, устанавливающие доступ к
именам членов, см. $$R.11.3. Никакой член не может быть дважды
описан в списке-членов. Список-членов определяет все множество
членов данного класса, т.е. нельзя добавить еще один член в каком-либо
другом описании.
Отметим, что одно имя может обозначать несколько функций-членов
при условии, что их типы достаточно отличаются друг от друга ($$R.13).
Укажем, что описатель-члена не может содержать инициализатора ($$R.8.4).
Инициализация члена возможна с помощью конструктора, см. $$R.12.1.
Член не может иметь спецификацию auto, extern или register.
Конструкция спецификации-описания может отсутствовать только в
описании функции. Конструкция список-описателей-членов может
опускаться только после конструкций спецификация-класса,
спецификация-перечисления или спецификация-описания, если последняя
имеет вид friend спецификация-сложного-типа. Конструкция
спецификация-чистой используется только при описании виртуальной
функции ($$R.10.2).
Если члены являются объектами классов, то эти классы должны
быть ранее описаны. В частности, класс C1 не может содержать объект
класса C1, но может содержать указатель или ссылку на класс C1.
Если в типе нестатического члена используется массив, то все
размеры всех индексов массива должны быть указаны.
Приведем простой пример описания класса:
struct tnode { char tword[20]; int count; tnode *left; tnode *right; };
Здесь класс содержит массив из двадцати символов, целое и два указателя на ту же структуру. После появления такого описания следующее:
tnode s, *sp;
задает s как объект типа tnode и sp как указатель на tnode. С учетом
этих описаний s->count обозначает член count структуры, на которую
указывает sp; s.left обозначает указатель left на поддерево
структуры s; s.right->tword[0] обозначает первый символ члена
tword поддерева структуры s, на которую указывает right.
Нестатические члены класса, представляющие данные и описанные
подряд и без использования спецификации-доступа, размещаются внутри
объекта типа класс так, что позже описанные члены имеют большие адреса.
Порядок размещения таких членов, если их описание перемежается
описаниями со спецификацией-доступа, зависит от реализации ($$R.11.1).
Принятые в реализации правила выравнивания могут привести к тому,
что два соседних члена не будут располагаться сразу друг за другом.
К этому же могут привести правила выделения памяти для виртуальных
функций ($$R.10.2) и виртуальных базовых классов ($$R.10.1);
см. также $$R.5.4.
Функция-член ($$R.9.3), имя которой совпадает с именем класса,
является конструктором ($$R.12.1). Имя статического члена данных,
элемента перечисления, члена безымянного объединения или вложенного
типа не может совпадать с именем класса.
| |