Программирование >>  Инициализация объектов класса, структура 

1 ... 39 40 41 [ 42 ] 43 44 45 ... 395


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. Перегруженный оператор сам может быть перегружен, если списки параметров



1 ... 39 40 41 [ 42 ] 43 44 45 ... 395

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.069
При копировании материалов приветствуются ссылки.
Яндекс.Метрика