
- •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»)
29. Классы. Инкапсуляция. Сокрытие данных и видимость членов класса. Идиома «pimpl».
Класс — разновидность абстрактного типа данных в объектно-ориентированном программировании (ООП), характеризуемый способом своего построения. Другие абстрактные типы данных — метаклассы, интерфейсы, структуры, перечисления, — характеризуются какими-то своими, другими особенностями. Наряду с понятием «объекта» класс является ключевым понятием в ООП (хотя существуют и бесклассовые объектно-ориентированные языки, например, JavaScript; подробнее смотрите Прототипное программирование). Суть отличия классов от других абстрактных типов данных состоит в том, что при задании типа данных класс определяет одновременно и интерфейс, и реализацию для всех своих экземпляров, а вызов метода-конструктора обязателен. Точный смысл этой фразы будет раскрыт ниже.
На практике объектно-ориентированное программирование сводится к созданию некоторого количества классов, включая интерфейс и реализацию, и последующему их использованию. Графическое представление некоторого количества классов и связей между ними называется диаграммой классов. Объектно-ориентированный подход за время своего развития накопил множество рекомендаций (паттернов) по созданию классов и иерархий классов.
В языках программирования инкапсуля́ция имеет одно из следующих значений, либо их комбинацию:
-языковой механизм ограничения доступа к определённым компонентам объекта;
-языковая конструкция, способствующая объединению данных с методами (или другими функциями), обрабатывающими эти данные.
Инкапсуляция — один из четырёх важнейших механизмов объектно-ориентированного программирования (наряду с абстракцией, полиморфизмом и наследованием).
В то же время, в языках поддерживающих замыкания, инкапсуляция рассматривается как понятие не присущее исключительно объектно-ориентированному программированию. Также, реализации абстрактных типов данных (например, модули) предлагают схожую модель инкапсуляции.
Сокрытие реализации целесообразно применять в следующих целях:
-предельная локализация изменений при необходимости таких изменений,
-прогнозируемость изменений (какие изменения в коде нужно сделать для заданного изменения функциональности) и прогнозируемость последствий изменений.
Два метода сокрытия данных
Один из них может использоваться хакерами для того, чтобы скрыть вредоносный код; второй вы можете применять сами для защиты конфиденциальных файлов
сокрытия данных: потоки данных NTFS (известные также как альтернативные потоки данных) и доступ к списку ресурсов на базе разрешений Access-basedEnumeration (ABE).
Видимость членов класса
Каждое поле, метод или свойство класса имеет атрибут видимости. В PascalABC.NET существуют четыре типа атрибутов видимости: public (открытый), private (закрытый), protected (защищенный) и internal (внутренний). К члену класса, имеющему атрибут public, можно обратиться из любого места программы, члены класса с атрибутом private доступны только внутри методов этого класса, члены класса с атрибутом protected доступны внутри методов этого класса и всех его подклассов, члены класса с атрибутом internal доступны внутри сборки (термин .NET, сборка в нашем понимании - это множество файлов, необходимых для генерации .exe или .dll-файла). Кроме того, private и protected члены видны отовсюду в пределах модуля, в котором определен класс.
Тело класса делится на секции. В начале каждой секции располагается атрибут видимости, после которого идут поля, а затем методы и свойства с этим атрибутом видимости. В первой секции атрибут видимости может отсутствовать, в этом случае подразумевается internal. В классе может быть произвольное количество секций, располагающихся в произвольном порядке.
Например, пусть данный код располагается в одном модуле:
type
A = class
private
x: integer;
protected
a: integer;
public
constructor Create(xx: integer);
begin
x := xx; // верно, т.к. внутри метода класса можно обращаться к его закрытому полю x
a := 0; // верно
end;
end;
Следующий же код располагается в другом модуле:
type
B = class(A)
public
procedure print;
begin
writeln(a); // верно, т.к. a - защищенное поле
writeln(x); // неверно, т.к. х - закрытое поле
end;
end;
...
varb1: B := newB(5);
...
writeln(b1.x); // неверно, т.к. х - закрытое поле
writeln(b1.a); // неверно, т.к. a - защищенное поле
b1.print; // верно, т.к. print - открытый метод
Идиомы Pimpl– указатель на реализацию
Допустим, нам необходимо написать кроссплатформенное сетевое приложение с использованием сокетов. Для этого нам необходим класс GeneralSocket (“Видимый класс”) , который будет инкапсулировать в себе детали реализации конкретной платформы (“Скрываемый класс”). Часто требуется скрыть детали реализации от пользователей или других разработчиков:
-Для того, что бы была возможность изменять реализацию скрываемого класса без перекомпиляции остального кода, так как закрытые члены хоть и недоступны извне никому, кроме функций-членов и друзей, но видимы всем, кто имеет доступ к определению класса. Изменение определения класса приводит к необходимости перекомпиляции всех пользователей класса
-Для сокрытия имен из области видимости. Закрытые члены хоть и не могут быть вызваны кодом вне класса, тем не менее они участвуют в поиске имен и разрешении перегрузок
-Для ускорения времени сборки, так как компилятору не нужно обрабатывать лишние определения закрытых типов