186 ____________________________Часть II. Программирование на С++
В 17 строке в функции main во всей красе расписаны побитные сдвиги и маски. Упрощение преобразования, которое от нас требуется, на самом деле не так сложно. Числа формата BCD можно рассматривать с двух позиций:
это и упакованный байт, и две тетрады, содержащие числа. Оба подхода представлены в строках с 4 по 13. Кроме того, здесь добавлены средства дальнейшего упрощения чисел формата BCD.
В 4-й и 13-й строках с помощью typedef задается псевдоним объединения.
Строки с 5 по 9 представляют собой определения полей данных объединения; в символе packed_bcd и структуре под именем bed содержится одинаковое число бит.
В 10-й строке находится вспомогательная функция, возвращающая целое число. Теперь преобразование происходит гораздо проще — надо просто помножить старшие 4 бита на 10 и сложить их. с младшими битами.
11-я строка — это встроенная функция преобразования into. В 1б-й главе будет рассказано, что функция преобразования может быть вызвана явно, но происходит это тогда, когда в контексте появляется один тип, в то время как ожидался совсем другой. В нашем случае, функция into вызывается при ожидающемся появления целого числа при использовании BCDJMUMBER.
Замечание
Использование функции доступа, такой как BcdToint, и реализация операции преобразования с помощью этой функции серьезно упрощает работу. Говоря коротко, происходит разделение задач: сложный синтаксис оператор-функций отделяется от их реализации.
При данном подходе даже у пользователей с не очень богатым опытом появляется возможность пользоваться функциями преобразования, не понимая механизма их работы. Функции преобразования, содержащие функции доступа, несложно будет потом при необходимости заменить. Таким образом без сложной работы над программой можно добиться реализации сложных алгоритмов.
В 12-й строке ясно показано, что конструкторы могут быть не только у классов. Собственные конструкторы и деструкторы могут быть и у объединений (о том что есть и чего нет в языке можно посмотреть в руководстве ARM или стандарте ANSI C++).
Мысленный синтаксический анализ функций
C++ — достаточно "хитрый" язык, поэтому может случиться так, что то, что вы видите — это не то, что есть на самом деле. Глава 17 "Конструкторы:
копирование и присваивание" содержит примеры того, как компилятор C++ может по умолчанию создавать конструкторы копий и операции присваива-