- •Определение класса
- •Пример (точка)
- •Оператор вывода (пример)
- •Параметр шаблона по умолчанию (пример)
- •Где перехватывать исключения?
- •Гарантии безопасности исключений
- •Базовые операции
- •Виртуальная функция
- •Использование virtual
- •Массив, как диапазон
- •Контейнер
- •Свойства элемента контейнера
- •Заголовочные файлы
- •Доступ к элементам list
- •Размеры list
- •Доступ к элементам map
- •Очередь с приоритетом
- •Дэк (двусвязная очередь)
- •Матрица (в математике)
- •Атд “матрица”
- •Дерево (доп. Определения)
- •Узел дерева (доп. Определения)
- •“Родственные отношения”
- •“Родственные отношения” (иллюстрация)
- •Баланс в дереве (иллюстрация)
- •Std::less (пример функтора)
- •Std::find_if (пример алгоритма)
- •Функциональные адаптеры
- •Производящая функция
- •Производящие функции для функциональных адаптеров
Баланс в дереве (иллюстрация)
1
3
5
7
9
3
1 5
7
9
сбалансированное несбалансированное
21.04.2012
cppNewb.ru 67
Узел дерева (послойно)
struct STNode
{
STNode* m_pNext;
STNode* m_pChild; T m_data;
};
21.04.2012
cppNewb.ru 68
Вставка поддерева (послойно)
21.04.2012
cppNewb.ru 69
Вставка поддерева
(список детей)
21.04.2012
cppNewb.ru 70
Объектно-ориентированное
программирование
с использованием C++
Полевой Дмитрий Валерьевич к.т.н., доцент КиК
e-mail: oop.misis@gmail.com
Машинное слово
платформозависимая хар-ка
имеет неоднозначную интерпретацию
(исторически)
байт – единица адресации
слово – несколько байт (обычно 2n)
28.04.2012
cppNewb.ru 2
Длинна машинного слова
процессор
разрядность данных
максимальное значение беззнакового целого типа
память
разрядность адресуемых данных
(шина данных)
объем адресуемой напрямую памяти
28.04.2012
cppNewb.ru 3
Порядок байтов
определяет порядок записи байтов для многобайтовых чисел
28.04.2012
cppNewb.ru 4
big-endian
от старшего к младшему
является стандартным для протоколов
TCP/IP (сетевой, network order)
пример:
0x00000b0f
0x00 0x00 0x0b 0x0f
28.04.2012
cppNewb.ru 5
little-endian
от младшего к старшему
является стандартным для x86
пример:
0x00000b0f
0x0f 0x0b 0x00 0x00
28.04.2012
cppNewb.ru 6
Когда порядок байтов важен
передача данных через файлы
передача данных через сеть
низкоуровневые алгоритмы манипуляции данными (уровня байт и бит)
28.04.2012
cppNewb.ru 7
Целые числа
для знаковых за знак отвечает разряд старшего байта
28.04.2012
cppNewb.ru 8
Вещественные числа
физическое представление может зависеть от порядка байт
на x86 используются форматы
IEEE 754
знак числа в старших байтах
порядок числа в старших байтах
28.04.2012
cppNewb.ru 9
Плюсы и минусы
+ little-endian
как uint32_t (4 байта) – 0x00000022
как uint16_t (2 байта) – 0x0022
как uint8_t (1 байт) – 0x22
- little-endian
отладочное/печатное значение не совпадает с размещением в памяти
28.04.2012
cppNewb.ru 10
Битовые операторы
применяются к целым числам
унарные
NOT (НЕ)
бинарные
AND (И)
OR (ИЛИ)
XOR (ИСКЛЮЧАЮЩЕЕ ИЛИ )
сдвиг
28.04.2012
cppNewb.ru 11
Биты как элементы множества
NOT – дополнение
AND – пересечение
OR – объединение
XOR – симметрическая разность
28.04.2012
cppNewb.ru 12
Битовое НЕ (~)
инверсия битов
пример:
unsigned int v(15 + 11 * 256);
printf(“%x |
”, |
v); |
printf(“%x |
”, |
~v); |
v = ~v; |
|
|
printf(“%x\n”, v);
> b0f fffff4f0 f4f0
28.04.2012
cppNewb.ru 13
Битовое И (&)
совпадение ненулевых битов
пример:
unsigned int v1(15 + 11 * 256); unsigned int v2(9 + 11 * 256);
printf(“%x & %x = %x\n”, v1, v2, v1 & v2);
> 00000b0f & 00000d0b = 0000090b
28.04.2012
cppNewb.ru 14
Битовое ИЛИ (|)
ненулевые биты
пример:
unsigned int v1(15 + 11 * 256); unsigned int v2(9 + 11 * 256);
printf(“%x | %x = %x\n”, v1, v2, v1 | v2);
> 00000b0f | 00000d0b = 00000f0f
28.04.2012
cppNewb.ru 15
Битовое ИСКЛЮЧАЮЩЕЕ ИЛИ
(^)
несовпадение ненулевых битов
пример:
unsigned int v1(15 + 11 * 256); unsigned int v2(9 + 11 * 256);
printf(“%x ^ %x = %x\n”, v1, v2, v1 ^ v2);
> 00000b0f ^ 00000d0b = 00000604
28.04.2012
cppNewb.ru 16
Битовый сдвиг
смещение бит в указанном направлении на указанное число позиций
“вылезающие” за пределы числа биты теряются
“дырки” заполняются
28.04.2012
cppNewb.ru 17
Битовый сдвиг влево (<<)
правые биты заполняются нулями
пример:
signed int si(0xFFFFFFFF); unsigned int ui(0xFFFFFFFF); printf(“%08x %08x”, si << 4, ui << 2)
> fffffff0 fffffff8
28.04.2012
cppNewb.ru 18
Битовый сдвиг вправо (>>)
левые биты заполняются
нулями для беззнаковых
битом знака для знаковых
(зависит от реализациии)
пример:
signed int si(0xFFFFFFFF); unsigned int ui(0xFFFFFFFF);
printf(“%08x %08x”, si >> 4, ui >> 4)
> ffffffff 0fffffff
28.04.2012
cppNewb.ru 19
Присваивающие версии
операторов
|
&= |
rhs |
|
|= |
rhs |
|
^= |
rhs |
|
<<= |
shift |
|
>>= |
shift |
28.04.2012
cppNewb.ru 20
Работа с масками
AND
сброс битов по маске
OR
установка битов по маске
XOR
для инвертирования битов по маске
28.04.2012
cppNewb.ru 21
Создание масок
константы (литералы, макросы)
сдвиги и др. операторы
пример:
const unsigned int m1(1 << 4);
unsigned int m2(0xFF0B1000);
28.04.2012
cppNewb.ru 22
Логические операторы
операнды – логические значения
(сравнение с нулем)
результат – true или false
унарные
NOT (НЕ)
бинарные
AND (И)
OR (ИЛИ)
28.04.2012
cppNewb.ru 23
Логическое НЕ (!)
инверсия значения
пример:
if (!canMove)
{
//...
}
if (0 != canMove)
//...
28.04.2012
cppNewb.ru 24
Логическое И (&&)
false |
&& |
false |
== |
false |
false |
&& |
true |
== |
false |
true |
&& |
false |
== |
false |
true |
&& |
true |
== |
true |
оптимизация вычислений
пример:
res = res && isGood();
28.04.2012
cppNewb.ru 25
Логическое ИЛИ (||)
false |
|| |
false |
== |
false |
false |
|| |
true |
== |
true |
true |
|| |
false |
== |
true |
true |
|| |
true |
== |
true |
оптимизация вычислений
пример:
res = res || needCheck();
28.04.2012
cppNewb.ru 26
Параметры командной строки
передаются операционной системой при запуске приложения
для отладки могут устанавливаться в среде разработки
включают имя самого приложения
int main(int argc, char* argv[])
28.04.2012
cppNewb.ru 27
Пример использования параметров командной строки
int main(int argc, char* argv[])
{
if (3 < argc)
{
string pathIn(argv[1]); string pathOut(argv[2]);
...
}
...
28.04.2012
cppNewb.ru 28
Как отлаживать использование параметров командной строки
в настройках проекта
Command ${TargetPath} Command Arguments параметры
Working Directory ${TargetDir} или ${ProjectDir}
28.04.2012
cppNewb.ru 29
Генерация псеводслучайных чисел (rand, srand)
int rand();
генерация псевдослучайного числа в диапазоне от 0 до RAND_MAX.
void srand(unsigned int seed);
инициализация генератора псевдослучайных чисел
28.04.2012
cppNewb.ru 30
Генерация псеводслучайных чисел в диапазоне
от 0 до n - 1
rand() % n
от n1 до n2 - 1
n1 + (rand() % (n2 – n1))
28.04.2012
cppNewb.ru 31
Инициализация генератора псевдослучайных чисел
определяет начальное значение (seed)
для последовательности
используется для улучшения качества псевдослучайной последовательности
в качестве начального значения используется некоторое “случайное” значение
28.04.2012
cppNewb.ru 32
Текущее время (time)
time_t time(time_t* timer);
текущее время
число секунд с 00:00, 1 января 1970 UTC
аргумент м.б. 0
пример:
srand(static_cast<unsigned int>(time(0)));
28.04.2012
cppNewb.ru 33
Рекурсия
вызов функции из неё же самой, непосредственно (простая рекурсия) или через другие функции
(сложная или косвенная рекурсия)
в С++ «использует» стек вызова
может заменятся циклом
возможно с использованием стека
28.04.2012
cppNewb.ru 34
Рекурсия (плюсы и минусы)
естественный способ (вычислений)
простота организации и наблюдения
зацикливания и переполнения стека
сложность соблюдения допустимой
«глубины»
сложность косвенной рекурсии
использовать не рекомендуется
28.04.2012
cppNewb.ru 35
Пример использования рекурсии
/**
рекурсивное вычисление факториала
*/
int factorial(const int n)
{
return n ? (n * factorial(n - 1)) : 1;
}
28.04.2012
cppNewb.ru 36
Указатель на функцию
ТипВозврата (*имя)(список_аргументов)
пример:
bool (*pCmp)(const int, const int)(0); pCmp = compareByIdx;
pCmp(i1, i2); // или (*pCmp)(i1, i2)
28.04.2012
cppNewb.ru 37
Функция обратного вызова
(call back function)
передача исполняемого кода в качестве одного из параметров другого кода
позволяет
исполнять в функции код, который задаётся в аргументах при её вызове
определять конкретный алгоритм на этапе выполнения (а не компиляции) программы
28.04.2012
cppNewb.ru 38
Функция обратного вызова
(назначение)
подзадача, которая используется для обработки данных внутри некоторой функции
“телефонная связь”, используемая для того, чтобы “связываться” с тем, кто вызвал процедуру, при наступлении какого-то события
28.04.2012
cppNewb.ru 39
Сортировка (qsort)
void qsort(void* base, size_t num, size_t size,
int (*cmp)(const void*, const void*));
сортировка num блоков памяти размера
size в массиве base
для сравнения используется функция
cmp
28.04.2012
cppNewb.ru 40
Пример (qsort)
// pData – массив структур SBook
// num – число элементов в массиве
int (*pCmp)(const void*, const void*)(cmpByYear);
qsort(pData, num, sizeof(*pData), pCmp);
28.04.2012
cppNewb.ru 41
Пример (qsort)
int cmpByYear(const void* pL, const void* pR)
{
assert((0 != pL) && (0 != pR));
SBook& lhs(*reinterpret_cast<SBook*>(pL)); SBook& rhs(*reinterpret_cast<SBook*>(pR)); return (rhs.m_year - lhs.m_year);
}
28.04.2012
cppNewb.ru 42
Проблемы call-back функций
нет контроля типов
накладные на вызовы функций
глобальные данные
28.04.2012
cppNewb.ru 43
Стандартные алгоритмы
шаблонные функции,
параметризуются через
итераторы
функторы
если тип итераторов контейнера не соответствует типу итераторов алгоритма, поищите метод контейнера
28.04.2012
cppNewb.ru 44
std::find (пример алгоритма)
template<class InputIt, class T> InputIt find(InputIt first,
InputIt last, const T& value)
{
for(;first != last; ++first) if (*first == value)
break; return first;
}
28.04.2012
cppNewb.ru 45
std::sort (варианты функции)
для контейнеров с произвольным доступом
template<class RandAccIt> void sort(RandAccIt first,
RandAccIt last)
template<class RandAccIt, class Compare>
void sort(RandAccIt first,
RandAccIt last, Compare comp)
28.04.2012
cppNewb.ru 46
std::sort (варианты функции)
для списка
void list::sort()
template <class Compare>
void list::sort(Compare comp)
28.04.2012
cppNewb.ru 47
Функтор
(функциональный объект)
экземпляр любого класса,
перегружающего operator()
используется для параметризации алгоритмов
может встраиваться компилятором в тело алгоритма (в отличии от обычной функции)
28.04.2012
cppNewb.ru 48
Функтор
(функциональный объект)
может содержать данные
может копироваться в процессе работы алгоритма
для некоторых алгоритмов не должен иметь изменяемого состояния
28.04.2012
cppNewb.ru 49
Свойства функторов
(traits)
информация о типах аргументов и результата
используются в шаблонном коде
28.04.2012
cppNewb.ru 50
std::unary_function
template <class Arg, class Res> struct unary_function
{
typedef Arg argument_type; typedef Res result_type;
};
28.04.2012
cppNewb.ru 51
std::binary_function
template <class Arg1, class Arg2, class Res>
struct binary_function
{
-
typedef
Arg1
first_argument_type;
typedef
Arg2
second_argument_type;
typedef Res result_type;
};
28.04.2012
cppNewb.ru 52