Программа на рис. 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, нужно будет изменить. Не существует никакого «интерфейса», гарантирующего, что программист правильно использует тип данных и что данные являются непротиворечивыми.
число секунд после полуночи), то все программы, которые используют 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, но уже как класс, и продемонстрируем некоторые преимущества создания таких так называемых абстрактных типов данных, как классы. Мы увидим, что классы и структуры в С++ можно использовать почти одинаково. Различие между ними состоит в доступности по умолчанию элементов каждого из этих типов. Это будет более детально объяснено позже.
Комментариев нет:
Отправить комментарий