ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 13.12.2020
Просмотров: 4291
Скачиваний: 28
Часть II. Язык программирования С++
176
Если функция выбрасывает исключение, типа которого нет в спе-
цификации, то вызывается функция:
void unexpected();
из стандартной библиотеки языка программирования C++, кото-
рая в свою очередь вызывает функцию
terminate
. Такие исклю-
чения называются
неожидаемыми
или
непредусмотренными
.
Для обработки таких исключений можно установить свой обра-
ботчик с помощью функции
set_unexpected
, работа с которой
описана в
разд. 36.5
.
Спецификаторы исключений можно также задавать и при объяв-
лении указателя на функцию. Например:
void (*pf)(void) throw(int, double);
Присваиваемое такому указателю значение должно указывать на
функцию, которая может выбрасывать только такие исключения,
которые присутствуют в спецификации исключений указателя на
функцию. Например:
void f() throw (int);
pf = f;
Г Л А В А
14
Классы
14.1. Введение
Классом
называется множество объектов, имеющих общие свой-
ства, и набор операций, допустимых над этими объектами. В языке
программирования C++ объектами являются переменные. Поэто-
му классы являются типами, которые отличаются от встроенных
типов данных тем, что позволяют определять операции, кото-
рые допускается выполнять над переменными, принадлежащими
классу. Новые типы в языке программирования C определяются
при помощи структур и объединений. Такой же подход к опреде-
лению классов принят и в языке программирования C++, но, до-
полнительно, в блоке структуры или объединения можно опреде-
лить функции, которые разрешается выполнять над переменными
типа структуры или объединения.
Однако такой подход к определению класса имеет один сущест-
венный недостаток, а именно, т. к. доступ к полям структуры или
объединения открыт, то над переменными, принадлежащими
классу, можно выполнять также и операции, не принадлежащие
этому классу. Для решения этой проблемы в языке программиро-
вания C++ для определения классов также используется ключе-
вое слово
class
, которое служит для определения структуры, а
точнее класса, доступ к членам которого закрыт. Возникает во-
прос, если доступ к членам класса закрыт, то как их использо-
вать? Для этого в языке программирования C++ определены спе-
Часть II. Язык программирования С++
178
цификаторы доступа
public
,
protected
и
private
, которые разре-
шают или ограничивают доступ к отдельным членам класса.
Теперь после этого краткого введения перейдем к техническим
вопросам, касающимся работы с классами в языке программиро-
вания C++.
14.2. Определение класса
Синтаксически класс определяется следующим образом:
class|struct|union имя_класса
{
// члены класса
};
При определении класса должно использоваться только одно из
ключевых слов
class
,
struct
или
union
. Каждое из этих ключевых
слов устанавливает различные режимы доступа к членам класса.
При использовании ключевого слова
class
доступ ко всем членам
класса закрыт, а при использовании ключевых слов
struct
или
union
— открыт. Чтобы открыть или закрыть доступ к опреде-
ленным членам класса, используются спецификаторы доступа,
которые будут рассмотрены в
разд. 14.4
.
Например, в листинге 14.1 определен контейнерный класс
IntBox
,
который предназначен для хранения одного целого числа. Пред-
положим, что это определение класса хранится в заголовочном
файле IntBox.h. Отметим, что этот заголовочный файл содержит
"часового", который исключает возможность повторного опреде-
ления класса
IntBox
в одном исходном файле. В качестве этого
"часового" выступает символическое имя
INT_BOX
.
Листинг 14.1. Определение класса
IntBox
#if !defined INT_BOX
#define INT_BOX
struct IntBox
{
// данные-члены класса
bool empty; // состояние контейнера
Глава 14. Классы
179
int room; // место для хранения целого числа
// функции-члены класса
void put(int n); // положить целое число в контейнер
int get(); // извлечь целое число из контейнера
bool isEmpty(); // проверить, свободен ли контейнер
};
#endif
Допускается объявлять только имя класса, не определяя его чле-
нов. Такое объявление класса называется
предварительным
.
В этом случае можно определять только указатели или ссылки на
такой класс, которые не требуют инициализации.
Определение класса вводит область видимости, которой принад-
лежат имена членов класса. Определение функции-члена класса
также принадлежит области видимости класса. Отсюда следует,
что в теле функции-члена класса можно обращаться к другим
членам этого класса просто по имени.
Функции-члены класса определяются как обычные функции. Но
если такая функция определяется вне класса, то, для того чтобы
показать, что она принадлежат классу, перед ее именем нужно
записать имя класса и оператор разрешения области видимости
(
::
).
Заметим, что определение функции, члена класса, также называ-
ется
методом
класса, а определение данных, членов класса —
атрибутами
класса.
Например, в листинге 14.2 определены функции-члены класса
IntBox
. Предположим, что эти определения хранятся в исходном
файле IntBox.cpp.
Листинг 14.2. Реализация функций-членов класса
IntBox
#include "IntBox.h"
void IntBox::put(int n) { room = n; empty = false; }
int IntBox::get() { empty = true; return room; }
bool IntBox::isEmpty() { return empty; }
Отметим построение проекта, содержащего классы. Определение
класса записывается в отдельный заголовочный файл, имя кото-
Часть II. Язык программирования С++
180
рого обычно совпадает с именем класса. Затем этот заголовочный
файл вставляется, при помощи директивы
#include
, во все исход-
ные файлы, которые используют этот класс. Реализация функ-
ций-членов класса обычно также записывается в отдельный ис-
ходный файл, имя которого совпадает с именем класса. Такой
подход упрощает разработку больших программ.
14.3. Объекты,
доступ к членам класса
После определения класса можно объявлять переменные, кото-
рые имеют тип этого класса, или, другими словами, принадлежат
этому классу, или являются экземплярами этого класса. В языке
программирования С++ экземпляры класса называются
объек-
тами
. Каждый объект содержит свой набор атрибутов класса.
После создания объектов класса над ними можно выполнять ме-
тоды этого класса.
Для доступа к членам класса вне области видимости этого класса
используются операторы
.
и
->
, как и в случае доступа к членам
структуры.
Пример использования класса
IntBox
приведен в листинге 14.3,
который содержит текст исходного файла main.cpp. Таким обра-
зом, весь проект содержит три файла: IntBox.h, IntBox.cpp,
main.cpp. Кроме того, заметим, что перед использованием объек-
та типа
IntBox
нужно установить значение атрибута
empty
этого
объекта в
true
.
Листинг 14.3. Пример использования класса
IntBox
#include <iostream>
#include "IntBox.h"
using namespace std;
int main()
{
IntBox box = {true}; // объявление объекта типа IntBox
int n;