|
Программирование >> Инициализация объектов класса, структура
class EntrySlot; extern EntrySlot* extern EntrySlot* 1ook up( string ); typedef pair< string, EntrySlot* > SymbolEntry; SymbolEntry current entry( author , 1ook up( author )); ... if ( EntrySlot *it = 1ook up( editor )) current entry.first = editor ; current entry.second = it; объекта, второе - указатель на соответствующий этому объекту элемент таблицы. (Мы вернемся к рассмотрению класса pair в разговоре о контейнерных типах в главе 6 и об обобщенных алгоритмах в главе 12.) 3.15. Типы классов Механизм классов позволяет создавать новые типы данных; с его помощью введены типы string, vector, complex и pair, рассмотренные выше. В главе 2 мы рассказывали о концепциях и механизмах, поддерживающих объектный и объектно-ориентированный подход, на примере реализации класса Array. Здесь м1, основываясь на объектном подходе, создадим простой класс String, реализация которого поможет понять, в частности, перегрузку операций - мы говорили о ней в разделе 2.3. (Классы подробно рассматриваются в главах 13, 14 и 15. Mi дали краткое описание класса для того, чтобы приводить более интересные примеры. Читатель, только начинающий изучение С++, может пропустить этот раздел и подождать более систематического описания классов в следующих главах.) Наш класс String должен поддерживать инициализацию объектом класса String, строковым литералом и встроенным строковым типом, равно как и операцию присваивания ему значений этих типов. Mi используем для этого конструкторы класса и перегруженную операцию присваивания. Доступ к отдельным символам String будет реализован как перегруженная операция взятия индекса. Кроме того, нам понадобятся: функция size() для получения информации о длине строки; операция сравнения объектов типа String и объекта String со строкой встроенного типа; а также операции ввода/вывода нашего объекта. В заключение м1 реализуем возможность доступа к внутреннему представлению нашей строки в виде строки встроенного типа. Определение класса начинается ключевым словом class, за которым следует идентификатор - имя класса, или типа. В общем случае класс состоит из секций, предваряемых словами public (открытая) и private (закрытая). Открытая секция, как typedef pair< string, string > Authors; Authors proust( marcel , proust ); Authors joyce( James , Joyce ); Authors musil( robert , musi1 ); Вот другой пример употребления пары. Первое значение содержит имя некоторого #inc1ude <iostream> class String; istream& operator ( istream&, Strings ); ostream& operator ( ostreams, const Strings ); class String { public: набор конструкторов для автоматической инициализации String strl; String() String str2( literal ); String( const char* ); String str3( str2 ); String( const Strings ); String(); String( const char* ); String( const Strings ); деструктор ~String(); операторы присваивания strl = str2 str3 = a string literal Strings operator=( const Strings ); Strings operator=( const char* ); операторы проверки на равенство strl == str2; str3 == a string literal ; bool operator==( const Strings ); bool operator==( const char* ); перегрузка оператора доступа по индексу strl[ 0 ] = str2[ 0 ]; chars operator[]( int ); доступ к членам класса int size() { return size; } char* c str() { return string; } private: int size; char * string; определение класса: правило, содержит набор операций, поддерживаемых классом и называемых методами или функциями-членами класса. Эти функции-члены определяют открытый интерфейс класса, другими словами, набор действий, которые можно совершать с объектами данного класса. В закрытую секцию обычно включают данные-члены, обеспечивающие внутреннюю реализацию. В нашем случае к внутренним членам относятся string -указатель на char, а также size типа int. size будет хранить информацию о длине строки, а string - динамически выделенный массив символов. Вот как выглядит Класс String имеет три конструктора. Как было сказано в разделе 2.3, механизм перегрузки позволяет определять несколько реализаций функций с одним именем, если все они различаются количеством и/или типами своих параметров. Первый конструктор String(); является конструктором по умолчанию, потому что не требует явного указания начального значения. Когда мы пишем: String str1; для str1 вызывается такой конструктор. Два оставшихся конструктора имеют но одному параметру. Так, для String str2( строка символов ); вызывается конструктор String(const char*); а для String str3(str2); конструктор St ring(const St ring &); Тип вызываемого конструктора определяется типом фактического аргумента. Последний из конструкторов, String(const Strings), называется копирующим, так как он инициализирует объект копией другого объекта. Если же написать: String str4(1024); то это вызовет ошибку компиляции, потому что нет ни одного конструктора с параметром типа int. Объявление перегруженного оператора имеет следующий формат: return type operator op (parameter list); где operator - ключевое слово, а op - один из предопределенных операторов: +, =, ==, [] и так далее. (Точное определение синтаксиса см. в главе 15.) Вот объявление перегруженного оператора взятия индекса: chars operator[] (int); Этот оператор имеет единственный параметр типа int и возвращает ссылку на char. Перегруженный оператор сам может быть перегружен, если списки параметров
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.069
При копировании материалов приветствуются ссылки. |