logo
volkov / C++ / Бьерн Страуструп-Справочное руководство по С++

R.9.2 Члены класса

список-членов:

описание-члена список-членов 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). Имя статического члена данных,

элемента перечисления, члена безымянного объединения или вложенного

типа не может совпадать с именем класса.