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

PDF
C++ осень 2013 лекция 4
PDF
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
PDF
Объектно-ориентированное программирование. Лекции 9 и 10
PDF
C++ осень 2013 лекция 3
PDF
C++ весна 2014 лекция 5
PDF
Объектно-ориентированное программирование. Лекция 7 и 8.
PDF
C++ Базовый. Занятие 02.
PDF
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4
C++ осень 2013 лекция 4
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-ориентированное программирование. Лекции 9 и 10
C++ осень 2013 лекция 3
C++ весна 2014 лекция 5
Объектно-ориентированное программирование. Лекция 7 и 8.
C++ Базовый. Занятие 02.
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4

What's hot (20)

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

Similar to Lecture 3 (20)

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

More from Anastasia Snegina (20)

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

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; };