Читать «Справочное руководство по C++» онлайн - страница 49

Бьярн Страустрап

 struct s { char* p; }; // описание локальной структуры `s'

}

Такие правила позволяют классам ссылаться друг на друга при их описании, пример,

class vector;

class matrix {

 //…

 friend vector operator*(matrix&, vector&);

};

class vector {

 //…

 friend vector operator*(matrix&, vector&);

};

Описание friend (дружественные функции) обсуждается в §R.11.4, а функция operator в §R.13.4. Если класс, указанный как друг, пока еще не описан, его имя считается принадлежащим той же области видимости, в которой находится имя класса, содержащего описание friend (§R.11.4).

В описании объектов или функций можно также использовать конструкцию спецификация-сложного-типа (§R.7.1.6). Ее использование отличается от описания класса тем, что если класс, чье имя указано в спецификации, находится в текущей области видимости, то имя из этой спецификации будет ссылаться на него, например:

struct s { int a; }

void g()

{

 struct* s p = new s; // обращение к глобальной `s'

 p-›a = 1;

}

Имя считается описанным сразу же после появления его идентификатора в описании. Отсюда следует, что в описании

class A * A;

A в начале задается, как имя класса, а затем оно переопределяется как имя указателя на объект этого класса, поэтому для обозначения этого класса следует использовать спецификацию-сложного типа class A. Такое "трюкачество" с именами может вызвать недоумение, и лучше его избегать.

Конструкция имя-typedef (§R.7.1.3) обозначает класс и считается именем-класса, см. также §R.7.1.3.

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.