Прикладное программирование кафедра прикладной и компьютерной оптики Абстрактные типы данных
2 Составные типы данных ГомогенныеГетерогенные Назначение для хранения однотипных переменных для хранения неоднородных разнотипных переменных Пример массив, строка, список, стек, очередь, набор, карта, дерево структура, класс
3 Структура Структура – объединение нескольких компонентов в переменную с одним именем // структура для работы с компонентами цвета struct color { int red, green, blue; }; // объявление (создание экземпляра структуры) color WhiteColor; // инициализация переменных-членов структуры WhiteColor.red=255; // доступ по оператору «.» WhiteColor.green=255; WhiteColor.blue=255;
4 Динамическое размещение структуры // динамическое размещение структуры color* RedColor=new color; // доступ по оператору -> RedColor->red=0; RedColor->green=0; // доступ по оператору разыменования (*RedColor).blue=0; // указатель на член структуры int* green=&(RedColor->green); // указатель на член структуры int* red=&WhiteColor.red; См. пример программы
5 Передача структуры в функцию По значению int luminance1(color c) { return 0.212*c.red *c.green *c.blue; } По ссылке int luminance2(color& c) { return 0.212*c.red *c.green *c.blue; } По указателю int luminance3(color* c) { return 0.212*c->red *c->green *c->blue; }
6 Функции-члены структуры // структура для работы с компонентами цвета struct color { int red, green, blue; int luminance() { return 0.212*red *green *blue; } }; // Вызов функции-члена структуры int l1=x.luminance(); // если x - структура int l2=y->luminance(); // если y – указатель на структуру См. пример программы
7 Абстрактные типы данных (классы) Классы предназначены для выражения структуры и поведения объекта атрибуты – переменные-члены класса поведение (операции, действия) – функции-члены класса Объявление класса - резервирует имя (лексему) как имя нового типа данных при моделировании можно пользоваться оптическими понятиями: оптическая поверхность, оптическая среда, линза, диафрагма, предмет, изображение class Lens; class Beam; class Surface;
8 Определение класса // класс ЛИНЗА class Lens { private: // переменные-члены: double m_R1, m_R2; double m_D, m_d; double m_n; public: // функции-члены: // конструкторы и деструктор Lens(); Lens(double r1, double r2, double D, double d, double n); Lens(const Lens& one); ~Lens(); // модификаторы и селекторы void set_n(double n); double get_n() const; double get_f() const; }; См. пример программы
9 Проверка на повторное подключение файла Определение класса заключается в конструкцию: // проверка на повторное подключение файла #if !defined LENS_H #define LENS_H //... #endif //defined LENS_H Обычно имя константы - это имя заголовочного файла в верхнем регистре с заменой точки на символ подчеркивания.
10 Тип доступа к членам класса class Lens { private: // доступны только внутри класса... protected: // доступны внутри и для наследников... public: // доступны везде... }
11 Принципы ООП Абстракция формирование представления о свойствах и поведении предмета путем выделения существенных характеристик, отличающих его от других видов объектов Инкапсуляция сокрытие внутреннего устройства, реализации объекта Сохраняемость возможность объекта сохранить информацию о своём состоянии, а затем при необходимости восстановить его Наследование (иерархия) отношение между классами, когда один объект заимствует структурную и функциональную часть другого Полиморфизм (типизация) возможность принимать множество форм, изменять поведение в зависимости от ситуации
12 Типы функций-членов класса Конструктор создание объекта и инициализации его атрибутов Деструктор освобождение используемых объектом ресурсы и разрушение объекта Модификатор изменение переменных-членов объекта (clear, set_n, set_d, …) Селектор считывание переменных-членов объекта (get_n, get_r1, … ) Утилита операция высокого уровня, выполняющая те или иные действия в зависимости от сущности объекта (RayTrace, CalcParaxial)
13 Конструктор и деструктор Конструктор (constructor) - это функция-член, имя которой совпадает с именем класса, инициализирующая переменные-члены, распределяющая память для их хранения (new) // конструктор по умолчанию Lens(); // полный конструктор Lens(double r1, double r2, double D, double d, double n); // конструктор копирования Lens(const Lens& one); Деструктор (destructor) - это функция-член, имя которой представляет собой ~имя класса, предназначенная для уничтожения переменных (delete) ~Lens(); // деструктор у конструктора и деструктора нет возвращаемого значения
14 Конструктор по умолчанию Конструктор не требующий аргументов, называется конструктором по умолчанию описание конструктора по умолчанию Lens(); реализация конструктора по умолчанию Lens::Lens() // оператор :: показывает принадлежность к классу { m_R1=0.; m_R2=0.; m_d=0.; m_D=0.; m_n=1.; } вызов конструктора по умолчанию Lens test_lens1; Lens test_lens2(); Lens test_lens3[10];
15 Полный конструктор Полный конструктор позволяет явно инициализировать все переменные-члены класса описание полного конструктора double r1,double r2,double D,double d,double n); реализация полного конструктора Lens::Lens(double r1,double r2,double D,double d,double n) { m_R1=r1; m_R2=r2; m_d=d; m_D=D; m_n=n; } вызов полного конструктора Lens test_lens(10., -10., 2., 5., 1.5);
16 Неполный конструктор Неполный конструктор - в списке параметров указываются не все возможные параметры для инициализации членов класса, а только наиболее часто используемые описание неполного конструктора Lens(double r1,double r2); реализация неполного конструктора Lens::Lens(double r1,double r2) { m_R1=r1; m_R2=r2; m_d=0.; m_D=0.; m_n=1.; } вызов неполного конструктора Lens test_lens(10., -10.);
17 Неполный конструктор Инициализация переменных-членов класса в конструкторах Lens::Lens(double R1, double R2) : m_R1(R1), m_R2(R2) { m_d=2.; m_D=5.; m_n=1.5; } Lens::Lens(double R1, double R2) : m_R1(R1), m_R2(R2), m_d(2.), m_D(5.), m_n(1.5) { }
18 Конструктор копирования Конструктор копирования – осуществляет поэлементное копирование переменных-членов класса, создает копию уже существующего класса используется при передаче экземпляров класса в функции по значению описание конструктора копирования Lens(const Lens& l); реализация конструктора копирования Lens::Lens(const Lens& l) : m_R1(l.m_R1), m_R2(l.m_R2), m_d(l.m_d), m_D(l.m_D), m_n(l.m_n) { } вызов конструктора копирования Lens lens1(10., -10.); Lens lens2(lens1); Lens::Lens(const Lens& l) { m_R1=l.m_R1; m_R2=l.m_R2; m_d=l.m_d; m_D=l.m_D; m_n=l.m_n; }
19 Деструктор Деструктор - осуществляет освобождение памяти, уничтожение объектов размещенных динамически Matrix::Matrix(int n, int m) { m_data=new double[n*m]; } Matrix::~Matrix() { delete [] m_data; } См. пример программы
20 Исключительные ситуации Генерация исключительной ситуации if(n
21 Модификаторы Модификаторы - установка значения private переменной- члена // установка показателя преломления void Set_n(double n); // установка осевого расстояния void Set_d(double d); Селекторы позволяют узнать значение private переменной-члена // получение показателя преломления double Get_n() const; // получение осевого расстояния double Get_d() const; Вызов модификатора и селектора lens5.Set_n(1.6); cout
22 Ключевые слова inline и const inline – встраиваемая функция, компилятор подставляет ее код в каждое место вызова inline void Lens::set_n(double n) { m_n=n; } обычно функции, состоящие из одной-двух строк, и не делающие сложных вычислений, делают inline const – постоянная функция не изменяет значений переменных членов (обычно селектор) double Lens::get_n() const; void write(std::ostream& out) const;
23 Функции-утилиты Утилиты – функции, выполняющие какие-то смысловые (например, вычисление, или рисование) действия например - вычисление параксиальных характеристик См. пример программы
24 Сохраняемость способность объекта существовать во времени, переживая породивший его процесс, и в пространстве, перемещаясь из своего первоначального адресного пространства Сериализация сохранение информации о состоянии объекта, с последующей возможностью его восстановления void Lens::write(ostream& out) const { outm_n; } См. пример программы
25 Задание Преобразовать структуру Сolor в класс. Все функции делаются inline, и реализуются в h-файле. В функции main объявить переменную типа Color, заполнить произвольными значениями и вывести на экран яркость. class Сolor { private: int m_red, m_green, m_blue; public: Сolor(); Сolor(int red, int blue, int green); Сolor(const color& other); ~Сolor(); void SetRed(int red); // аналогично – для green и blue int GetRed() const; // аналогично – для green и blue int luminance() const; };