Как и в языке Objective-C, интерфейсный файл (описывающий, например, абстракцию
игральной карты) может содержать описания более чем одного класса, хотя обычно это
происходит, только если классы тесно связаны. Поскольку языки C и C++ не
поддерживают ключевого слова import (в отличии от Objective-C), для достижения того же
эффекта используется условное подключение файла. Когда файл card.h считывается
впервые, символ CARDH (предполагается, что он не встречается в других местах)
является неопределенным, и тем самым срабатывает условный оператор ifndef (если не
определено), так как значение CARDH действительно не определено. Значит, файл card.h
будет считан. При всех последующих попытках считать этот файл символ будет известен,
и загрузка файла будет пропущена.
# ifndef CARDH // файл должен читаться лишь один раз
# define CARDH
. . .
# endif
Описание класса начинается с ключевого слова class (листинг 3.6). В C++ описание класса
во многом напоминает структуру в языке C, за исключением того, что вместе с полями
данных стоят заголовки процедур . Ключевое слово private: предшествует фрагментам
кода, доступ к котором разрешен только из самого класса. Ключевое слово public:
обозначает область интерфейса — то есть то, что видно извне класса. Как и в языке
Objective-C, описание переменных экземпляра в области private дается в интерфейсном
файле только ради компилятора (чтобы он мог определить размер памяти, требуемой для
объекта), а для пользователя данного класса эти поля остаются недоступными (что
является нарушением первого принципа Парнаса).
Поскольку пользователи часто интересуются открытой областью интерфейса public, эта
часть должна идти первой. Как и выше, следует использовать комментарии, табуляцию,
группирование и упорядочивание по алфавиту, чтобы сделать описание более читаемым.
Функция card(suit, int) в описании класса является уникальной во многих отношениях —
не только потому, что ее имя совпадает с именем класса, но и потому, что у нее нет
возвращаемого значения. Эта функция называется конструктором, она используется при
инициализации создаваемых экземпляров класса. Мы обсудим конструкторы более
подробно в главе 4.
Ключевое слово void, как и в языке Objective-C, показывает отсутствие типа. Когда оно
используется как тип возвращаемого значения, это означает, что метод применяется как
процедура ради побочного эффекта, а не для вычисления результата.
Методы draw и halfdraw иллюстрируют описание типов параметров как составной части
объявления функции. Этот стиль декларирования называется прототипом функции.
Теперь он является частью ANSI стандарта языков C и C++. Заметьте, что прототип
аналогичен списку аргументов, хотя аргументы представлены как типы данных и их
имена являются необязательными.
Аргумент с типом данных window, обрабатываемый функцией draw, передается через
ссылку. На это указывает & в списке аргументов. Большие структуры, вроде описания
окон (тип данных window в нашем примере), часто передаются через ссылку.
Листинг 3.6. Описание класса сard на языке C++
enum suits {diamond, club, heart, spade};
PDF created with pdfFactory Pro trial version www.pdffactory.com