Файл: Pobegaylo_A._C_Cplus_dlya_studenta.pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 13.12.2020

Просмотров: 4146

Скачиваний: 28

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

Часть II. Язык программирования С++ 

176 

Если функция выбрасывает исключение, типа которого нет в спе-
цификации, то вызывается функция: 

  void unexpected(); 

из  стандартной библиотеки  языка  программирования  C++,  кото-
рая  в  свою  очередь  вызывает  функцию 

terminate

.  Такие  исклю-

чения  называются 

неожидаемыми

  или 

непредусмотренными

Для  обработки  таких  исключений  можно  установить  свой  обра-
ботчик  с  помощью  функции 

set_unexpected

,  работа  с  которой 

описана в 

разд. 36.5

Спецификаторы исключений можно также задавать и при объяв-
лении указателя на функцию. Например: 

  void (*pf)(void) throw(int, double); 

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

  void  f() throw (int); 
  pf = f; 

 


background image

  

 
 

Г Л А В А  

14 

 
 
 

Классы 

 

14.1. Введение 

Классом

 называется множество объектов, имеющих общие свой-

ства, и набор операций, допустимых над этими объектами. В языке 
программирования C++ объектами являются переменные. Поэто-
му классы являются типами, которые отличаются от встроенных 
типов  данных  тем,  что  позволяют  определять  операции,  кото- 
рые допускается выполнять над переменными, принадлежащими 
классу.  Новые  типы  в  языке  программирования  C  определяются 
при помощи структур и объединений. Такой же подход к опреде-
лению классов принят и в языке программирования C++, но, до-
полнительно, в блоке структуры или объединения можно опреде-
лить функции, которые разрешается выполнять над переменными 
типа структуры или объединения. 
Однако такой подход к определению класса имеет один сущест-
венный недостаток, а именно, т. к. доступ к полям структуры или 
объединения  открыт,  то  над  переменными,  принадлежащими 
классу,  можно  выполнять  также  и  операции,  не  принадлежащие 
этому классу. Для решения этой проблемы в языке программиро-
вания  C++  для  определения  классов  также  используется  ключе-
вое  слово 

class

,  которое  служит  для  определения  структуры,  а 

точнее  класса,  доступ  к  членам  которого  закрыт.  Возникает  во-
прос,  если  доступ  к  членам  класса  закрыт,  то  как  их  использо-
вать? Для этого в языке программирования C++ определены спе-

  

 


background image

Часть 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;  // состояние контейнера 


background image

Глава 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; } 

Отметим построение проекта, содержащего классы. Определение 
класса  записывается  в отдельный  заголовочный файл,  имя  кото-


background image

Часть 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; 


Смотрите также файлы