Чтение онлайн

на главную

Жанры

Шрифт:

откомпилируется и в лучшем случае приведет к какой-нбудь странного вида выдаче. Очевиднще хуже, каждый вызов функции с автоматическим объектом класса включает по меньшей мере один вызов программ выделения и освобождения свободной памяти. Это сделало бы также невозможным реализацию inline-функций членов, которые обращаются к данным закрытой части. Более того, такое изменение сделает невозможным совместную компоновку C и С++ программ (поскольку C компилятор обрабатывает struct не так, как это будет делать С++ компилятор). Для С++ это было сочтено неприемлемым.

Глава 5

Классы

Эти

типы не «абстрактны», они столь же реальны, как int и float

Дуг МакИлрой

В этой главе описываются возможности определения новых типов в С++, для которых доступ к данным ограничен заданным множеством функций доступа. Объясняются способы защиты струтуры данных, ее инициализации, доступа к ней и, наконец, ее уничтожения. Примеры содержат простые классы для работы с таблицей имен, манипуляции стеком, работу с множеством и релизацию дискриминирующего (то есть, «надежного») объединения. Две следующие главы дополнят описание возможностей определния новых типов в С++ и познакомят читателя еще с некоторыми интересными примерами.

5.1 Знакомство и краткий обзор

Предназначение понятия класса, которому посвящены эта и две последующие главы, состоит в том, чтобы предоставить программисту инструмент для создания новых типов, столь же удобных в обращении сколь и встроенные типы. В идеале тип оределяемый пользователем, способом использования должен отлчаться от встроенных типов, только способом создания.

Тип есть конкретное представление некоторой концепции (понятия). Например, имеющийся в С++ тип float с его операцями +, -, * и т.д. обеспечивает ограниченную, но конкретную версию математического понятия действительного числа. Новый тип создается для того, чтобы дать специальное и конкретное определение понятия, которому ничто прямо и очевидно среди встроенных типов не отвечает. Например, в программе, которая работает с телефоном, можно было бы создать тип trunk_module (элемент линии), а в программе обработки текстов – тип list_of_paragraphs (список параграфов). Как правило, програму, в которой создаются типы, хорошо отвечающие понятиям прложения, понять легче, чем программу, в которой это не делется. Хорошо выбранные типы, определяемые пользователем, делают программу более четкой и короткой. Это также позволяет компилятору обнаруживать недопустимые использования объектов, которые в противном случае останутся необнаруженными до тетирования программы.

В определении нового типа основная идея – отделить несщественные подробности реализации (например, формат данных, которые используются для хранения объекта типа) от тех кчеств, которые существенны для его правильного использования (например, полный список функций, которые имеют доступ к даным). Такое разделение можно описать так, что работа со структурой данных и внутренними административными подпрограмами осуществляется через специальный интерфейс (канализирется).

Эта глава состоит из четырех практически отдельных чатей:

#5.2 Классы и Члены. Этот раздел знакомит с основным понятием типа, определяемого пользователем, который называеся класс (class). Доступ к объектам класса может ограничваться набором функций, которые описаны как часть этого класа. Такие функции называются функциями членами. Объекты класса создаются и инициализируются функциями членами, спецально для этой цели описанными. Эти функции называются контрукторами. Функция член может быть специальным образом опсана для «очистки» каждого классового

объекта при его уничтожении. Такая функция называется деструктором.

#5.3 Интерфейсы и Реализации. В этом разделе приводится два примера того, как класс проектируется, реализуется и ипользуется.

#5.4 Друзья и Объединения. В этом разделе приводится много дополнительных подробностей, касающихся классов. В нем показано, как предоставить доступ к закрытой части класса функции, которая не является членом этого класса. Такая фунция называется друг (friend). В этом разделе показано также, как определить дискриминирующее объединение.

#5.5 Конструкторы и Деструкторы. Объект может создаватся как автоматический, статический или как объект в свободной памяти. Объект может также быть членом некоторой совокупности (типа вектора или класса), которая в свою очередь может рамещаться одним из этих трех способов. Довольно подробно обясняется использование конструкторов и деструкторов.

5.2 Классы и члены

Класс – это определяемый пользователем тип. Этот раздел знакомит с основными средствами определения класса, создания объекта класса, работы с такими объектами и, наконец, уничтжения таких объектов после использования.

5.2.1 Функции члены

Рассмотрим реализацию понятия даты с использованием struct для того, чтобы определить представление даты date и множества функций для работы с переменными этого типа:

struct date (* int month, day, year; *); // дата: месяц, день, год *) date today; void set_date(date*, int, int, int); void next_date(date*); void print_date(date*); // ...

Никакой явной связи между функциями и типом данных нет. Такую связь можно установить, описав функции как члены:

struct date (* int month, day, year;

void set(int, int, int); void get(int*, int*, int*); void next; void print; *);

Функции, описанные таким образом, называются функциями членами и могут вызываться только для специальной переменной соответствующего типа с использованием стандартного синтаксса для доступа к членам структуры. Например:

date today; // сегодня date my_burthday; // мой день рождения

void f (* my_burthday.set(30,12,1950); today.set(18,1,1985);

my_burthday.print;

today.next; *)

Поскольку разные структуры могут иметь функции члены с одинаковыми именами, при определении функции члена необходимо указывать имя структуры:

void date::next (* if ( ++day » 28 ) (* // делает сложную часть работы *) *)

В функции члене имена членов могут использоваться без явной ссылки на объект. В этом случае имя относится к члену того объекта, для которого функция была вызвана.

5.2.2 Классы

Описание date в предыдущем подразделе дает множество функций для работы с date, но не указывает, что эти функции должны быть единственными для доступа к объектам типа date. Это ограничение можно наложить используя вместо struct class:

class date (* int month, day, year; public: void set(int, int, int); void get(int*, int*, int*); void next; void print; *);

Метка public: делит тело класса на две части. Имена в первой, закрытой части, могут использоваться только функциями членами. Вторая, открытая часть, составляет интерфейс к обекту класса. Struct – это просто class, у которого все члены классы открытые, поэтому функции члены определяются и исползуются точно так же, как в предыдущем случае. Например:

Поделиться:
Популярные книги

Дайте поспать! Том III

Матисов Павел
3. Вечный Сон
Фантастика:
фэнтези
5.00
рейтинг книги
Дайте поспать! Том III

Путь Чести

Щукин Иван
3. Жизни Архимага
Фантастика:
фэнтези
боевая фантастика
6.43
рейтинг книги
Путь Чести

Энфис 2

Кронос Александр
2. Эрра
Фантастика:
героическая фантастика
рпг
аниме
5.00
рейтинг книги
Энфис 2

Сумеречный Стрелок 2

Карелин Сергей Витальевич
2. Сумеречный стрелок
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Сумеречный Стрелок 2

Сводный гад

Рам Янка
2. Самбисты
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Сводный гад

Книга пяти колец. Том 3

Зайцев Константин
3. Книга пяти колец
Фантастика:
фэнтези
попаданцы
аниме
5.75
рейтинг книги
Книга пяти колец. Том 3

Диверсант

Вайс Александр
2. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
5.00
рейтинг книги
Диверсант

Ученичество. Книга 2

Понарошку Евгений
2. Государственный маг
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Ученичество. Книга 2

Титан империи 3

Артемов Александр Александрович
3. Титан Империи
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Титан империи 3

Последний попаданец 9

Зубов Константин
9. Последний попаданец
Фантастика:
юмористическая фантастика
рпг
5.00
рейтинг книги
Последний попаданец 9

Измена. Право на сына

Арская Арина
4. Измены
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Право на сына

Неестественный отбор.Трилогия

Грант Эдгар
Неестественный отбор
Детективы:
триллеры
6.40
рейтинг книги
Неестественный отбор.Трилогия

Хозяйка дома на холме

Скор Элен
1. Хозяйка своей судьбы
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Хозяйка дома на холме

Гром над Академией. Часть 2

Машуков Тимур
3. Гром над миром
Фантастика:
боевая фантастика
5.50
рейтинг книги
Гром над Академией. Часть 2