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

More Related Content

What's hot

C++ осень 2013 лекция 2
C++ осень 2013 лекция 2C++ осень 2013 лекция 2
C++ осень 2013 лекция 2
Technopark
 
C++ осень 2013 лекция 9
C++ осень 2013 лекция 9C++ осень 2013 лекция 9
C++ осень 2013 лекция 9
Technopark
 
C++ осень 2012 лекция 9
C++ осень 2012 лекция 9C++ осень 2012 лекция 9
C++ осень 2012 лекция 9
Technopark
 
C++ осень 2013 лекция 6
C++ осень 2013 лекция 6C++ осень 2013 лекция 6
C++ осень 2013 лекция 6
Technopark
 
паттерны программирования
паттерны программированияпаттерны программирования
паттерны программирования
guestfc8ae0
 
C++ весна 2014 лекция 2
C++ весна 2014 лекция 2C++ весна 2014 лекция 2
C++ весна 2014 лекция 2
Technopark
 
модуль 14 введение в generics
модуль 14 введение в genericsмодуль 14 введение в generics
модуль 14 введение в generics
Yevgeniy Gertsen
 

What's hot (20)

C++ осень 2013 лекция 2
C++ осень 2013 лекция 2C++ осень 2013 лекция 2
C++ осень 2013 лекция 2
 
C++ Базовый. Занятие 04.
C++ Базовый. Занятие 04.C++ Базовый. Занятие 04.
C++ Базовый. Занятие 04.
 
C++ осень 2013 лекция 9
C++ осень 2013 лекция 9C++ осень 2013 лекция 9
C++ осень 2013 лекция 9
 
Объектно-ориентированное программирование. Лекция 5 и 6
Объектно-ориентированное программирование. Лекция 5 и 6Объектно-ориентированное программирование. Лекция 5 и 6
Объектно-ориентированное программирование. Лекция 5 и 6
 
C++ Базовый. Занятие 03.
C++ Базовый. Занятие 03.C++ Базовый. Занятие 03.
C++ Базовый. Занятие 03.
 
Lecture 5
Lecture 5Lecture 5
Lecture 5
 
Lecture 8
Lecture 8Lecture 8
Lecture 8
 
Автоматическая генерация тестов по комментариям к программному коду
Автоматическая генерация тестов по комментариям к программному кодуАвтоматическая генерация тестов по комментариям к программному коду
Автоматическая генерация тестов по комментариям к программному коду
 
C++ осень 2012 лекция 9
C++ осень 2012 лекция 9C++ осень 2012 лекция 9
C++ осень 2012 лекция 9
 
C++ осень 2013 лекция 6
C++ осень 2013 лекция 6C++ осень 2013 лекция 6
C++ осень 2013 лекция 6
 
паттерны программирования
паттерны программированияпаттерны программирования
паттерны программирования
 
C++ весна 2014 лекция 2
C++ весна 2014 лекция 2C++ весна 2014 лекция 2
C++ весна 2014 лекция 2
 
модуль 14 введение в generics
модуль 14 введение в genericsмодуль 14 введение в generics
модуль 14 введение в generics
 
C# Desktop. Занятие 02.
C# Desktop. Занятие 02.C# Desktop. Занятие 02.
C# Desktop. Занятие 02.
 
C# Desktop. Занятие 04.
C# Desktop. Занятие 04.C# Desktop. Занятие 04.
C# Desktop. Занятие 04.
 
C++ Базовый. Занятие 11.
C++ Базовый. Занятие 11.C++ Базовый. Занятие 11.
C++ Базовый. Занятие 11.
 
C++ Базовый. Занятие 15.
C++ Базовый. Занятие 15.C++ Базовый. Занятие 15.
C++ Базовый. Занятие 15.
 
Поговорим о JavaScript, основы и современные тенденции развития языка
Поговорим о JavaScript, основы и современные тенденции развития языкаПоговорим о JavaScript, основы и современные тенденции развития языка
Поговорим о JavaScript, основы и современные тенденции развития языка
 
C# Desktop. Занятие 01.
C# Desktop. Занятие 01.C# Desktop. Занятие 01.
C# Desktop. Занятие 01.
 
C++ Базовый. Занятие 01.
C++ Базовый. Занятие 01.C++ Базовый. Занятие 01.
C++ Базовый. Занятие 01.
 

Similar to Lecture 3

C++ осень 2013 лекция 7
C++ осень 2013 лекция 7C++ осень 2013 лекция 7
C++ осень 2013 лекция 7
Technopark
 
C++ осень 2012 лекция 6
C++ осень 2012 лекция 6C++ осень 2012 лекция 6
C++ осень 2012 лекция 6
Technopark
 
Yuri Trukhin - Software developement best practices
Yuri Trukhin - Software developement best practicesYuri Trukhin - Software developement best practices
Yuri Trukhin - Software developement best practices
beloslab
 
ZFConf 2010: What News Zend Framework 2.0 Brings to Us
ZFConf 2010: What News Zend Framework 2.0 Brings to UsZFConf 2010: What News Zend Framework 2.0 Brings to Us
ZFConf 2010: What News Zend Framework 2.0 Brings to Us
ZFConf Conference
 

Similar to Lecture 3 (20)

Zend framework 2
Zend framework 2Zend framework 2
Zend framework 2
 
Lecture 4
Lecture 4Lecture 4
Lecture 4
 
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
 
Java осень 2014 занятие 5
Java осень 2014 занятие 5Java осень 2014 занятие 5
Java осень 2014 занятие 5
 
Cтиль программирования
Cтиль программированияCтиль программирования
Cтиль программирования
 
Zend Framework и Doctrine
Zend Framework и DoctrineZend Framework и Doctrine
Zend Framework и Doctrine
 
C++ осень 2013 лекция 7
C++ осень 2013 лекция 7C++ осень 2013 лекция 7
C++ осень 2013 лекция 7
 
Артем Розуменко - "Как и зачем разрабатывать собственный фреймворк?"
Артем Розуменко - "Как и зачем разрабатывать собственный фреймворк?"Артем Розуменко - "Как и зачем разрабатывать собственный фреймворк?"
Артем Розуменко - "Как и зачем разрабатывать собственный фреймворк?"
 
C# vs C++
C# vs C++C# vs C++
C# vs C++
 
Классы и объекты С#
Классы и объекты С#Классы и объекты С#
Классы и объекты С#
 
особенности программирования на с++
особенности программирования на с++особенности программирования на с++
особенности программирования на с++
 
C++ осень 2012 лекция 6
C++ осень 2012 лекция 6C++ осень 2012 лекция 6
C++ осень 2012 лекция 6
 
PostSharp - Threading Model
PostSharp - Threading ModelPostSharp - Threading Model
PostSharp - Threading Model
 
PostSharp - Threading Model Library
PostSharp - Threading Model LibraryPostSharp - Threading Model Library
PostSharp - Threading Model Library
 
Doctrine 2
Doctrine 2Doctrine 2
Doctrine 2
 
Aspect Oriented Programming and Design Patterns
Aspect Oriented Programming and Design PatternsAspect Oriented Programming and Design Patterns
Aspect Oriented Programming and Design Patterns
 
AOP and Design Patterns (GoF)
AOP and Design Patterns (GoF)AOP and Design Patterns (GoF)
AOP and Design Patterns (GoF)
 
Yuri Trukhin - Software developement best practices
Yuri Trukhin - Software developement best practicesYuri Trukhin - Software developement best practices
Yuri Trukhin - Software developement best practices
 
ZFConf 2010: What News Zend Framework 2.0 Brings to Us
ZFConf 2010: What News Zend Framework 2.0 Brings to UsZFConf 2010: What News Zend Framework 2.0 Brings to Us
ZFConf 2010: What News Zend Framework 2.0 Brings to Us
 
лек11 5
лек11 5лек11 5
лек11 5
 

More from Anastasia Snegina

птп по ппп 2013 2014
птп по ппп 2013 2014 птп по ппп 2013 2014
птп по ппп 2013 2014
Anastasia Snegina
 
прикл.прогр птп 13 14
прикл.прогр птп 13 14прикл.прогр птп 13 14
прикл.прогр птп 13 14
Anastasia Snegina
 
2012 2013 пм спп провидошина
2012 2013  пм спп провидошина2012 2013  пм спп провидошина
2012 2013 пм спп провидошина
Anastasia Snegina
 
2012 2013 пм спп провидошина
2012 2013  пм спп провидошина2012 2013  пм спп провидошина
2012 2013 пм спп провидошина
Anastasia Snegina
 
рп по у пп практике в
рп по у пп практике врп по у пп практике в
рп по у пп практике в
Anastasia Snegina
 
рп по пр практике в
рп по пр практике врп по пр практике в
рп по пр практике в
Anastasia Snegina
 
рп по у сп практике в
рп по у сп практике врп по у сп практике в
рп по у сп практике в
Anastasia Snegina
 
рп по у пп практике вт
рп по у пп практике втрп по у пп практике вт
рп по у пп практике вт
Anastasia Snegina
 
рп по пр практике вт
рп по пр практике втрп по пр практике вт
рп по пр практике вт
Anastasia Snegina
 
рп по у сп практике вт
рп по у сп практике втрп по у сп практике вт
рп по у сп практике вт
Anastasia Snegina
 
рп по у пп практике вт
рп по у пп практике втрп по у пп практике вт
рп по у пп практике вт
Anastasia Snegina
 
рп по пр практике вт
рп по пр практике втрп по пр практике вт
рп по пр практике вт
Anastasia Snegina
 
рп по у сп практике вт
рп по у сп практике втрп по у сп практике вт
рп по у сп практике вт
Anastasia Snegina
 

More from Anastasia Snegina (20)

птп по ппп 2013 2014
птп по ппп 2013 2014 птп по ппп 2013 2014
птп по ппп 2013 2014
 
прикл.прогр птп 13 14
прикл.прогр птп 13 14прикл.прогр птп 13 14
прикл.прогр птп 13 14
 
я.прогр птп
я.прогр птпя.прогр птп
я.прогр птп
 
пп кос вт
пп кос втпп кос вт
пп кос вт
 
пп кос в
пп кос впп кос в
пп кос в
 
пп кос в
пп кос впп кос в
пп кос в
 
2012 2013 пм спп провидошина
2012 2013  пм спп провидошина2012 2013  пм спп провидошина
2012 2013 пм спп провидошина
 
2012 2013 пм спп провидошина
2012 2013  пм спп провидошина2012 2013  пм спп провидошина
2012 2013 пм спп провидошина
 
пп кос вт
пп кос втпп кос вт
пп кос вт
 
рп по у пп практике в
рп по у пп практике врп по у пп практике в
рп по у пп практике в
 
рп по пр практике в
рп по пр практике врп по пр практике в
рп по пр практике в
 
рп по у сп практике в
рп по у сп практике врп по у сп практике в
рп по у сп практике в
 
рп по у пп практике вт
рп по у пп практике втрп по у пп практике вт
рп по у пп практике вт
 
рп по пр практике вт
рп по пр практике втрп по пр практике вт
рп по пр практике вт
 
рп по у сп практике вт
рп по у сп практике втрп по у сп практике вт
рп по у сп практике вт
 
рп по у пп практике вт
рп по у пп практике втрп по у пп практике вт
рп по у пп практике вт
 
рп по пр практике вт
рп по пр практике втрп по пр практике вт
рп по пр практике вт
 
рп по у сп практике вт
рп по у сп практике втрп по у сп практике вт
рп по у сп практике вт
 
лр18
лр18лр18
лр18
 
лр15
лр15лр15
лр15
 

Lecture 3

  • 1. Прикладное программирование кафедра прикладной и компьютерной оптики Абстрактные типы данных
  • 2. 2 Составные типы данных Гомогенные Гетерогенные Назначение для хранения однотипных переменных для хранения неоднородных разнотипных переменных Пример массив, строка, список, стек, очередь, набор, карта, дерево структура, класс
  • 3. 3 Структура Структура – объединение нескольких компонентов в переменную с одним именем // структура для работы с компонентами цвета struct color { int red, green, blue; }; // объявление (создание экземпляра структуры) color WhiteColor; // инициализация переменных-членов структуры WhiteColor.red=255; // доступ по оператору «.» WhiteColor.green=255; WhiteColor.blue=255;
  • 4. 4 Динамическое размещение структуры // динамическое размещение структуры color* RedColor=new color; // доступ по оператору -> RedColor->red=0; RedColor->green=0; // доступ по оператору разыменования (*RedColor).blue=0; // указатель на член структуры int* green=&(RedColor->green); // указатель на член структуры int* red=&WhiteColor.red; См. пример программы
  • 5. 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. 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. 7 Абстрактные типы данных (классы) Классы предназначены для выражения структуры и поведения объекта  атрибуты – переменные-члены класса  поведение (операции, действия) – функции-члены класса Объявление класса - резервирует имя (лексему) как имя нового типа данных  при моделировании можно пользоваться оптическими понятиями: оптическая поверхность, оптическая среда, линза, диафрагма, предмет, изображение class Lens; class Beam; class Surface;
  • 8. 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. 9 Проверка на повторное подключение файла Определение класса заключается в конструкцию: // проверка на повторное подключение файла #if !defined LENS_H #define LENS_H // ... #endif //defined LENS_H  Обычно имя константы - это имя заголовочного файла в верхнем регистре с заменой точки на символ подчеркивания.
  • 10. 10 Тип доступа к членам класса class Lens { private: // доступны только внутри класса ... protected: // доступны внутри и для наследников ... public: // доступны везде ... }
  • 11. 11 Принципы ООП Абстракция  формирование представления о свойствах и поведении предмета путем выделения существенных характеристик, отличающих его от других видов объектов Инкапсуляция  сокрытие внутреннего устройства, реализации объекта Сохраняемость  возможность объекта сохранить информацию о своём состоянии , а затем при необходимости восстановить его Наследование (иерархия)  отношение между классами, когда один объект заимствует структурную и функциональную часть другого Полиморфизм (типизация)  возможность принимать множество форм, изменять поведение в зависимости от ситуации
  • 12. 12 Типы функций-членов класса Конструктор  создание объекта и инициализации его атрибутов Деструктор  освобождение используемых объектом ресурсы и разрушение объекта Модификатор  изменение переменных-членов объекта (clear, set_n, set_d, …) Селектор  считывание переменных-членов объекта (get_n, get_r1, … ) Утилита  операция высокого уровня, выполняющая те или иные действия в зависимости от сущности объекта (RayTrace, CalcParaxial)
  • 13. 13 Конструктор и деструктор Конструктор (constructor) - это функция-член, имя которой совпадает с именем класса, инициализирующая переменные-члены, распределяющая память для их хранения (new) // конструктор по умолчанию Lens(); // полный конструктор Lens(double r1, double r2, double D, double d, double n); // конструктор копирования Lens(const Lens& one); Деструктор (destructor) - это функция-член, имя которой представляет собой ~имя класса, предназначенная для уничтожения переменных (delete) ~Lens(); // деструктор • у конструктора и деструктора нет возвращаемого значения
  • 14. 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. 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. 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. 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. 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. 19 Деструктор Деструктор - осуществляет освобождение памяти, уничтожение объектов размещенных динамически Matrix::Matrix(int n, int m) { m_data=new double[n*m]; } Matrix::~Matrix() { delete [] m_data; } См. пример программы
  • 20. 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. 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. 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. 23 Функции-утилиты Утилиты – функции, выполняющие какие-то смысловые (например, вычисление, или рисование) действия  например - вычисление параксиальных характеристик См. пример программы
  • 24. 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. 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; };