Прикладное программирование Абстрактные типы данных кафедра прикладной и компьютерной оптики

advertisement
Абстрактные типы данных
Прикладное программирование
кафедра
прикладной и компьютерной оптики
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;
};
Download