- •Раздел 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.
Операторы циклов
Три оператора цикла могут быть описаны следующей схемой:
while (условие) {тело цикла}
do {тело цикла} while (условие);
for ( ; ; ) {тело цикла}
Во всех типах циклов фигурные скобки можно опустить, если тело цикла содержит лишь один оператор. Выражение в круглых скобках содержит условие продолжения цикла. Если это выражение не равно нулю, цикл продолжается, если оно равно нулю, то происходит выход из цикла. Тело цикла while может не выполниться ни разу, если вычисленное условие дает ноль при первом же входе. Наоборот, тело цикла будет выполняться бесконечно, если условие не нарушается. Например:
while(0) {тело цикла} //Тело цикла не выполнится ни разу
while (1) {тело цикла} //Бесконечный цикл
do {тело цикла} while(0); // Тело выполнится 1 раз
Тело цикла do {...} while (): обязательно выполнится хотя бы один раз, так как решение о продолжении цикла принимается после каждого прохода (выполнения оператора(ов) тела цикла).
Если известно заранее, сколько раз надо повторять цикл, то удобно применять цикл for. Цикл for является очень мощным, гибким и часто используемым оператором языка С++. Прежде всего, обратите внимание на наличие трех групп в заголовке цикла for( ; ; ). Они разделены точкой с занятой. В первой группе заголовка могут быть перечислены через запятую операторы, которые следует выполнить до входа в цикл, то есть один раз. Во второй части указывается условие продолжения цикла. В третьей группе перечисляются операторы, выполняемые в конце цикла (много раз). После заголовка следует тело цикла. Но выполняется оно до операторов третьей группы. Здесь справедливо вышеупомянутое правило: если в теле более одного оператора, то оно должно быть заключено в блок, ограниченный фигурными скобками. Тело цикла может быть игнорировано (не выполнено ни разу), если условие нарушено при первом же входе в цикл. Условие продолжения проверяется до выполнения операторов тела цикла. Следует не пожалеть времени и хорошо запомнить последовательность выполнения операторов при реализации цикла:
Операторы первой части заголовка (выполняются один раз до входа в цикл).
Вторая часть (проверка условия и выход из цикла в случае его нарушения).
Операторы тела цикла.
Операторы третьей части заголовка.
Переход к пункту 2.
Высокий потенциал оператора for определяется тем, что в первой и третьей группах может быть несколько операторов и они могут быть достаточно сложными, а во второй части может быть логическое выражение любой сложности.
Тема 4.4. Разработка векторных структур данных в Visual C++.
4.4.1. Статические одномерные массивы.
При объявлении указателя задается тип переменных, на которые он может указывать. Это кажется лишним, так как указатель любого типа в Win32 — 4 байта, содержащие адрес какого-либо объекта в памяти. Но все дело в том, что с указателями связана адресная арифметика, правила которой различны для разных типов указателей. Так, если к указателю на тип int прибавить единицу, то его значение изменится на 4 байта или sizeof(int). Это же действие в Win16 приведет к увеличению указателя на 2 байта. Забегая вперед, скажем, что при увеличении указателя на массив объектов какого-либо класса (например, класса Man) указатель сдвинется в памяти ровно на один объект этого класса, независимо от того, сколько памяти он занимает.
Имя массива в языке С фактически является указателем на первый его элемент, который соответствует нулевому значению индекса (или индексов в случае многомерных массивов). Если объявлен массив float a[16];, то справедливо равенство а==&а[0]. Переменные типа «указатель» могут быть использованы и часто используются для доступа к элементам массива. Рассмотрим пример, в котором совместно используются массив переменных вещественного типа и указатель на переменные этого же типа. Имеют смысл следующие присвоения:
float a[16],*p; // Объявление массива и указателя for (int i=0; i<16; i++)
a[i]=float(i*i); //Заполнение массива p = &а[6]; //p указывает на а[6] *р = 3.14f; // Равносильно а[6] = 3.14; p++; // Теперь р указывает на а[7]. Произошел сдвиг на 4 байта а[1] = *(р+3); // Равносильно а[1] = а[10]; В а[1] попадает 100 а[2] = ++*р; //Равносильно а[2] = ++а[7]; В а[2] попадает 50 а[3] = *++р; //Равносильно а[3] = а[8]; В а[3] попадает 64
Адресная арифметика, например р+3 или ++р, осуществляется в единицах объявленного базового типа данных float. Если в конкретной вычислительной системе число типа float занимает 4 байта, то результатом операции р+3 будет адрес, отстоящий от р на 12 байтов. Значение ++*р вычисляется так: сначала выбирается (*р) — содержимое по адресу р, то есть а[7], так как в данный момент указатель содержит &а[7]. Затем выполняется приращение (increment) a[7], то есть увеличение а[7] на единицу. При вычислении *++р, наоборот, сначала производится изменение указателя (++р), потом выборка содержимого по адресу, на который он указывает.