- •Определение класса
- •Пример (точка)
- •Оператор вывода (пример)
- •Параметр шаблона по умолчанию (пример)
- •Где перехватывать исключения?
- •Гарантии безопасности исключений
- •Базовые операции
- •Виртуальная функция
- •Использование virtual
- •Массив, как диапазон
- •Контейнер
- •Свойства элемента контейнера
- •Заголовочные файлы
- •Доступ к элементам list
- •Размеры list
- •Доступ к элементам map
- •Очередь с приоритетом
- •Дэк (двусвязная очередь)
- •Матрица (в математике)
- •Атд “матрица”
- •Дерево (доп. Определения)
- •Узел дерева (доп. Определения)
- •“Родственные отношения”
- •“Родственные отношения” (иллюстрация)
- •Баланс в дереве (иллюстрация)
- •Std::less (пример функтора)
- •Std::find_if (пример алгоритма)
- •Функциональные адаптеры
- •Производящая функция
- •Производящие функции для функциональных адаптеров
Объектно-ориентированное
программирование
с использованием C++
Полевой Дмитрий Валерьевич к.т.н., доцент КиК
e-mail: oop.misis@gmail.com
Ссылка (reference)
альтернативное имя переменной
инициализируется при объявлении
пример:
T var(0);
T& ref(var);
18.02.2012
cppNewb.ru 2
Объявление функции
тип возвращаемого значения
имя функции
список аргументов
тип
имя
пример:
int swap(const int lhs, const int rhs);
18.02.2012
cppNewb.ru 3
Определение функции
объявление в котором присутствует тело
типы аргументов объявления и определения должны совпадать
рекомендуется поддерживать соответствие имен аргументов (могут не совпадать)
18.02.2012
cppNewb.ru 4
Определение функции
пример:
int min(const int lhs, const int rhs)
{
return (lhs < rhs )? lhs: rhs;
}
int maxTr(const int lhs, const int rhs,
cosnt int)
{
return (lhs > rhs )? lhs: rhs;
}
18.02.2012
cppNewb.ru 5
Передача аргументов
• |
по значению |
|
• |
по ссылке |
|
* |
через указатель |
(по значению) |
пример:
int min(int lhs, int rhs)
{
return (lhs < rhs )? lhs: rhs;
}
18.02.2012
cppNewb.ru 6
Аргумент ссылка
пример:
void swap(int& lhs, int& rhs)
{
int newLhs(rhs);
-
rhs
=
lhs;
lhs
=
newLhs;
}
18.02.2012
cppNewb.ru 7
Возвращаемое значение
задается инструкцией return
должно быть, если не void
неименованная временная переменная
пример:
void empty()
{
return;
}
18.02.2012
пример:
int empty()
{
int res(0);
// …
return res;
cppNew}b.ru 8
Терминология (класс, экземпляр)
класс – пользовательский тип
экземпляр – объект (область памяти)
18.02.2012
cppNewb.ru 9
Данные и методы
данные – переменные
методы – функции
18.02.2012
cppNewb.ru 10
Доступ к членам
. – оператор доступа к члену
-> – оператор разыменования члена структуры (для указателя на экземпляр)
Address myAddress;
Address* pAddress = &myAddress;
myAddress.zip() pAddress->zip() (*pAddress).zip()
18.02.2012
cppNewb.ru 11
public
Управление доступом
открытые члены, имена доступны везде
private
закрытые члены, имена доступны только в собственных функциях-членах
protected
защищенные члены, имена доступны только в собственных функциях и функциях-членах производных классов
18.02.2012
cppNewb.ru 12
Определение класса
class ClassName
{
};
18.02.2012
public:
// открытые методы
private:
// закрытые методы
private:
// закрытые данные
cppNewb.ru 13
Пример (точка)
пример:
class Point
{
public:
// методы
private:
-
int
m_x;
//<
x-координата
int
m_y;
//<
y-координата
};
18.02.2012
cppNewb.ru 14
Конструктор
имя функции совпадает с именем класса
не возвращает значений
создает экземпляр (инициализирует)
18.02.2012
cppNewb.ru 15
Конструктор (пример)
пример:
class Point
{
public:
Point(const int x, const int y);
…
};
18.02.2012
cppNewb.ru 16
Инициализация данных
сконструированный объект д.б.
инициализирован
пример:
Point::Point(const int x, const int y)
: m_x(x)
, m_y(y)
{
}
18.02.2012
cppNewb.ru 17
Порядок инициализации
определяется порядком объявления переменных в классе
не зависит от порядка в списке инициализации
инициализируйте переменные в порядке объявления
18.02.2012
cppNewb.ru 18
Перегрузка функций
использование одного имени для операция с разными типами
пример:
int min(const int lhs, const int rhs);
double |
min(const |
double |
lhs, |
|
const |
double |
rhs); |
18.02.2012
cppNewb.ru 19
Поиск соответствия (функция)
точное соответствие типов аргументов
соответствие после “повышения”
интегральных типов (bool→int и т.д.)
соответствие после стандартных преобразований типов (int→double и т.д.)
соответствие после пользовательских преобразований типов
соответствие за счет многоточий в объявлении функции (…)
18.02.2012
cppNewb.ru 20
Перегрузка методов
аналогично перегрузке функций
18.02.2012
cppNewb.ru 21
Перегрузка конструктора
пример:
class Point
{
public:
Point(const int x, const int y); Point(const Point& point);
…
};
18.02.2012
cppNewb.ru 22
Деструктор
имя функции строиться из имени класса
не принимает аргументов
не возвращает значений
разрушает экземпляр
18.02.2012
cppNewb.ru 23
пример:
Деструктор (пример)
// В cpoint.h class CPoint
{
public:
~CPoint();
…
};
// В cpoint.cpp CPoint::~CPoint()
{
}
18.02.2012
cppNewb.ru 24
Форма записи выражений
традиционная форма
a + b
префиксная форма
+ a b
пример:
a + b
operator+(a, b)
18.02.2012
cppNewb.ru 25
Операторная функция
имя начинается с ключевого слова operator, после которого идет сам оператор
пример: operator+ operator++
объявление соответствует грамматике языка (количество и состав аргументов)
18.02.2012
cppNewb.ru 26
Перегрузка операторов
функция-член (внутренняя)
пример:
T operator@(const T& rhs)
функция-не-член (внешняя)
пример:
T operator@(const T& lhs, const T& rhs)
18.02.2012
cppNewb.ru 27
Приоритет операторов
|
операторов |
определен |
в |
стандарте |
языка |
|
|
приоритет операторов не может быть
изменен
18.02.2012
cppNewb.ru 28
Унарный оператор
выражение @aa или aa@
нестатическая функция-член без аргументов
aa.operator@()
функция-не-член с одним аргументом
operator@(aa)
18.02.2012
cppNewb.ru 29
Префиксная и постфиксная
формы унарных операторов
префиксный оператор @aa
возвращает результат вычисления
пример:
++a
постфиксный оператор aa@
возвращает исходное значение аргумента
пример:
a++
18.02.2012
cppNewb.ru 30
Префиксные и постфиксные операторы (сигнатуры)
префиксный оператор
T& operator++() T& operator--()
постфиксный оператор
T operator++(int)
T operator--(int)
18.02.2012
cppNewb.ru 31
Префиксный унарный оператор
(пример)
T& T::operator++()
{
// содержательная работа
return *this;
}
18.02.2012
cppNewb.ru 32
Постфиксный унарный оператор
(пример)
T T::operator++(int)
{
T initValue(*this)
++(*this);
return initValue;
}
18.02.2012
cppNewb.ru 33
Бинарный оператор
выражение aa @ bb
нестатическая функция-член с одним аргументом
aa.operator@(bb)
функция-не-член с двумя аргументами
operator@(aa, bb)
18.02.2012
cppNewb.ru 34
Ограничения
нельзя создать “новый” оператор
|
изменить |
число аргументов |
|
изменить |
приоритет |
18.02.2012
cppNewb.ru 35
Предопределенный смысл
должен сохраняться
должен быть переопределен для всех вариантов операторов
пример: a++ означает a += 1 означает
a = a + 1
18.02.2012
cppNewb.ru 36
Сохранение смысла
для автономных версий операторов a@b всегда предоставляйте присваивающую версию @=
для операторов, допускающих перестановку аргументов, предоставляйте все соответствующие версии
18.02.2012
cppNewb.ru 37
Принцип минимальности интерфейса
минимизируйте число функций, непосредственно манипулирующих представлением объекта
объявляйте в классе только те операторы, которые модифицируют значение первого аргумента
18.02.2012
cppNewb.ru 38
Минимальность интерфейса
(пример)
в классе
T& operator+=(const T& rhs)
вне класса
T operator+(const T& lhs, const T& rhs)
{
T sum(lhs); sum += rhs; return sum;
}
18.02.2012
cppNewb.ru 39
Перегрузка операторов
(рекомендации)
перегружайте умеренно и осмысленно
используйте операторы для имитации привычной формы записи
минимизируйте число функций,
имеющих доступ к внутреннему
представлению |
класса |
|
|
создание временных |
|
18.02.2012 |
cppNewb.ru |
40 |
Перегрузка операторов
(рекомендации)
обеспечивайте полный набор перегруженных операторов
минимизируйте количество независимых операторов
пример:
operator==
operator!= – реализовать через operator==
18.02.2012
cppNewb.ru 41
Смешанная арифметика
RatN val(0); /// rational number
2 + val; val + 2;
требует наличия операторов
RatN operator+(const СRatN&, int); RatN operator+(int, const СRatN&);
18.02.2012
cppNewb.ru 42
Потоковый ввод и вывод
Point center(0, 0); cout << center;
приводит к вызову
operator<<(cout, center)
18.02.2012
cppNewb.ru 43
Классы ввода/вывода
ostream
поток вывода (класс)
глобальные объекты cout, cerr, clog
istream
поток ввода (класс)
глобальный объект cin
18.02.2012
cppNewb.ru 44
Проблема перегрузки операций ввода и вывода
левым аргументом является экземпляр класса стандартной библиотеки
модификация класса левого аргумента невозможна или нежелательна
18.02.2012
cppNewb.ru 45
Перегрузка ввода/вывода
вывод
ostream& |
operator<<(ostream&, |
T) |
|
или
ostream& |
operator<<(ostream&, |
const |
T&) |
ввод
istream& operator>>(istream&, T&)
18.02.2012
cppNewb.ru 46