- •Определение класса
- •Пример (точка)
- •Оператор вывода (пример)
- •Параметр шаблона по умолчанию (пример)
- •Где перехватывать исключения?
- •Гарантии безопасности исключений
- •Базовые операции
- •Виртуальная функция
- •Использование virtual
- •Массив, как диапазон
- •Контейнер
- •Свойства элемента контейнера
- •Заголовочные файлы
- •Доступ к элементам list
- •Размеры list
- •Доступ к элементам map
- •Очередь с приоритетом
- •Дэк (двусвязная очередь)
- •Матрица (в математике)
- •Атд “матрица”
- •Дерево (доп. Определения)
- •Узел дерева (доп. Определения)
- •“Родственные отношения”
- •“Родственные отношения” (иллюстрация)
- •Баланс в дереве (иллюстрация)
- •Std::less (пример функтора)
- •Std::find_if (пример алгоритма)
- •Функциональные адаптеры
- •Производящая функция
- •Производящие функции для функциональных адаптеров
Где перехватывать исключения?
там, где есть достаточно информации для обработки сбоя
с целью
обработать сбой
преобразовать исключение
соблюсти границы подсистем
17.03.2012
cppNewb.ru 42
Гарантии безопасности исключений
базовая гарантия
сбой может изменить состояние, не вызывает утечек и оставляет все объекты пригодными для дальнейшего использования
строгая гарантия
– сбой не |
изменяет состояния (транзакция) |
|
– сбой не |
бессбойности может произойти |
|
17.03.2012 |
cppNewb.ru |
43 |
Сбои и повторное использование
устойчивость и цена разработки должны соответствовать решаемой задаче
требования к устойчивости неизвестны
сообщение пользователю
неизвестны доступные устройства вывода
неизвестно наличие пользователя
17.03.2012
cppNewb.ru 44
Объектно-ориентированное
программирование
с использованием C++
Полевой Дмитрий Валерьевич к.т.н., доцент КиК
e-mail: oop.misis@gmail.com
Символ
графическое начертание
код (числовое значение при хранении в памяти)
символьный набор (кодовая таблица)
24.03.2012
cppNewb.ru 2
Си-строка
массив символов заканчивающийся нуль-терминатором
источник постоянных ошибок
24.03.2012
cppNewb.ru 3
Проблемы манипуляции с Си-строками
низкоуровневая работа с массивом
отслеживание конца строки
отслеживание размера буфера
большое число функций
24.03.2012
cppNewb.ru 4
Кодовые таблицы и юникод
char и wchar_t
национальные таблицы
CP866, Win1251 и т.д.
Unicode (переменный размер)
UTF8
Unicode (фиксированный размер)
UTF16, UTF32
24.03.2012
cppNewb.ru 5
Символ
(стандартная библиотека)
класс-свойств
template<class Ch> struct char_traits;
char_type – тип символов
pos_type – целый тип, определяющий позицию в потоке
24.03.2012
cppNewb.ru 6
Строковый класс (std::string)
стандартная библиотека
стандарт не определяет конкретный способ хранения строк в памяти
стандарт допускает реализацию с подсчетом ссылок
24.03.2012
cppNewb.ru 7
Шаблонное объявление
template < class Ch,
class Tr = char_traits<Ch>,
class Al = allocator<Ch> > class basic_string;
typedef basic_string<char>
string;
24.03.2012
cppNewb.ru 8
Создание строки
пустая строка
пример:
string str();
инициализация строковым литералом
пример:
string str(“misis”);
копирование существующей
пример:
string str(strOld);
24.03.2012
cppNewb.ru 9
Инициализация строки символом
невозможна инициализация символом
пример:
//string(‘a’)
возможна инициализация несколькими экземплярами символа
пример:
string(‘a’, cnt)
24.03.2012
cppNewb.ru 10
Присвоение
assign
operator=
пример:
strFI.assign(str); strFI.assign(“”);
strFI |
= |
str; |
|
strFI |
= |
“test |
text”; |
24.03.2012
cppNewb.ru 11
Размер строк
размер буфера
capacity
длинна строки
(без нуля) length size
резервирование
reserve
изменение длины (дополняется пробелами или усекается)
resize
24.03.2012
cppNewb.ru 12
Преобразование в С-строку
const Ch* c_str() const
записывает символы в массив, дополняя их финальным нулем
const Ch* data() const
записывает символы в массив
копирование из внутреннего буфера во внешний
copy
24.03.2012
cppNewb.ru 13
Присоединение к строке
append
operator+=
пример:
strFI.append(strFamilyName); strFI.append(“ ”);
strFI += strName;
24.03.2012
cppNewb.ru 14
Конкатенация строк
объединение содержимого строк
operator+
пример:
strFI = strFamilyName + string(“ “)
+ strName;
24.03.2012
cppNewb.ru 15
Вставка символов
вставка подстроки
пример:
strFI.insert(posName, name);
вставка с заменой
пример:
st.replace(pos, lnOld, lnNew, name);
вставка начинается перед указанной позицией
24.03.2012
cppNewb.ru 16
Поиск в строке
string::npos – при неудачном поиске
find
заданная группа символов
rfind
с конца, заданная группа символов
24.03.2012
cppNewb.ru 17
Поиск совпадающих
find_first_of
первый символ из заданной группы
find_last_of
последний символ из заданной группы
0224.1023.200192
cppNewb.ru 18
Поиск отличающихся
find_first_not_of
первый символ не совпадающий ни с одним из символов заданной группы
find_last_not_of
последний символ не совпадающий ни с одним из символов заданной группы
24.03.2012
cppNewb.ru 19
Доступ к символу
operator[]
по индексу без контроля выхода за границы
at
по индексу с контролем выхода за границы
при ошибке исключение std::out_of_range
0224.1023.200192
cppNewb.ru 20
Удаление символов
erase – удаление символов
clear – очистка строки
пример:
st.clear();
st.erase(lBeg, string::npos); st.erase(lBeg, lEnd – lBeg + 1);
24.03.2012
cppNewb.ru 21
Проверка на пустоту
empty
пример:
if (0 == str.empty())
// строка не пустая
{
//обработка
}
24.03.2012
cppNewb.ru 22
Потоковый ввод и вывод
вывод
operator<<
ввод
operator>>
24.03.2012
cppNewb.ru 23
Сравнение символов
лексикографическое сравнение
упорядочение в алфавите
упорядочение в кодовой таблице
символы нижнего регистра меньше символов верхнего
24.03.2012
cppNewb.ru 24
Сравнение строк
происходит лексикографическим сравнением символов до первого несовпадения
упорядоченность строк определяется порядком несовпадающих символов
24.03.2012
cppNewb.ru 25
Функции сравнение строк
operator==
operator!=
operator>
operator<
operator>=
operator<=
compare
24.03.2012
cppNewb.ru 26
Потоковый вывод и ввод
вывод – преобразование объектов (типа)
в последовательность символов
ввод – запрос последовательности символов и преобразование ее в объект (типа)
24.03.2012 cppNewb.ru 27
Тип потока
вывода (выходной)
ostream
ввода (входной)
istream
ввода и вывода (двунаправленный)
iostream
24.03.2012 cppNewb.ru 28
Заголовочные файлы
<iostream>
стандартные потоки
<fstream>
файловые потоки
<sstream>
строковые потоки
<iosfwd>
опережающие объявления
<iomanip>
манипуляторы
<streambuf>
буферы
24.03.2012
cppNewb.ru 29
Преимущества стандартной библиотеки ввода/вывода
контроль типов передаваемых данных
использование одного кода для работы с разными потоками (через полиморфизм)
расширяемость
ввод и вывод новых типов
новые классы потоков
24.03.2012 cppNewb.ru 30
Стандартные потоки
глобальные переменные
консольный ввод и вывод
cin и
cout
протоколирование ошибок
cerr
ведение логов
clog
24.03.2012 cppNewb.ru 31
Опережающее объявление
сокращает время компиляции
можно использовать для указателей и ссылок
пример:
// in comp.h class CStack;
…
bool compute(const CStack& stack);
24.03.2012 cppNewb.ru 32
Опережающее объявление потоков
// class ostream; // не сработает
namespace std { template<
-
class
Ch,
class
Tr
=
char_traits<Ch>
>
class basic_ostream;
typedef basic_ostream<char> ostream;
}
24.03.2012 cppNewb.ru 33