- •1. Роль вычислительной техники в решении прикладных задач.
- •2. Задачи, особенности и основные инструменты прикладного программирования
- •3.Языки программирования: классификация, особенности, критерии выбора.
- •4. Архитектура прикладных информационных систем.
- •5. Процедурная и объектно-ориентированная декомпозиция.
- •6. Основные принципы объектно-ориентированного программирования: абстрагирование, инкапсуляция, наследование, полиморфизм, модульность, сохраняемость, параллелизм.
- •7. Объекты и типы объектов. Атрибуты объектов и типы атрибутов. Методы объектов.
- •9. Директивы препроцессора: #include, #define, #error, #pragma, операции # и ##
- •11. Компиляция программы и сборка исполняемого модуля.
- •12. Размещение программы и данных в памяти.
- •13. Структура исполняемого модуля.
- •14. Переменные: объявление, определение, инициализация
- •15. Переменные: значение, указатель, ссылка.
- •16.Время жизни и области видимости переменных.
- •19. Составные типы данных.
- •20. Встроенные массивы: размещение в памяти, доступ к элементам. Размещение массива в памяти
- •Элементы массива
- •22. Условные конструкции выбора if/else , select.
- •23. Конструкции циклов for, while, do/ while; операторы break и continue.
- •24. Логические операции.
- •25. Функции: объявление, определение, передача аргументов по ссылке и по значению; входные и выходные параметры, возвращаемое значение, инструкция return.
- •26. Перегрузка функций.
- •27. Библиотека стандартного потокового ввода/вывода. Форматированный ввод/вывод. Файловые потоки, потоки в памяти.
- •28. Обработка строк, класс string.
- •29. Классы. Инкапсуляция. Сокрытие данных и видимость членов класса. Идиома «pimpl».
- •30. Конструктор класса. Конструктор с параметрами и конструктор по умолчанию. Конструкторкопирования.Операторприсваивания.Деструктор.
- •31.Наследование и полиморфизм классов: виртуальные функции.
- •32.Абстрактные базовыеклассы.
- •33.Множественное наследование.
- •34.Перегрузка операторов.
- •35.Объекты-владельцы. «Интеллектуальные» указатели.
- •36. Объекты-владельцы с частной копией ресурса.
- •37. Объекты-владельцы с совместным владением ресурсом.
- •38. Приведениетипов. Операторыstatic_cast, reinterpret_cast, dynamic_cast.
- •39. Константные и не-константные переменные. Оператор const_cast.
- •40. Шаблоны функций и шаблоны классов.
- •41. КонтейнерыстандартнойбиблиотекиStl.
- •42. Итераторы контейнеров.
- •43. Динамический массив на примере контейнера vector.
- •44. Связный список на примере контейнера list.
- •45. Контейнер deque библиотеки stl.
- •46. Ассоциативные контейнеры: map, multimap, set, multiset.
- •47. Стандартные алгоритмы: алгоритм sort; объекты-функции.
- •48. Взаимодействие прикладных программ с базами данных. Протокол odbc.
- •49. Оконный интерфейс. Организация графического оконного интерфейса при помощи оконных сообщений в ос Windows.
- •50. Работа с объектами графического интерфейса gdi.Кисти и перья; контекст устройства вывода («devicecontext»)
36. Объекты-владельцы с частной копией ресурса.
Объект в программировании — некоторая сущность в виртуальном пространстве, обладающая определённым состоянием и поведением, имеющая заданные значения свойств (атрибутов) и операций над ними (методов). Как правило, при рассмотрении объектов выделяется то, что объекты принадлежат одному или нескольким классам, которые определяют поведение (являются моделью) объекта. Термины «экземпляр класса» и «объект» взаимозаменяемы.
Объект-сущность в адресном пространстве вычислительной системы, появляющаяся при создании экземпляра класса или копирования прототипа (например, после запуска результатов компиляции и связывания исходного кода на выполнение).
Объекты - функции, переменные, формальные параметры и т.п.
37. Объекты-владельцы с совместным владением ресурсом.
38. Приведениетипов. Операторыstatic_cast, reinterpret_cast, dynamic_cast.
Приведе́ниети́па (typeconversion) — преобразование значения переменной одного типа в значение другого типа. Выделяют явное и неявное приведения типов.
При явном приведении указывается тип переменной, к которому необходимо преобразовать исходную переменную.
При неявном приведении преобразование происходит автоматически, по правилам, заложенным в данном языке программирования.
Также в языке могут быть заданы специальные функции для приведения.
Неявное приведение
Само приведение происходит как во время присваивания значения переменной, так и при операциях сравнения, вычисления выражения. При использовании в выражении несколько различных типов значения одного или нескольких подтипов может быть осуществлено преобразование к более общему типу (супертипу), с большим диапазоном возможных значений.
В языке C:
double d; // вещественный тип
long l; // целый тип
int i; // целый тип
if (d >i) d = i;
if (i> l) l = i;
if (d == l) d *= 2;
Каждый раз при выполнени операции сравнения или присваивания переменные разных типов будут приведены к единому типу. Следует с осторожностью использовать неявное приведение типа. При переводе числа из вещественного типа в целочисленный, дробная часть отсекается. Обратное приведение из целочисленного типа к вещественному также может привести к понижению точности, что связано с различным представлением вещественных и целочисленных чисел на машинном уровне. К примеру, вещественный тип single стандарта IEEE 754 не может точно представить число 16777217, в то время как 32-битный целочисленный тип может. Это может привести к ситуациям, когда сравнение на равенство одного и того же числа, представленного типами (int и single) будет выдавать ложный результат (числа не равны друг другу).
Явное приведение типа
В языке C++ существует четыре разновидности приведения типа. Все четыре типа записываются в виде
xxx_cast<type_to>(expression_from)
Например:
y = static_cast<signed short>(65534); // будетприсвоено -2
Громоздкие ключевые слова являются напоминанием программисту, что приведение типа чревато проблемами.
static_cast
Назначение: Приведение типа по обычным правилам, когда компилятор отказывается привести его автоматически (отличается от применяемого в Си (type_to)expression_from только тем, что с указателями на произвольные типа не работает, может применяться только для преобразования void * к другому указателю и для преобразования вниз по иерархии классов; для произвольных указателей применяется reinterpret_cast). Применяется:
для вычислений в более широком числовом типе (например, для дробных вычислений с целыми числами);
чтобы избавиться от предупреждения «Возможная потеря точности» при переводе в более узкий числовой тип;
для указателей и ссылок при конвертации в родительский тип;
для типов с конструкторами или операциями конвертации наподобие operatortype_to;
в шаблонах — компилятор уже при специализации шаблона решает, какие операции использовать;
в операции ?:, у которой then- и else-части должны иметь один тип.
Ограничения на expression_from: нет.
Ограничения на type_to: должен найтись способ преобразования в type_to.
Производит ли код: в общем случае да.
Возможные ошибки: относительно безопасно. Логические ошибки возможны, если привести в неправильный тип или вообще пропустить приведение, когда оно требуется. Не исключено, что после преобразования появится временный объект, который будет благополучно уничтожен вместе со всеми изменениями (большинство компиляторов на это выдают предупреждение).
// Возвращаетпроцентпопаданий.
doublehitpercent(constintaHitCount, constintaShotCount)
{
if (aShotCount==0) return 0.0;
// Нам нужно дробное деление, а не целочисленное - поэтому переведём делимое и делитель в double
returnstatic_cast<double>(aHitCount*100) / static_cast<double>(aShotCount);
}
string s = static_cast<string>("Hello!"); // аналогично string s = string("Hello!");
string s = (string)"Hello!"; // синтаксисСитожеработает
string s = static_cast<string>(5); // не компилируется - нет подходящего конструктора
dynamic_cast
Назначение: Проводит преобразование типа, предварительно убедившись (с помощью RTTI), что объект expression_from в действительности является объектом типа type_to. Если нет: для указателей возвращает NULL, для ссылок устанавливает аварийную ситуацию std::bad_cast.
Ограничения на expression_from: выражение должно быть ссылкой или указателем на объект с хотя бы одной виртуальной функцией.
Ограничения на type_to: ссылка или указатель на дочерний по отношению к expression_from тип.
Производит ли код: да.
Возможные ошибки: относительно безопасно. Логические ошибки возможны, если подать аргумент, не имеющий тип type_to, в то время как код не приспособлен к этому.
reinterpret_cast
Назначение: Участок памяти рассматривается как объект другого типа.
Ограничения на expression_from: порядковый тип (логический, символьный, целый, перечисляемый), указатель, ссылка.
Ограничения на type_to: для порядкового типа или указателя — порядковый тип или указатель. Для ссылки — ссылка.
Производит ли код: нет.
Возможные ошибки: Участок в реальности может и не иметь этого типа. Нет никакой возможности проверить это, всю ответственность за корректность преобразования программист берёт на себя.
// Возвращает true, если число конечное, и false - если бесконечное или NaN.
boolisfinite(const double x)
{
const uint64_t &y = reinterpret_cast<const uint64_t&>(x);
return ((y & UINT64_C(0x7FF0000000000000)) != UINT64_C(0x7FF0000000000000));
}
// Ошибка - выражение x+5.0 не является ссылкой.
const long long& y = reinterpret_cast<const long long&>(x+5.0);
