close

Вход

Забыли?

вход по аккаунту

код для вставкиСкачать
11.05.2014
Программирование
с использованием C++11
Полевой Дмитрий Валерьевич
к.т.н., доцент КиК
e-mail: [email protected]
1
11.05.2014
Контракты в исходном коде
• д.б. описаны в комментариях
• для проверки assert(условие)
пример:
#include <cassert>
int findBest(const Data* pData)
{
/// если false, завершить работу программы
assert(nullptr != pData);
// основной код
if (nullptr != pData)
…
02.04.2014
2
2
11.05.2014
Исключение – что это такое
• может быть любого типа (как
пользовательского, так и встроенного)
• несет информацию (о проблеме)
– имя класса (типа) исключения
– данные экземпляра исключения
• создается и копируется в точке запуска
02.04.2014
3
3
11.05.2014
Запуск исключений (пример)
if (nullptr == pData)
{
throw NullPointerException();
}
или
if (nullptr == pData)
{
throw ERR_DATA; // не лучший
}
02.04.2014
4
4
11.05.2014
Перехват любых исключений (пример)
catch (const std::bad_alloc& ex)
{
// обработка
}
catch (...)
{
// обработка
}
02.04.2014
5
5
11.05.2014
Перезапуск исключения
• передает исключение далее
• необходим, если текущий обработчик не
может выполнить всю работу
• вызывается throw без аргумента внутри
обработчика исключения
02.04.2014
6
6
11.05.2014
Перезапуск исключения (пример)
catch (const Exeption& ex)
{
// обработка
throw;
}
catch (...)
{
// обработка
throw;
}
02.04.2014
7
7
11.05.2014
Исключение в деструкторе
• деструктор вызывается
– нормальный вызов
– при обработке исключения
• при обработке исключение не должно
покинуть сам деструктор
02.04.2014
8
8
11.05.2014
Неперехваченные исключения
• вызывается terminate()
• terminate() по умолчанию вызывает
abort() из системной библиотеки
02.04.2014
9
9
11.05.2014
Вызов terminate
• неперехваченное исключение
• исключение в деструкторе локального
объекта в процессе раскрутки стека
• исключение в конструкторе
• исключение в деструкторе глобального
• исключение в деструкторе статического
объекта
02.04.2014
10
10
11.05.2014
Спецификация исключений
• использовать nothrow
• не использовать – все остальное
• часть объявления функции
• список исключений, которые могут быть
сгенерированы функцией
пример:
void f1() nothrow;
void f2(int a) throw(Ex1, Ex2);
02.04.2014
11
11
11.05.2014
Стандартные исключения
• образуют иерархию классов
• объявлены в пространстве имен std
• объявлены в заголовочных файлах
– <stdexcept>, <new>, <exception>,
<ios>, <typeinfo>
02.04.2014
12
12
11.05.2014
Стандартные исключения (фрагмент
иерархии)
exception
– logic_error
• length_error – неверная длина
• out_of_range – выход за пределы диапазона
• invalid_argument – неверный аргумент
– runtime_error
• range_error – ошибка диапазона
• overflow_error – переполнение
– bad_alloc
02.04.2014
13
13
11.05.2014
Потоковый ввод и вывод
• вывод
operator<<
• ввод
operator>>
02.04.2014
14
14
14
11.05.2014
Потоковый вывод и ввод
• вывод – преобразование объектов (типа) в
последовательность символов
• ввод – запрос последовательности символов
и преобразование ее в объект (типа)
02.04.2014
15
15
11.05.2014
Тип потока
• вывода (выходной)
– ostream
– ofstream
• ввода (входной)
– istream
– ifstream
• ввода и вывода (двунаправленный)
– iostream
– fstream
02.04.2014
16
16
11.05.2014
Заголовочные файлы
<iostream>
– стандартные потоки
<fstream>
– файловые потоки
<sstream>
– строковые потоки
<iosfwd>
– опережающие
объявления
<iomanip>
– манипуляторы
<streambuf>
– буферы
02.04.2014
17
17
17
11.05.2014
Преимущества стандартной библиотеки
ввода/вывода
• контроль типов передаваемых данных
• использование одного кода для работы с
разными потоками (через полиморфизм)
• расширяемость
– ввод и вывод новых типов
– новые классы потоков
02.04.2014
18
18
11.05.2014
Стандартные потоки
• глобальные переменные
• консольный ввод и вывод
cin и cout
• протоколирование ошибок
cerr
• ведение логов
clog
02.04.2014
19
19
11.05.2014
Опережающее объявление
• сокращает время компиляции
• можно использовать для указателей и
ссылок
пример:
// in comp.h
class Stack;
…
bool compute(const Stack& st);
02.04.2014
20
20
11.05.2014
Опережающее объявление потоков
// class ostream; // не сработает
namespace std {
template<
class Ch,
class Tr = char_traits<Ch> >
class basic_ostream;
typedef basic_ostream<char> ostream;
}
02.04.2014
21
21
11.05.2014
Базовые операции
• открытие (создание)
• operator<<
– запись в поток (поместить данные)
• operator>>
– чтение из потока (извлечь данные)
• проверка состояния
• закрытие (уничтожение)
02.04.2014
22
22
11.05.2014
Типы ввода и вывода
• форматированный
– текстовый
• неформатированный
– двоичный
02.04.2014
23
23
11.05.2014
Формат
•
•
•
•
•
•
•
система счисления (oct, dec, hex)
отступы
заполнители
разделители
формат префиксов и суффиксов
разделителя разрядов
и т.д.
02.04.2014
24
24
11.05.2014
Форматирование
• формат – состояние потока
(флаги форматирования)
• изменение формата
– функции
– манипуляторы
02.04.2014
25
25
11.05.2014
Форматные флаги (примеры)
• ios::showbase
– признак системы счисления (dec, oct или hex)
• ios::showpoint
– десятичная точка и завершающих нулей в
вещественных числах
• ios::uppercase
– верхний регистр букв A-F (hex) и Е (exp)
• ios::showpos
– отображение знака плюс (+) для положительных
величин
02.04.2014
26
26
11.05.2014
Флаги форматирования (функции)
fmtflags flags()
– получить текущие флаги
fmtflags flags(fmtflags flNew)
– установить флаги
fmtflags setf(fmtflags flSet)
fmtflags setf(fmtflags bits,
fmtflags field)
– добавить флаги
fmtflags unsetf(fmtflags flClear)
– снять флаги
02.04.2014
27
27
11.05.2014
Форматное поле
• должен быть установлен только один бит из
группы
• автоматический сброс остальных бит не
происходит
• используйте перегруженную версию setf
02.04.2014
28
28
11.05.2014
Форматные поля
• система счисления целых
ios::basefield
• вид чисел с плавающей точкой
ios::floatfield
• выравнивание внутри поля
ios::adjustfield
02.04.2014
29
29
11.05.2014
Форматные поля (примеры)
• ios::oct
– восьмиричные целые
• ios::dec
– десятичные целые
• ios::hex
– шестнадцатиричные целые
пример:
s.setf(ios::hex, ios::basefield);
02.04.2014
30
30
11.05.2014
Манипулятор
• специальный объект, вызывающий
функцию потока
• стандартные манипуляторы определены в
пространстве имен std
пример:
strm << hex << val << endl;
02.04.2014
31
31
11.05.2014
Цикл работы с форматами
• аналогичен работе с ресурсами
• запомнить текущее состояние
• произвести всю необходимую работу
• восстановить исходное состояние
02.04.2014
32
32
11.05.2014
Синтаксис форматированного ввода и
вывода
• перегруженные операторы двоичного
сдвига
cout << “a=” << a;
означает
operator<<(cout, “a=”).
operator<<(cout , a);
02.04.2014
33
33
11.05.2014
Ввод и вывод
пользовательских типов
ostream& Num::writeTxt(ostream& ostr)
{
ostr << ‘(’ << m_num << ‘)’;
return ostr;
}
ostream& operator<<(ostream& ostr,
const Num& num)
{
return num.writeTxt(ostr);
}
02.04.2014
34
34
11.05.2014
Построчный ввод
• для чтения текстового файла по строкам
используйте функцию getline определенную в
<string>
пример:
while (0 != getline(file, str).fail())
{
//...
}
02.04.2014
35
35
11.05.2014
Обработка ошибок
ввода и вывода
• существует состояние потока
• текущее состояние зависит от успешности
предыдущих операций с потоком
• возможность реализации операции с
потоком зависит от текущего состояния
02.04.2014
36
36
11.05.2014
Состояние потока (флаги)
• ios::badbit
– фатальная ошибка, поток использовать нельзя
• ios::eofbit
– обнаружен конец входных данных (физически
достигнут конец файла, пользователь закончил
консольный ввод нажатием Ctrl+Z или Ctr+D)
02.04.2014
37
37
11.05.2014
Состояние потока (флаги)
• ios::failbit
– операция завершилась неудачей (нарушен
формат или обнаружен конец данных)
• ios::goodbit
– ошибок нет, конец данных не обнаружен
02.04.2014
38
38
11.05.2014
Проверка состояния потока
• good()
– goodbit
• eof()
– eofbit или badbit
• fail()
– failbit или badbit
• bad()
– badbit
02.04.2014
39
39
11.05.2014
Установка состояния потока
• clear(iostate _State = goodbit)
– сбросить все флаги и установить заданные
• setstate(iostate _State)
– установить флаги
пример:
cout.clear(ios::failbit);
cout.setstate(ios::failbit |
~ios::goodbit);
02.04.2014
40
40
11.05.2014
Исключения в потоках
• поток может генерировать исключения
std::ios_base::failure для
заданных флагов состоянии
• exceptions
– устанавливает статусы
пример:
stmFile.exceptions(ios::badbit);
02.04.2014
41
41
11.05.2014
Неформатированный ввод
• чтение отдельного символа или
последовательности из потока
• get
– прочитать из потока отдельный символ
• read
– прочитать из потока последовательность
02.04.2014
42
42
42
11.05.2014
Неформатированный вывод
• вывод отдельного символа или
последовательности в поток
• put
– записать в поток отдельный символ
• write
– записать в поток последовательность
02.04.2014
43
43
43
11.05.2014
Файловые потоки
• прикрепляются к объектам файловой
системы
• ofstream
• ifstream
• fstream
02.04.2014
44
44
11.05.2014
Цикл работы с файлом
• конструктор
• open
• close
• деструктор
пример:
ifstream inData(path);
02.04.2014
45
45
11.05.2014
Режим открытия файла (флаги)
• ios::in
– чтение (без усечения)
• ios::out
– запись (без усечения)
• ios::app
– дописывание
02.04.2014
46
46
11.05.2014
Режим открытия файла (флаги)
• ios::ate
– существующий файл (чтение, запись в конец)
• ios::trunc
– существующий файл (запись с начала)
• ios::binary
– двоичный режим
02.04.2014
47
47
11.05.2014
Файловый поток (пример)
fstream dataFile(path.c_str()
, ios::ate);
dataFile << obj1;
dataFile << obj2;
dataFile.close();
…
dataFile.open(path.c_str(), ios::in);
…
02.04.2014
48
48
11.05.2014
Позиционирование в потоке
• tellp
– получить позицию записи
• tellg
– получить позицию чтения
• seekp
– установить позицию записи
• seekg
– установить позицию чтения
02.04.2014
49
49
11.05.2014
Относительное позиционирование
• ios::beg
– от начала
• ios:cur
– от текущей позиции
• ios::end
– от конца
02.04.2014
50
50
11.05.2014
Буферизация
• для записи и чтения используется буфер,
который освобождается при переполнении
или по требованию
пример:
strm.flush();
strm << obj << endl;
02.04.2014
51
51
11.05.2014
Строковые потоки
• прикрепляются к строковым объектам
• ostringstream
• istringstream
• stringstream
• str()
– получение буфера std::string
02.04.2014
52
52
11.05.2014
Строковый поток (пример)
ostringstream strm(strBuf);
strm << “Formated text\n”;
...
istringstream strm(strBuf);
strm >> obj;
...
02.04.2014
53
53
11.05.2014
Этапы сборки программы
• препроцессор
• компилятор
• оптимизатор
• компоновщик
02.04.2014
54
54
11.05.2014
Препроцессор
• директивы включения
#include
• макроопределения
#define, #undef
• директивы условной компиляции
#ifndef, #else, #endif
• #, ##
02.04.2014
55
55
11.05.2014
Единица компиляции
• исходный файл →
препроцессор →
единица трансляции
• компилируется в собственный объектный
файл
02.04.2014
56
56
11.05.2014
Использование библиотеки
• включить заголовок
• использовать
– объявления
– переменные
– функции
• скомпоновать библиотеку
02.04.2014
57
57
11.05.2014
Реализация модульности в С++
• функция – единица логики исполнения
• модуль (.cpp) – единица организации
исходного кода
• общие объявления выносятся в заголовок
02.04.2014
58
58
11.05.2014
Заголовочные файлы
• стандартные
#include <стандартная_библиотека>
• пользовательские
#include “включаемая_компонента”
02.04.2014
59
59
11.05.2014
Стандартная библиотека
• новые имена для библиотек Си
<stdio.h> → <cstdio>
• новые имена для библиотек С++
<iostream.h> → <iostream>
• не все библиотеки стандартные
<conio.h>
02.04.2014
60
60
11.05.2014
Порядок поиска
• определяется реализацией
• может быть причиной “сложных” ошибок
• переменные окружения
• опции компилятора
• текущая папка
02.04.2014
61
61
11.05.2014
Стражи включения
• предотвращение повторного определения
пример:
// In file defs.h
#ifndef DEFS_H_20080910
#define DEFS_H_20080910
.
.
.
#endif // DEFS_H_20080910
02.04.2014
62
62
11.05.2014
.h может содержать
• директивы включения, макроопределения и
директивы условной компиляции
• именованные пространства имен
• объявления имен типов, функций и данных
• определения типов
• определения встроенных функций объявления
и определения шаблонов
• определения констант
• перечисления
02.04.2014
63
63
11.05.2014
.h не должен содержать
•
•
•
•
определения обычных функций
определения данных
определения агрегатов
неименованные пространства имен
02.04.2014
64
64
11.05.2014
Использование заголовочных файлов в
проектах
• включайте все необходимое
• минимизируйте число включений
• включайте заголовочные файлы в порядке
увеличения общности
– локальные
– общеупотребительные
– стандартные
• разделяйте группы заголовков
02.04.2014
65
65
11.05.2014
Бинарный интерфейс компонент
• соглашение о параметрах вызова
• Си-соглашение
extern “C”
{
// source code
}
02.04.2014
66
66
1/--страниц
Пожаловаться на содержимое документа