Программирование >>  Структурное программирование 

1 ... 137 138 139 [ 140 ] 141 142 143 ... 342


использоваться клиентами класса (т.е. частями программы, играющими роль пользователей) для манипуляций с данными этого класса.

Обратите внимание на функцию-элемент с тем же именем, что и класс. Она называется конструктором этого класса. Конструктор - это специальная функция-элемент, которая инициализирует данные-элементы объекта этого класса. Конструктор класса вызывается автоматически при создании объекта этого класса. Мы увидим, что обычно класс имеет несколько конструкторов; это достигается посредством перегрузки функции.

После спецификатора доступа к элементам private следуют три целых элемента. Это говорит о том, что эти данные-элементы класса являются доступными только функциям-элементам класса и, как мы увидим в следующей главе, друзьям класса. Таким образом, данные-элементы могут быть доступны только четырем функциям, прототипы которых включены в определение этого класса (или друзей этого класса). Обычно данные -элементы перечисляются в части private, а функции-элементы - в части public. Как мы увидим далее, можно иметь функции-элементы private и данные public; последнее не типично и считается в программировании дурным вкусом.

Когда класс определен, его можно использовать в качестве типа в объявлениях, например, следующим образом:

Time sunset, объект типа Time

arrayOfTimes[5], массив объектов типа Time

*pointerToTime, указатель на объект типа Time

SdinnerTime = sunset; ссылка на объект типа Time

Имя класса становится новым спецификатором типа. Может существовать множество объектов класса как и множество переменных типа, например, такого, как int. Программист по мере необходимости может создавать новые типы классов. Это одна из многих причин, по которым С++ является расширяемым языком.

Программа на рис. 6.3 использует класс Time. Эта программа создает единственный объект класса Time, названный t. Когда объект создается, автоматически вызывается конструктор Time, который явно присваивает нулевые начальные значения всем данным-элементам закрытой части private. Затем печатается время в военном и стандартном форматах, чтобы подтвердить, что элементы получили правильные начальные значения. После этого с помощью функции-элемента setTime устанавливается время и оно снова печатается в обоих форматах. Затем функция-элемент setTime пытается дать данным-элементам неправильные значения и время снова печатается в обоих форматах.

Снова отметим, что данные-элементы hour, minute и second предваряются спецификатором доступа к элементам private. Эти закрытые данные-элементы класса обычно недоступны вне класса (но, как мы увидим в главе 7, друзья класса могут иметь доступ к закрытым элементам класса.) Глубокий смысл такого подхода заключается в том, что истинное представление данных внутри класса не касается клиентов класса. Например, было бы вполне возможно изменить внутреннее представление и представлять, например, время внутри класса как число секунд после полуночи. Клиенты могли бы использовать те же самые открытые функции-элементы и получать те же самые результаты, даже не осознавая произведенных изменений. В этом смысле, говорят, что реализация класса скрыта от клиентов. Такое скрытие информации способствует модифицируемости программ и упрощает восприятие класса клиентами.



FIG6 3.CPP Класс Time, iinclude <iostream.h>

Определение абстрактного типа данных (АТД) Time

class Time{ public:

Time () ;

void setTime

int,

int,

void printMilitary(); void printStandard();

конструктор

int); установка часов, минут и секунд

времени в военном формате

печать времени

в стандартном формате

private:

int hour; int minute; int second;

0-23 0-59 0-59

Конструктор Time присваивает нулевые начальные значения каждому элементу данных. Обеспечивает согласованное начальное состояние всех объектов Time Time::Time О { hour = minute = second =0; }

Задание нового значения Time в виде военного времени. Проверка правильности значений данных. Обнуление неверных значений, void Time::setTime(int h, int m, int s)

hour = (h >= 0 s& h < 24)

minute = second =

(m >= (s >=

0 && m < 0 S& s <

60) 60)

? h : 0; ? m : 0; ? s : 0;

Печать времени в военном формате

void Time:: printMilitary ( )

cout (hour < 10 ? 0 : (minute < 10 ? 0 (second < 10 ? 0

) hour : : ) minute : ) second;

Печать времени в стандартном формате void Time:: printStandard()

cout ( (hour == 0 I I hour ==12) ? 12 : hour % 12)

: (minute < 10 ? 0 : ) minute

: (second < 10 ? 0 : ) second

(hour < 12 ? AM : PM );

Рис. 6.3. Использование абстрактного типа данных Time как класса (чааь 1 из 2)



Формирование проверки простого класса Time

main()

Time t; определение экземпляра объекта t класса Time

cout Начальное значение военного времени равно ; t.printMilitary(); cout endl

<< Начальное значение стандартного времени равно ; t.printStandard();

t.setTime(13, 27, 6);

cout endl endl Военное время после setTime равно t.printMilitary();

cout << endl << Стандартное время после setTime равно ; t.printStandard();

t.setTime(99, 99, 99); попытка установить

неправильные значения

cout endl << endl

<< После попытки неправильной установки:

endl Военное время: ; t.printMilitary();

cout endl Стандартное время: ; t.printStandard(); cout << endl; return 0;

Начальное значение военного времени равно 00:00:00 Начальное значение стандартного времени равно 12:00:00 AM

06 РМ

Военное время после setTime равно 13:27:06 Стандартное время после setTime равно 1:27:

После попытки неправильной установки: Военное время: 00:00:00 Стандартное время: 12:00:00 AM

Рис. 6.3. Использование абстрактного типа данных Time как класса (чааь 2 из 2)

Замечание по технике программирования 6.2

Клиенты класса используют класс, не зная внутренних деталей его реализации. Если реализация класса изменяется (например, с целью улучшения производительности), интерфейс класса остается неизменным и исходный код клиента класса не требует изменений. Это значительно упрощает модификацию систем.

В нашей программе конструктор Time просто присваивает начальные значение, равные О, данным-элементам, (т.е. задает военное время, эквивалентное 12 AM). Это гарантирует, что объект при его создании находится в известном состоянии. Неправильные значения не могут храниться в данных-элементах объекта типа Time, поскольку конструктор автоматически вызывается при создании объекта типа Time, а все последуюп];ие попытки изменить данные-элементы тщательно рассматриваются функцией setTime.



1 ... 137 138 139 [ 140 ] 141 142 143 ... 342

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