Абстрактные типы данных Прикладное программирование кафедра прикладной и компьютерной оптики 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 + 0.715*c.green + 0.072*c.blue; } По ссылке int luminance2(color& c) { return 0.212*c.red + 0.715*c.green + 0.072*c.blue; } По указателю int luminance3(color* c) { return 0.212*c->red + 0.715*c->green + 0.072*c->blue; } 6 Функции-члены структуры // структура для работы с компонентами цвета struct color { int red, green, blue; int luminance() { return 0.212*red + 0.715*green + 0.072*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<1) throw exception("Index of refraction should be greater than 1."); Обработка исключительной ситуации если в блоке try возникает исключение – управление переходит к блоку catch если в блоке try не возникает исключение – блок catch игнорируется если возникает исключение, но блок try отсутствует – функция завершается, если в вызывающих функциях тоже отсутствуют блоки try - программа прервется с сообщением об ошибке try { ... } // блок catch - обработка ошибки catch(exception& error) { ... } См. пример программы 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<<lens5.Get_n()<<endl; 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 { out<<m_R1<<m_R2<<m_d<<m_D<<m_n; } void Lens::read(istream& in) { cin>>m_R1>>m_R2>>m_d>>m_D>>m_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; };