
- •Раздел 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.
4.3.4. Выражения и операции.
Язык C++ сохраняет богатый набор операций языка С, из которых наибольший интерес представляют необычные операции присваивания: ++, +=, *=, /=, %=, <<=, >>=, &=, !=, ^=. Операции +, *, / одинаковы почти во всех языках программирования, поэтому не нуждаются в пояснениях. Вам, наверное, известно назначение логических операций. Для них в языке С используются следующие символы:
• || — логическое ИЛИ (OR);
• && — логическое И (AND);
• ! — логическое НЕ (NOT).
Операции ++ и -- являются унарными (применяются к одному операнду) Все остальные из перечисленных — бинарные (требуют двух операндов). Смысл введения этих операций состоит в сокращении записи, оптимизации исполняемого кода и, что очень важно, повышении надежности. Операторы i++; и ++i; по смыслу (но не по реализации) эквивалентны оператору i=i+l;. Оператор i--; (так же, как и --i;) эквивалентен оператору i=i-l;. Различают две модификации операции приращения (increment) ++ и операции уменьшения (decrement) --. Например, рассмотрим фрагмент программы: int i=0, j=0; j=i++; i=++j:. Чему будут равны значения переменных i, j в конце фрагмента? Так как в выражении i++ использована постфиксная модификация операции, то сначала произойдет присвоение значения 1 (то есть нуля) переменной j, потом приращение неременной i, значение которой увеличится и станет равным 1. В следующем операторе фрагмента (i=++j;) использована префиксная модификация операции. Поэтому сначала произойдет приращение значения j, которое станет 1, затем присвоение этого значения переменной i. Если выражение, содержащее операцию ++ или --, сложное, то результат может быть неожиданным.
Оператор i+=6; эквивалентен оператору i=i+6;. Аналогичные соответствия справедливы для всех остальных перечисленных бинарных операций. Рассмотрим оператор a[j]*=c[j]*y[i];. Oн равносилен a[j]=a[j]*c[j]*y[i];, и это не просто проявление лаконичности, характерной для языка С. Здесь демонстрируется средство повышения надежности кода, так как исключается сама возможность совершить трудно обнаруживаемую ошибку вида a[j] = а[i] + c[j] * у[i];. Часто идентификаторы i и j имеют сходный смысл, кроме того, они похожи по написанию и их легко спутать. Кроме повышения надежности наблюдается существенная экономия усилий при использовании длинных идентификаторов (которые, как нас убеждают специалисты, следует использовать), Например, при вводе выражения:
PersonalIncomelncreaseRate +=
SummuryIncrease(Income)/Persons;
Операция % позволяет вычислить остаток от деления. Например, результатом выражения 8%3 будет 2, выражение -8%3 даст -2, выражение 8%-3 даст 2, а -8%-3==-2.
Операция == означает логическую операцию проверки равенства, а не операцию присвоения. Проверяется равенство левого операнда правому. Результатом этой операции будет либо целая единица (аналог true), если операнды равны, либо целый ноль (false), если операнды различны. Другие операции отношения — это: <= («меньше или равно»), >= («больше или равно»), != («не равно»). Если равенство истинно, то значение всего выражения (8%З==2) есть единица, если нет, то ноль. Рассмотрим операторы int а=8;, а%=2;. Они эквивалентны int a=8;, а=а%2;. После выполнения содержимое переменной а будет равно 0. Другой пример — последовательность операторов int i=31;, while(i%=2): задает бесконечный цикл, так как условие продолжения цикла (и значение 1 после первого захода в цикл и далее) всегда равно единице.
Операции << и >> означают сдвиг влево и вправо на указанное во втором операнде число разрядов. Например, int i=64; i>>=4; эквивалентно по результату Int i=64; i/=16;. После выполнения любого из этих фрагментов переменная 1 будет содержать число 4. Реализация первого фрагмента работает быстрее. Поэтому профессионалы часто заменяют деление целых чисел сдвигами. Следует запомнить, что сдвиг влево переменной var одного из целых типов устанавливает правые освобождающиеся биты в ноль, сдвиг вправо устанавливает левые биты либо и ноль, либо в единицу. Если сдвигается переменная типа unsigned, то — в ноль, если int, то левые биты заполняются копией знакового разряда, то есть единицей при var<0 или нулем при var>=0. Если второй операнд операции сдвига отрицателен, то результат не определен.
Операции &, |, ^ являются поразрядными, побитовыми (bitwise) и носят названия: И, ИЛИ, исключающее ИЛИ (XOR, сложение по модулю 2)