- •Раздел 4. Разработка по Тема 4.1. Проектирование интерфейса с пользователем
- •4.1.1. Типы пользовательских интерфейсов.
- •4.1.2. Пользовательская и программная модели интерфейса.
- •4.1.3. Разработка диалогов.
- •4.1.4. Основные компоненты графических пользовательских интерфейсов.
- •Тема 4.2. Реализация графических пользовательских интерфейсов.
- •4.2.1. Диалоги, управляемые пользователем.
- •4.2.2. Диалоги, управляемые системой.
- •4.2.3. Использование метафор.
- •4.2.4. Технология Drag and Drop.
- •4.2.5. Интеллектуальные элементы.
- •4.3.1. Базовые типы данных.
- •Константы
- •Область действия имен
- •4.3.2. Указатели и адресная арифметика.
- •4.3.3. Составные типы данных. Структуры
- •Битовые поля
- •Определение типов
- •Перечислимые типы
- •4.3.4. Выражения и операции.
- •4.3.5. Управляющие конструкции. Условные операторы
- •Операторы циклов
- •4.4.1. Статические одномерные массивы.
- •4.4.2. Статические многомерные массивы.
- •4.4.3. Динамические массивы.
- •4.4.4. Массивы указателей.
- •4.5.1. Стеки.
- •4.5.2. Очереди.
- •4.5.3. Списки.
- •4.5.4. Бинарные деревья.
- •4.6.1. Объявление классов и экземпляров классов.
- •4.6.2. Инкапсуляция данных и методов.
- •4.6.3. Конструкторы классов.
- •Конструктор по умолчанию
- •Конструктор копирования
- •4.6.4. Деструкторы классов.
- •4.7.1. Разделы в описании класса.
- •4.7.2. Friend-конструкции.
- •4.7.3. Статические члены классов.
- •4.7.4. Использование описателя const в классах.
- •4.8.1. Вложенность классов.
- •4.8.2. Наследование данных и методов.
- •4.8.3. Типы наследования.
- •4.9.1. Полиморфизм раннего связывания.
- •4.9.2. Полиморфизм позднего связывания и виртуальные функции.
- •4.9.3. Абстрактные методы и классы.
- •4.10.1. Функции консольного ввода-вывода.
- •4.10.2. Функции файлового ввода-вывода.
- •4.10.3. Использование библиотеки классов потокового ввода-вывода.
- •4.11.1. Перегрузка операций.
- •4.11.2. Шаблоны функций.
- •4.11.3. Шаблоны классов.
- •4.11.4. Обработка исключений.
- •Тема 4.12. Com-технология.
- •4.12.1. Основные понятия.
- •4.12.2. Типы интерфейсов.
- •Свойства интерфейсов
- •Типы интерфейсов
- •4.12.3. Типы com-объектов.
- •4.12.4. Фабрика классов.
- •Тема 4.13. Построение com-сервера.
- •4.13.1. Язык idl.
- •Содержимое файла idl
- •4.13.2. Определение пользовательского интерфейса.
- •4.13.3. Реализация пользовательского интерфейса.
- •4.13.4. Создание тестового клиента.
- •Тема 4.14. Обзор платформы ms .Net.
- •4.14.1. Общая идея архитектуры .Net.
- •4.14.2. Достоинства и недостатки .Net.
- •4.14.3. Схема трансляции программ в .Net.
- •4.14.4. Язык msil.
- •4.14.5. Объектно-ориентированная модель .Net.
Битовые поля
Структура позволяет работать с битовыми полями, то есть существует механизм, позволяющий добраться до каждого бита во внутреннем представлении любого объекта. Полем считается последовательность соседних разрядов в числе типа int или unsigned int, указанных в качестве элементов структуры. Для обозначения того факта, что элементом структуры является битовое поле, служит синтаксис:
<целый тип> [идентификатор] : <размер поля>;
Размер поля указывается в битах. Например, char с: 3; или int: 1;. Выполняемые действия не зависят от выбранного типа, если он из множества {char, int, unsigned, signed}. Тип long недопустим. Идентификатор необязателен, но только он позволяет увидеть поле. Неименованные поля (без идентификатора) просто выравнивают границы между интересующими нас полями. В Visual C++ битовые поля располагаются от меньших номеров разрядов к большим.
Определение типов
Языки С и C++ позволяют определить новый тип переменных, присвоив символьное имя (идентификатор) какому-то заданному типу. Например:
typedef int SHORT;
typedef char *PTRSTR;
typedef int *STRFUNC();
typedef struct
{
int nCode;
char aValue[30];
} IDENTRY;
SHORT a, b;
PTRSTR name, text;
STRFUNC x, y;
IDENTRY data;
Перечислимые типы
Перечислимый тип может быть определен различными способами. Рассмотрим один из них:
typedef enum
{Aperiodic. Oscillating, Differential. Integral } UnitType:
Вновь введенный тип переменных UnitType перечисляет допустимый диапазон изменения любой переменной типа UnitType. Компилятор C++ ассоциирует константу Aperiodic с целой константой 0, константу Oscillating — с 1 и т. д. Например, возможна следующая последовательность операторов:
UnitType unit;
switch (unit)
{
case Aperiodic: transient_a(): break:
case Oscillating: transient_o(); break:
case Differential: transient_d(); break:
case Integral: transientJO; break:
default: puts ("\n Wrong UnitType"):
Элементам перечислений могут быть приписаны другие целые константы. Например:
enum { grave, solemn, frivolous=10, gay } mood;
typedef enum rank { captain=7, major=8, colonel=12 } rang;
Допустимые значения переменной mood будут выбираться из множества {0, 1, 10, 11}.
В последней строке введено сразу два новых типа. Первый (rank) объявлен с помощью перечисления enum, другой (rang) — с помощью операции typedef. Идентификатор rank (или rang) определен как описатель типа переменных. Чтобы иметь возможность работать с переменной типа rank, необходимо сначала ее декларировать, например: rank r;. Здесь r — это уже переменная, которой можно присвоить одно из перечисленных значений, например: r=major; Теперь, если вывести значение переменной r, вызвав функцию printf("r=%d" ,r);, то мы увидим: г=8. В первой строке определена переменная mood перечислимого типа. Ей может быть присвоено любое из перечисленных значений, например mood=gay;. Имя типа перечисления (enumeration tag) здесь не определено. Отметьте, что можно одновременно задать новый тип и переменную этого типа, например:
enum grades { bad=3, good, excellent } g[20], next;
Здесь grades не переменная, а имя типа перечисления (tag). Определяющим моментом здесь является местоположение идентификатора: если он стоит до перечислений, то с его помощью определяется тип, в противном случае — переменная. Здесь определены массив g[] из 20 элементов перечислимого типа grades и переменная next этого же типа. В языке C++ такой способ определения позволяет описать новую переменную типа grades простой декларацией grades gr;. Отметим, что инициализирующее выражение может включать уже декларированные элементы списка перечислений. Поэтому возможно следующее описание перечислимого типа:
enum coins
penny=I, tuppence, nickel=penny+4, dime=10, quarter = nickel*nickel } small change;
Константа 5 будет ассоциирована с элементом nickel, a 25 — с quarter. Обычно все константы уникальны, но допустимы и повторения в списке инициализаторов. Например:
enum coins { penny=l. pence=l. shilling=12};
Перечислимый тип может появляться в любом контексте, в котором вообще употребим какой-либо тип. Например:
enum coins coin; // Переменная coin-типа coins
typedef coins COINS; //Новый тип
COINS *pc: // Указатель па тип COINS
coin = quarter: //Присвоение переменной
int i = penny; // Совместимость с int
pc = new COINS; //Выделение памяти
*pc = coi n; // Присвоение по адресу
penny = dime; // Ошибка, так как penny — константа
Область действия имен для перечислимых переменных подчиняется тем же правилам, что и для стандартных типов. Например:
int dime=49: