суббота, 5 декабря 2009 г.

6.4. Использование определенного пользователем типа Time с помощью Struct

Программа на рис. 6.1 создает определенный пользователем тип структуры Time с тремя целыми элементами: hour, minute и second. Программа опреде­ляет единственную структуру типа Time, названную dinnerTime, и использует операцию точка для присвоения элементам структуры начальных значений 18 для hour, 30 для minute и 0 для second. Затем программа печатает время в военном (24-часовом) и стандартном (12-часовом) форматах. Заметим, что функции печати принимают ссылки на постоянные структуры типа Time. Это является причиной того, что структуры Time передаются печатающим функ­циям по ссылке — этим исключаются накладные расходы на копирование, связанные с передачей структур функциям по значению, а использование const предотвращает изменение структуры типа Time функциями печати. В главе 7 мы обсудим объекты const и функции-элементы const.
Обычно структуры передаются вызовом по значению. Чтобы избежать накладных
расходов на копирование структуры, передавайте структуры вызовом по ссылке.
Чтобы избежать накладных расходов вызова по значению и вдобавок получить
выгоды защиты исходных данных от изменения, передавайте аргументы большого
размера как ссылки const.
Существуют препятствия созданию новых типов данных указанным спо­собом с помощью структур. Поскольку инициализация структур специально не требуется, можно иметь данные без начальных значений и вытекающие отсюда проблемы. Даже если данные получили начальные значения, воз­можно, это было сделано неверно. Неправильные значения могут быть при­своены элементам структуры (как мы сделали на рис. 6.1), потому что про­грамма имеет прямой доступ к данным. Программа присвоила плохие значения всем трем элементам объекта dinnerTime типа Time. Если реали­зация struct изменится (например, время теперь будет представляется как
число секунд после полуночи), то все программы, которые используют
struct, нужно будет изменить. Не существует никакого «интерфейса», гарантирую­щего, что программист правильно использует тип данных и что данные яв­ляются непротиворечивыми.
Замечание по технике программирования 6.1
Важно писать программы, которые легко понимать и поддерживать. Изменения яв­ляются скорее правилом, чем исключением. Программисты должны предвидеть, что их коды будут изменяться. Как мы увидим, классы способствуют модифицируемости программ.
// FIG6_1.СРР
// Создание структуры, задание и печать ее элементов. #include «ciostream. h>

struct Time { int hour; int minute; int second;
} ;
//определение структуры // 0-23 // 0-59 // 0-59

// прототип // прототип
void printMilitary(const Time &) void printStandard(const Time S)
main() {

Time dinnerTime;
// переменная нового типа Time

// задание элементам правильных значения dinnerTime.hour = 18; dinnerTime.minute = 30; dinnerTime.second = 0;
cout « "Обед состоится в ";
printMilitary(dinnerTime);
cout « " по военному времени," « endl
<< "что соответствует "; printStandard(dinnerTime);
cout << " по стандартному времени." << endl;
// задание элементам неправильных значений dinnerTime.hour = 2 9; dinnerTime.minute = 73; dinnerTime.second = 103;
cout « endl « "Время с неправильными значениями: "; printMilitary (dinnerTime); cout << endl; return 0;
Рис. 6.1. Создание структуры, задание и печать ее элементов (часть 1 из 2)

// Печать времени в военном формате
void printMilitary(const Time St)
{
cout « (t.hour < 10 ? "0" : "") « t.hour
« ":"« (t.minute < 10 ? "0" : "") « t.minute « ":"« (t.second < 10 ? "0" : "") « t.second;
}
// Печать времени в стандартном формате
void printStandard(const Time &t)
{
cout «  ((t.hour == 0 || t.hour == 12) ? 12 : t.hour %12)
«  ":"« (t.minute < 10 ? "0" : "") « t.minute
«  ":"« (t.second < 10 ? "0" : "") « t.second
«  (t.hour < 12 ? " AM" : " PM");
}
Обед состоится в 18:30:00 по военному времени,
что соответствует 6:30:00 РМ по стандартному времени.
Время с неправильными значениями: 29:73:103
Рис. 6.1. Создание структуры, задание и печать ее элементов (часть 2 из 2)
Существуют и другие проблемы, связанные со структурами в стиле С. В С структуры не могут быть напечатаны как единое целое, только по одному элементу с соответствующим форматированием каждого. Для печати элемен­тов структуры в каком-либо подходящем формате должна быть написана функция. Глава 8, «Перегрузка операций» покажет, как перегрузить опера­цию «, чтобы предоставить возможность простой печати объектов типа структура (С++ расширяет понятие структуры) или типа класс. В С струк­туры нельзя сравнивать в целом; их нужно сравнивать элемент за элементом. Глава 8 покажет, как перегрузить операции проверки равенства и отношения, чтобы можно было в Си++ сравнивать объекты типов структура и класс.
В следующем разделе мы вновь использует нашу структуру Time, но уже как класс, и продемонстрируем некоторые преимущества создания таких так называемых абстрактных типов данных, как классы. Мы увидим, что классы и структуры в С++ можно использовать почти одинаково. Различие между ними состоит в доступности по умолчанию элементов каждого из этих типов. Это будет более детально объяснено позже.

Комментариев нет:

Отправить комментарий