SlideShare a Scribd company logo
Углубленное
программирование
на языке C++
Алексей Петров
Лекция №5. Шаблоны классов и
методов. Обработка исключительных
ситуаций. Обобщенное и безопасное
программирование
1. Шаблоны классов и методов.
Обобщенное программирование.
Параметры шаблонов. Специализация,
конкретизация и перегрузка
шаблонов.
2. Рекурсивное определение шаблонов.
Основы метапрограммирования.
Идиома SFINAE.
3. Понятие, поддержка и технология
обработки исключительных ситуаций.
4. Безопасное программирование.
Нейтральность кода. Критерии
безопасности и нейтральности
классов и методов.
5. Безопасность конструкторов и
деструкторов.
6. Исключения в стандартной
библиотеке.
2
Шаблоны классов
Шаблон класса — элемент языка, позволяющий параметризовать
типы и значения, используемые для автоматического создания
(конкретизации) классов по обобщенному описанию (шаблону).
Использование шаблонов классов — шаг на пути к парадигме
обобщенного программирования.
Различают описания и определения шаблонов классов. В отличие
от «обычного» класса описания и определения шаблона содержат
списки параметров шаблона, среди которых выделяются
параметры-типы и параметры-константы.

Параметры-типы шаблона класса представляют некоторый тип
данных, параметры-константы — некоторое константное
(вычисляемое при компиляции) выражение.
3
Шаблоны классов: пример

template <class T, class U, int size>
// эквивалентно:
// template <typename T, typename U, int size>
class Test
{
public:
Test() : _size(size) // …
private:
T
_prm_1;
U*
_prm_2;
int
_size;
};

4
Параметры шаблонов классов
Параметры шаблона класса не могут быть одноименными члену
соответствующего шаблона.
Имя параметра шаблона может присутствовать в списке
параметров лишь один раз.
Имена параметров в объявлении (если есть) и определении
шаблона могут различаться.

Параметры могут иметь значения по умолчанию.
Константные выражения с одинаковыми значениями трактуются
как эквивалентные параметры-константы шаблона класса.

5
Конкретизация шаблонов классов
Конкретизация шаблона — это автоматическая генерация
исходного кода конкретного класса в соответствии с заданным
программистом определением шаблона класса.
Конкретизированный шаблон может использоваться везде, где
допустимо использование «обычного» класса (включая описания и
определения шаблонов функций), а экземпляры автоматически
сгенерированного класса — везде, где допустимы «обычные»
объекты.
Шаблон класса конкретизируется тогда, когда впервые требуется
определение автоматически генерируемого класса.
Test<int, double, 10> t_id10;
6
Методы шаблонов классов
Методы шаблонов классов также являются шаблонами и
конкретизируются в точке вызова или взятия адреса. При этом
конкретизируемый метод относится к тому классу, через объект
которого вызывается.
template <class T, class U, int size>
Test<T, U, size>::~Test()
{
/* … */
}

7
Дружественные объекты
в шаблонах классов
Дружественными по отношению к шаблонам классов могут быть:
 дружественная функция или дружественный класс (не шаблон);
 связанный шаблон дружественной функции, взаимно однозначно
соответствующий шаблону класса (с общим для обоих шаблонов
списком параметров);
 связанный шаблон дружественного класса, взаимно однозначно
соответствующий шаблону класса (с общим для обоих шаблонов
списком параметров);
 несвязанный шаблон дружественной функции, соответствующий всем
возможным конкретизациям шаблона класса (с раздельными списками
параметров);
 несвязанный шаблон дружественного класса, соответствующий всем
возможным конкретизациям шаблона класса (с раздельными списками
параметров).
8
Статические члены шаблонов классов
Шаблоны классов могут содержать статические члены данных,
собственный набор которых имеет каждый конкретизированный
согласно шаблону класс.
template <class T, class U, int size>
class Test
{
/* … */
private:
static Test *_head;
};
template <class T, class U, int size>
Test<T, U, size> *Test<T, U, size>::_head = NULL;

9
Специализация шаблонов классов.
Специализация члена класса: пример
Шаблоны классов в языке C++ допускают частичную (полную)
специализацию, при которой отдельные (все) параметры шаблона
заменяются конкретными именами типов или значениями
константных выражений.
// специализация члена класса
template<>
void Test<int, double, 10>::foo()
{
/* … */
}

10
Полная и частичная
специализация класса: пример
// полная специализация класса
template<> class Test<int, double, 100>
{
public:
Test<int, double, 100>();
~Test<int, double, 100>();
void foo(); /* … */
};
// частичная специализация класса
template <class T, class U> class Test<T, U, 100>
{
public:
Test();
~Test (); /* … */
};
11
Рекурсивное определение шаблонов
как пример метапрограммирования
template <unsigned long N>
struct binary {
static unsigned const value
= binary<N / 10>::value << 1 | N % 10;
};
template <>
struct binary<0> {
static unsigned const value = 0;
};
unsigned const one
= binary<1>::value;
unsigned const three = binary<11>::value;
unsigned const five = binary<101>::value;
12
Идиома SFINAE
Идиома SFINAE (англ. Substitution Failure Is Not An Error —
«неудача при подстановке не есть ошибка») является одной из
идиом обобщенного программирования и означает ситуацию, при
которой невозможность подстановки параметров шаблона не
влечет аварийного завершения компиляции.
Ситуация, соответствующая идиоме SFINAE, возникает при
разрешении перегруженных вызовов, в которых среди
множества функций-кандидатов найдется хотя бы одна,
полученная в результате конкретизации шаблона.
В соответствии с логикой идиомы SFINAE, неудача при
подстановке параметров в соответствующий шаблон ведет лишь к
удалению данного шаблона из множества кандидатов и не имеет
катастрофических последствий для компиляции.
13
Идиома SFINAE и интроспекция
времени компиляции: пример
template <typename T> struct has_typedef_foobar {
typedef char yes[1]; // sizeof(yes) == 1
typedef char no [2]; // sizeof(no) == 2
template <typename C>
static yes& test(typename C::foobar*);
template <typename> static no& test(...);
static const bool value =
sizeof(test<T>(0)) == sizeof(yes);
};
struct foo { typedef float foobar; };
// has_typedef_foobar<int>::value == false
// has_typedef_foobar<foo>::value == true
14
Интроспекция времени компиляции в
библиотеке boost::type_traits
Цель. Через набор узкоспециализированных, имеющих единый
дизайн вспомогательных классов упростить работу с атомарными
характеристиками типов (англ. type traits) в системе типов языка
C++.
Библиотека.
#include <boost/type_traits.hpp>

Реализация. Библиотека характеристик типов содержит
значительное количество внутренне весьма однородных классов
(структур), многие из которых открыто наследуют типам true_type
или false_type (см. далее).

15
Характеристики типов:
структуры is_void, is_pointer
// структура is_void
template <typename T>
struct is_void : public false_type{};
template <>
struct is_void<void> : public true_type{};

// структура is_pointer
template <typename T>
struct is_pointer: public false_type{};
template <typename T>
struct is_pointer<T*> : public true_type{};

16
Характеристики типов:
структуры true_type и false_type
template <class T, T val>
struct integral_constant
{
typedef integral_constant<T, val>
typedef T
static const T
};

type;
value_type;
value = val;

typedef integral_constant<bool, true> true_type;
typedef integral_constant<bool, false> false_type;

17
Характеристики типов:
иерархии классов
Проиллюстрированный подход позволяет строить параллельные
иерархии классов, обладающих (потомки true_type) и не
обладающих (потомки false_type) искомыми свойствами.
Принадлежность к соответствующей иерархии является
различительным признаком.

18
Характеристики типов:
структура remove_extent
Установить тип элемента массива позволяет структура
remove_extent.
template <typename T>
struct remove_extent
{
typedef T type;
};
template <typename T, std::size_t N>
struct remove_extent<T[N]>
{
typedef T type;
};
19
Характеристики типов:
оптимизация функций (общий случай)
Имея эффективную реализацию функции для типов с
конкретными характеристиками, нетрудно должным образом
специализировать ее шаблон. Например, для std::copy имеем:
template<typename I1, typename I2, bool b>
I2 copy_imp(I1 first, I1 last, I2 out,
const boost::integral_constant<bool, b>&)
{
while(first != last)
{
*out = *first;
++out; ++first;
}
return out;
}
20
Характеристики типов: оптимизация
функций(оптимизированная реализация)
template<typename T>
T* copy_imp(const T* first, const T* last, T* out,
const boost::true_type&)
{
memmove(out, first, (last - first) * sizeof(T));
return out + (last - first);
}

21
Характеристики типов: оптимизация
функций (вызывающая функция)
template<typename I1, typename I2>
inline I2 copy(I1 first, I1 last, I2 out)
{
typedef typename std::iterator_traits<I1>::
value_type value_type;
return copy_imp(first, last, out,
boost::has_trivial_assign<value_type>());
}

22
Характеристики типов: исключение
деструкторов (вызов ~T() обязателен)
Столь же нетрудно избежать накладных расходов на вызов
деструкторов в случаях, когда этого допускает структура
соответствующих классов.
template<class T>
void do_destroy_array(T* first, T* last,
const boost::false_type&)
{
while(first != last)
{
first->~T();
++first;
}
}
23
Характеристики типов: исключение
деструкторов (вызов ~T() факультативен)
template<class T>
inline void do_destroy_array(T* first, T* last,
const boost::true_type&) { }
// вызывающая функция
template<class T>
inline void destroy_array(T* p1, T* p2)
{
do_destroy_array(p1, p2,
boost::has_trivial_destructor<T>());
}

24
Понятие исключительной
ситуации (1 / 2)
Естественный порядок функционирование программ нарушают
возникающие нештатные ситуации, в большинстве случаев
связанные с ошибками времени выполнения (иногда — с
необходимостью внезапно переключить контекст приложения).
В языке C++ такие нештатные ситуации называются
исключительными (иначе говоря — исключениями).
Примерами исключительных ситуаций являются:
 нехватка оперативной памяти;
 попытка доступа к элементу коллекции по некорректному индексу;
 попытка недопустимого преобразования динамических типов и пр.

25
Понятие исключительной
ситуации (2 / 2)
Архитектурной особенностью механизма обработки
исключительных ситуаций в языке C++ является
принципиальная независимость (несвязность) фрагментов
программы, где исключение возбуждается и где оно
обрабатывается.
Обработка исключительных ситуаций носит невозвратный
характер.

26
Объекты-исключения.
Оператор throw
Носителями информации об аномальной ситуации (исключении) в
C++ являются объекты заранее выбранных на эту роль типов
(пользовательских или — Sic! — базовых, например, char*). Такие
объекты называются объектами-исключениями.
Жизненный цикл объектов-исключений начинается с возбуждения
исключительной ситуации посредством оператора throw:
throw "Illegal cast";
/* … */
throw IllegalCast();
/* … */
enum EPrgStatus
{psOK, psBadIndex,
throw psIllegalCast;

// char *
// class IllegalCast

psIllegalCast};
// enum EPrgStatus
27
Защищенные блоки.
Операторы try, catch
Небезопасные с точки зрения исключений фрагменты кода могут
инкапсулироваться в защищенный (контролируемый) блок, за
которым следует один или несколько связанных с ним блоковобработчиков исключений. Защищенные блоки кода начинаются
ключевым словом try, блоки-обработчики — словом catch.
При возбуждении исключения в одном из операторов
защищенного блока все следующие за ним операторы блока
автоматически пропускаются, а управление передается
ближайшему соответствующему блоку-обработчику исключения.
Если такой блок не найден, управление берет на себя стандартная
функция terminate(). Иначе обработку исключительной ситуации
берет на себя первый подходящий для этого блок в порядке их
указания в исходном коде.
28
Защищенные блоки.
Операторы try, catch: пример
void foo()
{
/* … */
throw "Illegal id";
/* … */
}

// не выполняется

void bar()
{
try {

foo();
/* … */

// не выполняется

}
catch(char *s) {
std::cout << s << std::endl;
}
}

29
Функциональные защищенные блоки
Как защищенный блок может быть оформлена не только часть
функции, но и функция целиком (в том числе main() и
конструкторы классов). В таком случае защищенный блок
называют функциональным. Например:
void foobar()
try {
/* … */
}
catch( /* … */ ) { /* … */ }
catch( /* … */ ) { /* … */ }
catch( /* … */ ) { /* … */ }

30
Варианты описания исключений
Описание исключения в блоке-обработчике может содержать имя
типа, объекта, ссылки или указателя на объект.
catch(IllegalCast) { /* … */ }
catch(IllegalCast ic)

{ /* … */ }

catch(IllegalCast &ric)

{ /* … */ }

catch(IllegalCast *pic)

{ /* … */ }

31
Раскрутка стека
и уничтожение объектов
Поиск catch-блока, пригодного для обработки возбужденного
исключения, приводит к раскрутке стека — последовательному
выходу из составных операторов и определений функций.
В ходе раскрутки стека происходит уничтожение локальных
объектов, определенных в покидаемых областях видимости. При
этом деструкторы локальных объектов вызываются штатным
образом (строгая гарантия C++).
Исключение, для обработки которого не найден catch-блок,
инициирует запуск функции terminate(), передающей управление
функции abort(), которая аварийно завершает программу.

32
Повторное возбуждение исключения
и универсальный блок-обработчик
Оператор throw без параметров помещается (только) в catch-блок
и повторно возбуждает обрабатываемое исключение. При этом его
копия не создается:
throw;

Особая форма блока-обработчика исключений осуществляет
перехват любых исключений:
catch(...)

{ /* … */ };

33
Безопасность ПО
как показатель качества
Безопасность — один из показателей качества ПО, оцениваемый
путем статического анализа состава и взаимосвязей
используемых компонентов, исходного кода и схемы БД.
Для обеспечения «структурной безопасности» исходного кода
необходимо соблюдение стандартов разработки архитектуры и
стандартов кодирования.
Примечание: См. модели качества ПО, описанные в стандартах:
 ГОСТ Р ИСО/МЭК 9126-93. Информационная технология. Оценка
программной продукции. Характеристики качества и руководства по их
применению;
 ISO/IEC 9126:2001. Software Engineering — Product Quality;
 ISO/IEC 25010:2011. Systems and Software Engineering — Systems and
software Quality Requirements and Evaluation (SQuaRE) — System and
software quality models.
34
Стандарты кодирования —
за «безопасный код»
Структурная безопасность исходного кода ПО требует соблюдения
определенных техник кодирования, одной из которых является
систематическая обработка ошибок и исключительных ситуаций
на всех уровнях архитектуры (уровень представления, уровень
бизнес-логики, уровень (базы) данных).
Одним из элементов обработки ошибок и исключений является
спецификация (ограничение) типов исключений, которые могут
порождать структурные элементы кода.

35
Безопасность классов и методов
Функция C++ безопасна, если она не возбуждает никаких
исключений или все возбужденные внутри нее исключения
обрабатываются в ее теле.
Класс C++ безопасен, если безопасны все его методы.
В свою очередь, небезопасные функции могут специфицировать
исключения, возбуждением которых (и только их!) способно
завершиться исполнение таких функций. Обнаруженное при
исполнении нарушение гарантии влечет за собой вызов функции
unexpected(), по умолчанию вызывающей terminate().

Виртуальные функции в производных классах могут повторять
спецификации исключений функций в базовых классов или
накладывать более строгие ограничения.
36
Безопасность
классов и методов: пример
// описания функций
int foo(int &i) throw();
bool bar(char *pc = 0) throw(IllegalCast);
void foobar() throw(IllegalCast, BadIndex);
// определения функции
int foo(int &i) throw()
{
/* … */}

bool bar(char *pc = 0) throw(IllegalCast)
{
/* … */}
void foobar() throw(IllegalCast, BadIndex)
{
/* … */}

37
Безопасность конструкторов
Конструкторы, как и другие методы классов, могут возбуждать
исключения.
Для обработки всех исключений, возникших при исполнении
конструктора, его тело и список инициализации должны быть
совместно помещены в функциональный защищенный блок.
Beta::Beta(int value)
try
: Alpha(foo(value))
{
// тело конструктора
/* … */
}
catch(...) { /* … */ }
38
Безопасность деструкторов
Деструкторы классов не должны возбуждать исключения. Одной
из причин этого является необходимость корректного
освобождения ресурсов, занятых массивами и коллекциями
объектов:
 если вызываемая в деструкторе функция может возбудить исключение,
деструктор должен перехватить и обработать его (возможно, прервав
программу);

 если возможность реакции на исключение необходима клиентам класса
во время некоторой операции, в его открытом интерфейса должна быть
функция (не деструктор!), которая такую операцию выполняет.

В общем случае деструктор класса может специфицироваться как
throw():
~Alpha() throw();
39
Безопасность или нейтральность кода?
От безопасности программного кода важно отличать
нейтральность, под которой, согласно терминологии Г. Саттера
(Herb Sutter), следует понимать способность методов класса
прозрачно «пропускать сквозь себя» объекты-исключения,
полученные ими на обработку, но не предназначенные для них.
Нейтральный метод:
 может обрабатывать исключения;
 должен ретранслировать полученные им исключения методуобработчику в неизменном виде и сохранять свою работоспособность
при любых обстоятельствах.

40
Пользовательские и стандартные
классы исключительных ситуаций
Для передачи из точки возбуждения исключения в точку его
обработки сведений об условиях возникновения аномалии
программист может определять и использовать собственные
классы исключительных ситуаций.
Такие классы могут быть сколь угодно простыми (включая
пустые) или сложными (содержащими члены данных,
конструкторы, деструкторы и интерфейсные методы).
Стандартная библиотека языка C++ содержит собственную
иерархию классов исключений, являющихся прямыми или
косвенными потомками базового класса exception. Потомки класса
exception условно представляют две категории ошибок:
логические ошибки и ошибки времени исполнения.
41
Класс std::exception

namespace std {
class exception {
public:
exception() throw();
exception( const exception & ) throw();
exception& operator=(
const exception & ) throw();

virtual ~exception() throw();
virtual const char* what() const throw();
};
}

42
Стандартные классы ―
логические ошибки
В число классов категории «логические ошибки» входят базовый
промежуточный класс logic_error, а также производные от него
специализированные классы:





invalid_argument
out_of_range
length_error
domain_error

—
—
—
—

ошибка «неверный аргумент»;
ошибка «вне диапазона»;
ошибка «неверная длина»;
ошибка «вне допустимой области».

43
Стандартные классы ―
ошибки времени исполнения
В число классов категории «ошибки времени исполнения» входят
базовый промежуточный класс runtime_error, а также
производные от него специализированные классы:
 range_error

— ошибка диапазона;

 overflow_error

— переполнение;

 underflow_error — потеря значимости.

44
Прочие классы исключений стандартной
библиотеки
Также производными от exception являются классы bad_alloc и
bad_cast, сигнализирующие об ошибках при выделении
динамической памяти и неудаче при выполнении «ссылочного»
варианта операции dynamic_cast, соответственно.

45
Классы исключений стандартной
библиотеки: «вид сверху»

46
Спасибо за внимание
Алексей Петров

More Related Content

What's hot

C++ весна 2014 лекция 2
C++ весна 2014 лекция 2C++ весна 2014 лекция 2
C++ весна 2014 лекция 2Technopark
 
C++ осень 2012 лекция 6
C++ осень 2012 лекция 6C++ осень 2012 лекция 6
C++ осень 2012 лекция 6Technopark
 
C# Desktop. Занятие 01.
C# Desktop. Занятие 01.C# Desktop. Занятие 01.
C# Desktop. Занятие 01.
Igor Shkulipa
 
C++ осень 2013 лекция 1
C++ осень 2013 лекция 1C++ осень 2013 лекция 1
C++ осень 2013 лекция 1Technopark
 
C# Desktop. Занятие 02.
C# Desktop. Занятие 02.C# Desktop. Занятие 02.
C# Desktop. Занятие 02.
Igor Shkulipa
 
C# Desktop. Занятие 04.
C# Desktop. Занятие 04.C# Desktop. Занятие 04.
C# Desktop. Занятие 04.
Igor Shkulipa
 
Лекция 6_принципы ООП : инкапсуляция, наследование
Лекция 6_принципы ООП : инкапсуляция, наследованиеЛекция 6_принципы ООП : инкапсуляция, наследование
Лекция 6_принципы ООП : инкапсуляция, наследование
metaform
 
Классы и объекты С#
Классы и объекты С#Классы и объекты С#
C++ Базовый. Занятие 04.
C++ Базовый. Занятие 04.C++ Базовый. Занятие 04.
C++ Базовый. Занятие 04.
Igor Shkulipa
 
Классы и объекты в Java
Классы и объекты в JavaКлассы и объекты в Java
Классы и объекты в Javametaform
 
Наследование и полиморфизм
Наследование и полиморфизмНаследование и полиморфизм
Наследование и полиморфизм
Ural Federal University named after First President of Russia B.N. Yeltsin
 
Java Core. Lecture# 2. Classes & objects.
Java Core. Lecture# 2. Classes & objects.Java Core. Lecture# 2. Classes & objects.
Java Core. Lecture# 2. Classes & objects.
Anton Moiseenko
 
Классы и объекты в Java
Классы и объекты в JavaКлассы и объекты в Java
Классы и объекты в Javametaform
 
C++ Базовый. Занятие 02.
C++ Базовый. Занятие 02.C++ Базовый. Занятие 02.
C++ Базовый. Занятие 02.
Igor Shkulipa
 
Java Core. Lecture# 3. Part# 1. Abstract classes.
Java Core. Lecture# 3. Part# 1. Abstract classes.Java Core. Lecture# 3. Part# 1. Abstract classes.
Java Core. Lecture# 3. Part# 1. Abstract classes.
Anton Moiseenko
 
C++ Базовый. Занятие 11.
C++ Базовый. Занятие 11.C++ Базовый. Занятие 11.
C++ Базовый. Занятие 11.
Igor Shkulipa
 
Java Core. Lecture# 3. Part# 3. Multithreading.
Java Core. Lecture# 3. Part# 3. Multithreading.Java Core. Lecture# 3. Part# 3. Multithreading.
Java Core. Lecture# 3. Part# 3. Multithreading.
Anton Moiseenko
 
Глава 2: Среда разработки NetBeans
Глава 2: Среда разработки NetBeansГлава 2: Среда разработки NetBeans
Глава 2: Среда разработки NetBeansmetaform
 
презентация кметодическим указаниям к лаб. работам
презентация кметодическим указаниям к лаб. работампрезентация кметодическим указаниям к лаб. работам
презентация кметодическим указаниям к лаб. работамstudent_kai
 

What's hot (20)

C++ весна 2014 лекция 2
C++ весна 2014 лекция 2C++ весна 2014 лекция 2
C++ весна 2014 лекция 2
 
C++ осень 2012 лекция 6
C++ осень 2012 лекция 6C++ осень 2012 лекция 6
C++ осень 2012 лекция 6
 
C# Desktop. Занятие 01.
C# Desktop. Занятие 01.C# Desktop. Занятие 01.
C# Desktop. Занятие 01.
 
C++ осень 2013 лекция 1
C++ осень 2013 лекция 1C++ осень 2013 лекция 1
C++ осень 2013 лекция 1
 
C# Desktop. Занятие 02.
C# Desktop. Занятие 02.C# Desktop. Занятие 02.
C# Desktop. Занятие 02.
 
C# Desktop. Занятие 04.
C# Desktop. Занятие 04.C# Desktop. Занятие 04.
C# Desktop. Занятие 04.
 
Лекция 6_принципы ООП : инкапсуляция, наследование
Лекция 6_принципы ООП : инкапсуляция, наследованиеЛекция 6_принципы ООП : инкапсуляция, наследование
Лекция 6_принципы ООП : инкапсуляция, наследование
 
Классы и объекты С#
Классы и объекты С#Классы и объекты С#
Классы и объекты С#
 
C++ Базовый. Занятие 04.
C++ Базовый. Занятие 04.C++ Базовый. Занятие 04.
C++ Базовый. Занятие 04.
 
Классы и объекты в Java
Классы и объекты в JavaКлассы и объекты в Java
Классы и объекты в Java
 
Наследование и полиморфизм
Наследование и полиморфизмНаследование и полиморфизм
Наследование и полиморфизм
 
Java Core. Lecture# 2. Classes & objects.
Java Core. Lecture# 2. Classes & objects.Java Core. Lecture# 2. Classes & objects.
Java Core. Lecture# 2. Classes & objects.
 
Классы и объекты в Java
Классы и объекты в JavaКлассы и объекты в Java
Классы и объекты в Java
 
C++ Базовый. Занятие 02.
C++ Базовый. Занятие 02.C++ Базовый. Занятие 02.
C++ Базовый. Занятие 02.
 
Java Core. Lecture# 3. Part# 1. Abstract classes.
Java Core. Lecture# 3. Part# 1. Abstract classes.Java Core. Lecture# 3. Part# 1. Abstract classes.
Java Core. Lecture# 3. Part# 1. Abstract classes.
 
C++ Базовый. Занятие 11.
C++ Базовый. Занятие 11.C++ Базовый. Занятие 11.
C++ Базовый. Занятие 11.
 
Java Core. Lecture# 3. Part# 3. Multithreading.
Java Core. Lecture# 3. Part# 3. Multithreading.Java Core. Lecture# 3. Part# 3. Multithreading.
Java Core. Lecture# 3. Part# 3. Multithreading.
 
лек5 6
лек5 6лек5 6
лек5 6
 
Глава 2: Среда разработки NetBeans
Глава 2: Среда разработки NetBeansГлава 2: Среда разработки NetBeans
Глава 2: Среда разработки NetBeans
 
презентация кметодическим указаниям к лаб. работам
презентация кметодическим указаниям к лаб. работампрезентация кметодическим указаниям к лаб. работам
презентация кметодическим указаниям к лаб. работам
 

Viewers also liked

Безопасность лекция 1 весна 2014
Безопасность лекция 1 весна 2014Безопасность лекция 1 весна 2014
Безопасность лекция 1 весна 2014Technopark
 
Управление продуктом осень 2013 лекция 3
Управление продуктом осень 2013 лекция 3Управление продуктом осень 2013 лекция 3
Управление продуктом осень 2013 лекция 3Technopark
 
Разработка веб-сервисов осень 2013 лекция 6
Разработка веб-сервисов осень 2013 лекция 6Разработка веб-сервисов осень 2013 лекция 6
Разработка веб-сервисов осень 2013 лекция 6Technopark
 
Java весна 2014 лекция 5
Java весна 2014 лекция 5Java весна 2014 лекция 5
Java весна 2014 лекция 5Technopark
 
Проектирование интерфейсов весна 2014 занятие 7
Проектирование интерфейсов весна 2014 занятие 7Проектирование интерфейсов весна 2014 занятие 7
Проектирование интерфейсов весна 2014 занятие 7Technopark
 
Android осень 2013 лекция 5
Android осень 2013 лекция 5Android осень 2013 лекция 5
Android осень 2013 лекция 5Technopark
 
Безопасность интернет-приложений осень 2013 лекция 5
Безопасность интернет-приложений осень 2013 лекция 5Безопасность интернет-приложений осень 2013 лекция 5
Безопасность интернет-приложений осень 2013 лекция 5Technopark
 
Алгоритмы и структуры данных осень 2013 лекция 2
Алгоритмы и структуры данных осень 2013 лекция 2Алгоритмы и структуры данных осень 2013 лекция 2
Алгоритмы и структуры данных осень 2013 лекция 2Technopark
 
Управление продуктом осень 2013 лекция 5
Управление продуктом осень 2013 лекция 5Управление продуктом осень 2013 лекция 5
Управление продуктом осень 2013 лекция 5Technopark
 
Лекция №11 "Основы нейронных сетей"
Лекция №11 "Основы нейронных сетей" Лекция №11 "Основы нейронных сетей"
Лекция №11 "Основы нейронных сетей"
Technosphere1
 
Алгоритмы и структуры данных осень 2013 лекция 8
Алгоритмы и структуры данных осень 2013 лекция 8Алгоритмы и структуры данных осень 2013 лекция 8
Алгоритмы и структуры данных осень 2013 лекция 8Technopark
 
Web осень 2013 лекция 8
Web осень 2013 лекция 8Web осень 2013 лекция 8
Web осень 2013 лекция 8Technopark
 
Web осень 2013 лекция 9
Web осень 2013 лекция 9Web осень 2013 лекция 9
Web осень 2013 лекция 9Technopark
 
Лекция №9 "Алгоритмические композиции. Начало"
Лекция №9 "Алгоритмические композиции. Начало"Лекция №9 "Алгоритмические композиции. Начало"
Лекция №9 "Алгоритмические композиции. Начало"
Technosphere1
 
Лекция №12 "Ограниченная машина Больцмана"
Лекция №12 "Ограниченная машина Больцмана" Лекция №12 "Ограниченная машина Больцмана"
Лекция №12 "Ограниченная машина Больцмана"
Technosphere1
 
Лекция №10 "Алгоритмические композиции. Завершение"
Лекция №10 "Алгоритмические композиции. Завершение" Лекция №10 "Алгоритмические композиции. Завершение"
Лекция №10 "Алгоритмические композиции. Завершение"
Technosphere1
 
Лекция №7 "Машина опорных векторов"
Лекция №7 "Машина опорных векторов" Лекция №7 "Машина опорных векторов"
Лекция №7 "Машина опорных векторов"
Technosphere1
 
СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"
СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"
СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"
Technopark
 
Web весна 2013 лекция 10
Web весна 2013 лекция 10Web весна 2013 лекция 10
Web весна 2013 лекция 10Technopark
 
Web весна 2013 лекция 1
Web весна 2013 лекция 1Web весна 2013 лекция 1
Web весна 2013 лекция 1Technopark
 

Viewers also liked (20)

Безопасность лекция 1 весна 2014
Безопасность лекция 1 весна 2014Безопасность лекция 1 весна 2014
Безопасность лекция 1 весна 2014
 
Управление продуктом осень 2013 лекция 3
Управление продуктом осень 2013 лекция 3Управление продуктом осень 2013 лекция 3
Управление продуктом осень 2013 лекция 3
 
Разработка веб-сервисов осень 2013 лекция 6
Разработка веб-сервисов осень 2013 лекция 6Разработка веб-сервисов осень 2013 лекция 6
Разработка веб-сервисов осень 2013 лекция 6
 
Java весна 2014 лекция 5
Java весна 2014 лекция 5Java весна 2014 лекция 5
Java весна 2014 лекция 5
 
Проектирование интерфейсов весна 2014 занятие 7
Проектирование интерфейсов весна 2014 занятие 7Проектирование интерфейсов весна 2014 занятие 7
Проектирование интерфейсов весна 2014 занятие 7
 
Android осень 2013 лекция 5
Android осень 2013 лекция 5Android осень 2013 лекция 5
Android осень 2013 лекция 5
 
Безопасность интернет-приложений осень 2013 лекция 5
Безопасность интернет-приложений осень 2013 лекция 5Безопасность интернет-приложений осень 2013 лекция 5
Безопасность интернет-приложений осень 2013 лекция 5
 
Алгоритмы и структуры данных осень 2013 лекция 2
Алгоритмы и структуры данных осень 2013 лекция 2Алгоритмы и структуры данных осень 2013 лекция 2
Алгоритмы и структуры данных осень 2013 лекция 2
 
Управление продуктом осень 2013 лекция 5
Управление продуктом осень 2013 лекция 5Управление продуктом осень 2013 лекция 5
Управление продуктом осень 2013 лекция 5
 
Лекция №11 "Основы нейронных сетей"
Лекция №11 "Основы нейронных сетей" Лекция №11 "Основы нейронных сетей"
Лекция №11 "Основы нейронных сетей"
 
Алгоритмы и структуры данных осень 2013 лекция 8
Алгоритмы и структуры данных осень 2013 лекция 8Алгоритмы и структуры данных осень 2013 лекция 8
Алгоритмы и структуры данных осень 2013 лекция 8
 
Web осень 2013 лекция 8
Web осень 2013 лекция 8Web осень 2013 лекция 8
Web осень 2013 лекция 8
 
Web осень 2013 лекция 9
Web осень 2013 лекция 9Web осень 2013 лекция 9
Web осень 2013 лекция 9
 
Лекция №9 "Алгоритмические композиции. Начало"
Лекция №9 "Алгоритмические композиции. Начало"Лекция №9 "Алгоритмические композиции. Начало"
Лекция №9 "Алгоритмические композиции. Начало"
 
Лекция №12 "Ограниченная машина Больцмана"
Лекция №12 "Ограниченная машина Больцмана" Лекция №12 "Ограниченная машина Больцмана"
Лекция №12 "Ограниченная машина Больцмана"
 
Лекция №10 "Алгоритмические композиции. Завершение"
Лекция №10 "Алгоритмические композиции. Завершение" Лекция №10 "Алгоритмические композиции. Завершение"
Лекция №10 "Алгоритмические композиции. Завершение"
 
Лекция №7 "Машина опорных векторов"
Лекция №7 "Машина опорных векторов" Лекция №7 "Машина опорных векторов"
Лекция №7 "Машина опорных векторов"
 
СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"
СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"
СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"
 
Web весна 2013 лекция 10
Web весна 2013 лекция 10Web весна 2013 лекция 10
Web весна 2013 лекция 10
 
Web весна 2013 лекция 1
Web весна 2013 лекция 1Web весна 2013 лекция 1
Web весна 2013 лекция 1
 

Similar to C++ осень 2013 лекция 5

углубленное программирование на C++. лекция no.5 [4.0]
углубленное программирование на C++. лекция no.5 [4.0]углубленное программирование на C++. лекция no.5 [4.0]
углубленное программирование на C++. лекция no.5 [4.0]Technopark
 
Объектно-ориентированное программирование. Лекция 7 и 8.
Объектно-ориентированное программирование. Лекция 7 и 8. Объектно-ориентированное программирование. Лекция 7 и 8.
Объектно-ориентированное программирование. Лекция 7 и 8.
Dima Dzuba
 
C++ осень 2012 лекция 3
C++ осень 2012 лекция 3C++ осень 2012 лекция 3
C++ осень 2012 лекция 3Technopark
 
6.4 Ещё о шаблонах
6.4 Ещё о шаблонах6.4 Ещё о шаблонах
6.4 Ещё о шаблонах
DEVTYPE
 
C++ Базовый. Занятие 09.
C++ Базовый. Занятие 09.C++ Базовый. Занятие 09.
C++ Базовый. Занятие 09.
Igor Shkulipa
 
C++ Базовый. Занятие 14.
C++ Базовый. Занятие 14.C++ Базовый. Занятие 14.
C++ Базовый. Занятие 14.
Igor Shkulipa
 
Типы данных
Типы данныхТипы данных
Типы данных
MonsterXX
 
C++ осень 2012 лекция 9
C++ осень 2012 лекция 9C++ осень 2012 лекция 9
C++ осень 2012 лекция 9Technopark
 
03_JavaBasicConstructionsAndDatatypes
03_JavaBasicConstructionsAndDatatypes03_JavaBasicConstructionsAndDatatypes
03_JavaBasicConstructionsAndDatatypesdklenov
 
Конспект лекций по курсу "Шаблоны разработки ПО"
Конспект лекций по курсу "Шаблоны разработки ПО"Конспект лекций по курсу "Шаблоны разработки ПО"
Конспект лекций по курсу "Шаблоны разработки ПО"
Sergey Nemchinsky
 
презентация конспекта лекций
презентация конспекта лекцийпрезентация конспекта лекций
презентация конспекта лекцийstudent_kai
 
Метапрограммирование с примерами на JavaScript
Метапрограммирование с примерами на JavaScriptМетапрограммирование с примерами на JavaScript
Метапрограммирование с примерами на JavaScript
Timur Shemsedinov
 
Android - 02 - annotations, exceptions, io, generics
Android - 02 - annotations, exceptions, io, genericsAndroid - 02 - annotations, exceptions, io, generics
Android - 02 - annotations, exceptions, io, genericsNoveo
 
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Yandex
 
Coding Standards
Coding StandardsCoding Standards
Coding Standardsroadhump
 
особенности программирования на с++
особенности программирования на с++особенности программирования на с++
особенности программирования на с++
mcroitor
 
C++ Базовый. Занятие 08.
C++ Базовый. Занятие 08.C++ Базовый. Занятие 08.
C++ Базовый. Занятие 08.
Igor Shkulipa
 
Predzazhita 2009 v16
Predzazhita 2009 v16Predzazhita 2009 v16
Predzazhita 2009 v16guest1ba51d
 
Обзор Ruby
Обзор RubyОбзор Ruby
Лекция #7. Django ORM
Лекция #7. Django ORMЛекция #7. Django ORM
Лекция #7. Django ORM
Яковенко Кирилл
 

Similar to C++ осень 2013 лекция 5 (20)

углубленное программирование на C++. лекция no.5 [4.0]
углубленное программирование на C++. лекция no.5 [4.0]углубленное программирование на C++. лекция no.5 [4.0]
углубленное программирование на C++. лекция no.5 [4.0]
 
Объектно-ориентированное программирование. Лекция 7 и 8.
Объектно-ориентированное программирование. Лекция 7 и 8. Объектно-ориентированное программирование. Лекция 7 и 8.
Объектно-ориентированное программирование. Лекция 7 и 8.
 
C++ осень 2012 лекция 3
C++ осень 2012 лекция 3C++ осень 2012 лекция 3
C++ осень 2012 лекция 3
 
6.4 Ещё о шаблонах
6.4 Ещё о шаблонах6.4 Ещё о шаблонах
6.4 Ещё о шаблонах
 
C++ Базовый. Занятие 09.
C++ Базовый. Занятие 09.C++ Базовый. Занятие 09.
C++ Базовый. Занятие 09.
 
C++ Базовый. Занятие 14.
C++ Базовый. Занятие 14.C++ Базовый. Занятие 14.
C++ Базовый. Занятие 14.
 
Типы данных
Типы данныхТипы данных
Типы данных
 
C++ осень 2012 лекция 9
C++ осень 2012 лекция 9C++ осень 2012 лекция 9
C++ осень 2012 лекция 9
 
03_JavaBasicConstructionsAndDatatypes
03_JavaBasicConstructionsAndDatatypes03_JavaBasicConstructionsAndDatatypes
03_JavaBasicConstructionsAndDatatypes
 
Конспект лекций по курсу "Шаблоны разработки ПО"
Конспект лекций по курсу "Шаблоны разработки ПО"Конспект лекций по курсу "Шаблоны разработки ПО"
Конспект лекций по курсу "Шаблоны разработки ПО"
 
презентация конспекта лекций
презентация конспекта лекцийпрезентация конспекта лекций
презентация конспекта лекций
 
Метапрограммирование с примерами на JavaScript
Метапрограммирование с примерами на JavaScriptМетапрограммирование с примерами на JavaScript
Метапрограммирование с примерами на JavaScript
 
Android - 02 - annotations, exceptions, io, generics
Android - 02 - annotations, exceptions, io, genericsAndroid - 02 - annotations, exceptions, io, generics
Android - 02 - annotations, exceptions, io, generics
 
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
 
Coding Standards
Coding StandardsCoding Standards
Coding Standards
 
особенности программирования на с++
особенности программирования на с++особенности программирования на с++
особенности программирования на с++
 
C++ Базовый. Занятие 08.
C++ Базовый. Занятие 08.C++ Базовый. Занятие 08.
C++ Базовый. Занятие 08.
 
Predzazhita 2009 v16
Predzazhita 2009 v16Predzazhita 2009 v16
Predzazhita 2009 v16
 
Обзор Ruby
Обзор RubyОбзор Ruby
Обзор Ruby
 
Лекция #7. Django ORM
Лекция #7. Django ORMЛекция #7. Django ORM
Лекция #7. Django ORM
 

More from Technopark

Лекция 11. Вычислительная модель Pregel
Лекция 11. Вычислительная модель PregelЛекция 11. Вычислительная модель Pregel
Лекция 11. Вычислительная модель Pregel
Technopark
 
Лекция 14. Hadoop в Поиске Mail.Ru
Лекция 14. Hadoop в Поиске Mail.RuЛекция 14. Hadoop в Поиске Mail.Ru
Лекция 14. Hadoop в Поиске Mail.Ru
Technopark
 
Лекция 13. YARN
Лекция 13. YARNЛекция 13. YARN
Лекция 13. YARN
Technopark
 
Лекция 12. Spark
Лекция 12. SparkЛекция 12. Spark
Лекция 12. Spark
Technopark
 
Лекция 10. Apache Mahout
Лекция 10. Apache MahoutЛекция 10. Apache Mahout
Лекция 10. Apache Mahout
Technopark
 
Лекция 9. ZooKeeper
Лекция 9. ZooKeeperЛекция 9. ZooKeeper
Лекция 9. ZooKeeper
Technopark
 
Лекция 7. Введение в Pig и Hive
Лекция 7. Введение в Pig и HiveЛекция 7. Введение в Pig и Hive
Лекция 7. Введение в Pig и Hive
Technopark
 
Лекция 6. MapReduce в Hadoop (графы)
Лекция 6. MapReduce в Hadoop (графы)Лекция 6. MapReduce в Hadoop (графы)
Лекция 6. MapReduce в Hadoop (графы)
Technopark
 
Лекция 5. MapReduce в Hadoop (алгоритмы)
Лекция 5. MapReduce в Hadoop (алгоритмы)Лекция 5. MapReduce в Hadoop (алгоритмы)
Лекция 5. MapReduce в Hadoop (алгоритмы)
Technopark
 
Лекция 4. MapReduce в Hadoop (введение)
Лекция 4. MapReduce в Hadoop (введение)Лекция 4. MapReduce в Hadoop (введение)
Лекция 4. MapReduce в Hadoop (введение)
Technopark
 
Лекция 3. Распределённая файловая система HDFS
Лекция 3. Распределённая файловая система HDFSЛекция 3. Распределённая файловая система HDFS
Лекция 3. Распределённая файловая система HDFS
Technopark
 
Лекция 2. Основы Hadoop
Лекция 2. Основы HadoopЛекция 2. Основы Hadoop
Лекция 2. Основы Hadoop
Technopark
 
Лекция 1. Введение в Big Data и MapReduce
Лекция 1. Введение в Big Data и MapReduceЛекция 1. Введение в Big Data и MapReduce
Лекция 1. Введение в Big Data и MapReduce
Technopark
 
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"
Technopark
 
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...
Technopark
 
СУБД 2013 Лекция №9 "Безопасность баз данных"
СУБД 2013 Лекция №9 "Безопасность баз данных"СУБД 2013 Лекция №9 "Безопасность баз данных"
СУБД 2013 Лекция №9 "Безопасность баз данных"
Technopark
 
СУБД 2013 Лекция №8 "Конфигурирование базы данных"
СУБД 2013 Лекция №8 "Конфигурирование базы данных"СУБД 2013 Лекция №8 "Конфигурирование базы данных"
СУБД 2013 Лекция №8 "Конфигурирование базы данных"
Technopark
 
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
Technopark
 
СУБД 2013 Лекция №5 "Определение узких мест"
СУБД 2013 Лекция №5 "Определение узких мест"СУБД 2013 Лекция №5 "Определение узких мест"
СУБД 2013 Лекция №5 "Определение узких мест"
Technopark
 
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...
Technopark
 

More from Technopark (20)

Лекция 11. Вычислительная модель Pregel
Лекция 11. Вычислительная модель PregelЛекция 11. Вычислительная модель Pregel
Лекция 11. Вычислительная модель Pregel
 
Лекция 14. Hadoop в Поиске Mail.Ru
Лекция 14. Hadoop в Поиске Mail.RuЛекция 14. Hadoop в Поиске Mail.Ru
Лекция 14. Hadoop в Поиске Mail.Ru
 
Лекция 13. YARN
Лекция 13. YARNЛекция 13. YARN
Лекция 13. YARN
 
Лекция 12. Spark
Лекция 12. SparkЛекция 12. Spark
Лекция 12. Spark
 
Лекция 10. Apache Mahout
Лекция 10. Apache MahoutЛекция 10. Apache Mahout
Лекция 10. Apache Mahout
 
Лекция 9. ZooKeeper
Лекция 9. ZooKeeperЛекция 9. ZooKeeper
Лекция 9. ZooKeeper
 
Лекция 7. Введение в Pig и Hive
Лекция 7. Введение в Pig и HiveЛекция 7. Введение в Pig и Hive
Лекция 7. Введение в Pig и Hive
 
Лекция 6. MapReduce в Hadoop (графы)
Лекция 6. MapReduce в Hadoop (графы)Лекция 6. MapReduce в Hadoop (графы)
Лекция 6. MapReduce в Hadoop (графы)
 
Лекция 5. MapReduce в Hadoop (алгоритмы)
Лекция 5. MapReduce в Hadoop (алгоритмы)Лекция 5. MapReduce в Hadoop (алгоритмы)
Лекция 5. MapReduce в Hadoop (алгоритмы)
 
Лекция 4. MapReduce в Hadoop (введение)
Лекция 4. MapReduce в Hadoop (введение)Лекция 4. MapReduce в Hadoop (введение)
Лекция 4. MapReduce в Hadoop (введение)
 
Лекция 3. Распределённая файловая система HDFS
Лекция 3. Распределённая файловая система HDFSЛекция 3. Распределённая файловая система HDFS
Лекция 3. Распределённая файловая система HDFS
 
Лекция 2. Основы Hadoop
Лекция 2. Основы HadoopЛекция 2. Основы Hadoop
Лекция 2. Основы Hadoop
 
Лекция 1. Введение в Big Data и MapReduce
Лекция 1. Введение в Big Data и MapReduceЛекция 1. Введение в Big Data и MapReduce
Лекция 1. Введение в Big Data и MapReduce
 
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"
 
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...
 
СУБД 2013 Лекция №9 "Безопасность баз данных"
СУБД 2013 Лекция №9 "Безопасность баз данных"СУБД 2013 Лекция №9 "Безопасность баз данных"
СУБД 2013 Лекция №9 "Безопасность баз данных"
 
СУБД 2013 Лекция №8 "Конфигурирование базы данных"
СУБД 2013 Лекция №8 "Конфигурирование базы данных"СУБД 2013 Лекция №8 "Конфигурирование базы данных"
СУБД 2013 Лекция №8 "Конфигурирование базы данных"
 
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
 
СУБД 2013 Лекция №5 "Определение узких мест"
СУБД 2013 Лекция №5 "Определение узких мест"СУБД 2013 Лекция №5 "Определение узких мест"
СУБД 2013 Лекция №5 "Определение узких мест"
 
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...
 

C++ осень 2013 лекция 5

  • 2. Лекция №5. Шаблоны классов и методов. Обработка исключительных ситуаций. Обобщенное и безопасное программирование 1. Шаблоны классов и методов. Обобщенное программирование. Параметры шаблонов. Специализация, конкретизация и перегрузка шаблонов. 2. Рекурсивное определение шаблонов. Основы метапрограммирования. Идиома SFINAE. 3. Понятие, поддержка и технология обработки исключительных ситуаций. 4. Безопасное программирование. Нейтральность кода. Критерии безопасности и нейтральности классов и методов. 5. Безопасность конструкторов и деструкторов. 6. Исключения в стандартной библиотеке. 2
  • 3. Шаблоны классов Шаблон класса — элемент языка, позволяющий параметризовать типы и значения, используемые для автоматического создания (конкретизации) классов по обобщенному описанию (шаблону). Использование шаблонов классов — шаг на пути к парадигме обобщенного программирования. Различают описания и определения шаблонов классов. В отличие от «обычного» класса описания и определения шаблона содержат списки параметров шаблона, среди которых выделяются параметры-типы и параметры-константы. Параметры-типы шаблона класса представляют некоторый тип данных, параметры-константы — некоторое константное (вычисляемое при компиляции) выражение. 3
  • 4. Шаблоны классов: пример template <class T, class U, int size> // эквивалентно: // template <typename T, typename U, int size> class Test { public: Test() : _size(size) // … private: T _prm_1; U* _prm_2; int _size; }; 4
  • 5. Параметры шаблонов классов Параметры шаблона класса не могут быть одноименными члену соответствующего шаблона. Имя параметра шаблона может присутствовать в списке параметров лишь один раз. Имена параметров в объявлении (если есть) и определении шаблона могут различаться. Параметры могут иметь значения по умолчанию. Константные выражения с одинаковыми значениями трактуются как эквивалентные параметры-константы шаблона класса. 5
  • 6. Конкретизация шаблонов классов Конкретизация шаблона — это автоматическая генерация исходного кода конкретного класса в соответствии с заданным программистом определением шаблона класса. Конкретизированный шаблон может использоваться везде, где допустимо использование «обычного» класса (включая описания и определения шаблонов функций), а экземпляры автоматически сгенерированного класса — везде, где допустимы «обычные» объекты. Шаблон класса конкретизируется тогда, когда впервые требуется определение автоматически генерируемого класса. Test<int, double, 10> t_id10; 6
  • 7. Методы шаблонов классов Методы шаблонов классов также являются шаблонами и конкретизируются в точке вызова или взятия адреса. При этом конкретизируемый метод относится к тому классу, через объект которого вызывается. template <class T, class U, int size> Test<T, U, size>::~Test() { /* … */ } 7
  • 8. Дружественные объекты в шаблонах классов Дружественными по отношению к шаблонам классов могут быть:  дружественная функция или дружественный класс (не шаблон);  связанный шаблон дружественной функции, взаимно однозначно соответствующий шаблону класса (с общим для обоих шаблонов списком параметров);  связанный шаблон дружественного класса, взаимно однозначно соответствующий шаблону класса (с общим для обоих шаблонов списком параметров);  несвязанный шаблон дружественной функции, соответствующий всем возможным конкретизациям шаблона класса (с раздельными списками параметров);  несвязанный шаблон дружественного класса, соответствующий всем возможным конкретизациям шаблона класса (с раздельными списками параметров). 8
  • 9. Статические члены шаблонов классов Шаблоны классов могут содержать статические члены данных, собственный набор которых имеет каждый конкретизированный согласно шаблону класс. template <class T, class U, int size> class Test { /* … */ private: static Test *_head; }; template <class T, class U, int size> Test<T, U, size> *Test<T, U, size>::_head = NULL; 9
  • 10. Специализация шаблонов классов. Специализация члена класса: пример Шаблоны классов в языке C++ допускают частичную (полную) специализацию, при которой отдельные (все) параметры шаблона заменяются конкретными именами типов или значениями константных выражений. // специализация члена класса template<> void Test<int, double, 10>::foo() { /* … */ } 10
  • 11. Полная и частичная специализация класса: пример // полная специализация класса template<> class Test<int, double, 100> { public: Test<int, double, 100>(); ~Test<int, double, 100>(); void foo(); /* … */ }; // частичная специализация класса template <class T, class U> class Test<T, U, 100> { public: Test(); ~Test (); /* … */ }; 11
  • 12. Рекурсивное определение шаблонов как пример метапрограммирования template <unsigned long N> struct binary { static unsigned const value = binary<N / 10>::value << 1 | N % 10; }; template <> struct binary<0> { static unsigned const value = 0; }; unsigned const one = binary<1>::value; unsigned const three = binary<11>::value; unsigned const five = binary<101>::value; 12
  • 13. Идиома SFINAE Идиома SFINAE (англ. Substitution Failure Is Not An Error — «неудача при подстановке не есть ошибка») является одной из идиом обобщенного программирования и означает ситуацию, при которой невозможность подстановки параметров шаблона не влечет аварийного завершения компиляции. Ситуация, соответствующая идиоме SFINAE, возникает при разрешении перегруженных вызовов, в которых среди множества функций-кандидатов найдется хотя бы одна, полученная в результате конкретизации шаблона. В соответствии с логикой идиомы SFINAE, неудача при подстановке параметров в соответствующий шаблон ведет лишь к удалению данного шаблона из множества кандидатов и не имеет катастрофических последствий для компиляции. 13
  • 14. Идиома SFINAE и интроспекция времени компиляции: пример template <typename T> struct has_typedef_foobar { typedef char yes[1]; // sizeof(yes) == 1 typedef char no [2]; // sizeof(no) == 2 template <typename C> static yes& test(typename C::foobar*); template <typename> static no& test(...); static const bool value = sizeof(test<T>(0)) == sizeof(yes); }; struct foo { typedef float foobar; }; // has_typedef_foobar<int>::value == false // has_typedef_foobar<foo>::value == true 14
  • 15. Интроспекция времени компиляции в библиотеке boost::type_traits Цель. Через набор узкоспециализированных, имеющих единый дизайн вспомогательных классов упростить работу с атомарными характеристиками типов (англ. type traits) в системе типов языка C++. Библиотека. #include <boost/type_traits.hpp> Реализация. Библиотека характеристик типов содержит значительное количество внутренне весьма однородных классов (структур), многие из которых открыто наследуют типам true_type или false_type (см. далее). 15
  • 16. Характеристики типов: структуры is_void, is_pointer // структура is_void template <typename T> struct is_void : public false_type{}; template <> struct is_void<void> : public true_type{}; // структура is_pointer template <typename T> struct is_pointer: public false_type{}; template <typename T> struct is_pointer<T*> : public true_type{}; 16
  • 17. Характеристики типов: структуры true_type и false_type template <class T, T val> struct integral_constant { typedef integral_constant<T, val> typedef T static const T }; type; value_type; value = val; typedef integral_constant<bool, true> true_type; typedef integral_constant<bool, false> false_type; 17
  • 18. Характеристики типов: иерархии классов Проиллюстрированный подход позволяет строить параллельные иерархии классов, обладающих (потомки true_type) и не обладающих (потомки false_type) искомыми свойствами. Принадлежность к соответствующей иерархии является различительным признаком. 18
  • 19. Характеристики типов: структура remove_extent Установить тип элемента массива позволяет структура remove_extent. template <typename T> struct remove_extent { typedef T type; }; template <typename T, std::size_t N> struct remove_extent<T[N]> { typedef T type; }; 19
  • 20. Характеристики типов: оптимизация функций (общий случай) Имея эффективную реализацию функции для типов с конкретными характеристиками, нетрудно должным образом специализировать ее шаблон. Например, для std::copy имеем: template<typename I1, typename I2, bool b> I2 copy_imp(I1 first, I1 last, I2 out, const boost::integral_constant<bool, b>&) { while(first != last) { *out = *first; ++out; ++first; } return out; } 20
  • 21. Характеристики типов: оптимизация функций(оптимизированная реализация) template<typename T> T* copy_imp(const T* first, const T* last, T* out, const boost::true_type&) { memmove(out, first, (last - first) * sizeof(T)); return out + (last - first); } 21
  • 22. Характеристики типов: оптимизация функций (вызывающая функция) template<typename I1, typename I2> inline I2 copy(I1 first, I1 last, I2 out) { typedef typename std::iterator_traits<I1>:: value_type value_type; return copy_imp(first, last, out, boost::has_trivial_assign<value_type>()); } 22
  • 23. Характеристики типов: исключение деструкторов (вызов ~T() обязателен) Столь же нетрудно избежать накладных расходов на вызов деструкторов в случаях, когда этого допускает структура соответствующих классов. template<class T> void do_destroy_array(T* first, T* last, const boost::false_type&) { while(first != last) { first->~T(); ++first; } } 23
  • 24. Характеристики типов: исключение деструкторов (вызов ~T() факультативен) template<class T> inline void do_destroy_array(T* first, T* last, const boost::true_type&) { } // вызывающая функция template<class T> inline void destroy_array(T* p1, T* p2) { do_destroy_array(p1, p2, boost::has_trivial_destructor<T>()); } 24
  • 25. Понятие исключительной ситуации (1 / 2) Естественный порядок функционирование программ нарушают возникающие нештатные ситуации, в большинстве случаев связанные с ошибками времени выполнения (иногда — с необходимостью внезапно переключить контекст приложения). В языке C++ такие нештатные ситуации называются исключительными (иначе говоря — исключениями). Примерами исключительных ситуаций являются:  нехватка оперативной памяти;  попытка доступа к элементу коллекции по некорректному индексу;  попытка недопустимого преобразования динамических типов и пр. 25
  • 26. Понятие исключительной ситуации (2 / 2) Архитектурной особенностью механизма обработки исключительных ситуаций в языке C++ является принципиальная независимость (несвязность) фрагментов программы, где исключение возбуждается и где оно обрабатывается. Обработка исключительных ситуаций носит невозвратный характер. 26
  • 27. Объекты-исключения. Оператор throw Носителями информации об аномальной ситуации (исключении) в C++ являются объекты заранее выбранных на эту роль типов (пользовательских или — Sic! — базовых, например, char*). Такие объекты называются объектами-исключениями. Жизненный цикл объектов-исключений начинается с возбуждения исключительной ситуации посредством оператора throw: throw "Illegal cast"; /* … */ throw IllegalCast(); /* … */ enum EPrgStatus {psOK, psBadIndex, throw psIllegalCast; // char * // class IllegalCast psIllegalCast}; // enum EPrgStatus 27
  • 28. Защищенные блоки. Операторы try, catch Небезопасные с точки зрения исключений фрагменты кода могут инкапсулироваться в защищенный (контролируемый) блок, за которым следует один или несколько связанных с ним блоковобработчиков исключений. Защищенные блоки кода начинаются ключевым словом try, блоки-обработчики — словом catch. При возбуждении исключения в одном из операторов защищенного блока все следующие за ним операторы блока автоматически пропускаются, а управление передается ближайшему соответствующему блоку-обработчику исключения. Если такой блок не найден, управление берет на себя стандартная функция terminate(). Иначе обработку исключительной ситуации берет на себя первый подходящий для этого блок в порядке их указания в исходном коде. 28
  • 29. Защищенные блоки. Операторы try, catch: пример void foo() { /* … */ throw "Illegal id"; /* … */ } // не выполняется void bar() { try { foo(); /* … */ // не выполняется } catch(char *s) { std::cout << s << std::endl; } } 29
  • 30. Функциональные защищенные блоки Как защищенный блок может быть оформлена не только часть функции, но и функция целиком (в том числе main() и конструкторы классов). В таком случае защищенный блок называют функциональным. Например: void foobar() try { /* … */ } catch( /* … */ ) { /* … */ } catch( /* … */ ) { /* … */ } catch( /* … */ ) { /* … */ } 30
  • 31. Варианты описания исключений Описание исключения в блоке-обработчике может содержать имя типа, объекта, ссылки или указателя на объект. catch(IllegalCast) { /* … */ } catch(IllegalCast ic) { /* … */ } catch(IllegalCast &ric) { /* … */ } catch(IllegalCast *pic) { /* … */ } 31
  • 32. Раскрутка стека и уничтожение объектов Поиск catch-блока, пригодного для обработки возбужденного исключения, приводит к раскрутке стека — последовательному выходу из составных операторов и определений функций. В ходе раскрутки стека происходит уничтожение локальных объектов, определенных в покидаемых областях видимости. При этом деструкторы локальных объектов вызываются штатным образом (строгая гарантия C++). Исключение, для обработки которого не найден catch-блок, инициирует запуск функции terminate(), передающей управление функции abort(), которая аварийно завершает программу. 32
  • 33. Повторное возбуждение исключения и универсальный блок-обработчик Оператор throw без параметров помещается (только) в catch-блок и повторно возбуждает обрабатываемое исключение. При этом его копия не создается: throw; Особая форма блока-обработчика исключений осуществляет перехват любых исключений: catch(...) { /* … */ }; 33
  • 34. Безопасность ПО как показатель качества Безопасность — один из показателей качества ПО, оцениваемый путем статического анализа состава и взаимосвязей используемых компонентов, исходного кода и схемы БД. Для обеспечения «структурной безопасности» исходного кода необходимо соблюдение стандартов разработки архитектуры и стандартов кодирования. Примечание: См. модели качества ПО, описанные в стандартах:  ГОСТ Р ИСО/МЭК 9126-93. Информационная технология. Оценка программной продукции. Характеристики качества и руководства по их применению;  ISO/IEC 9126:2001. Software Engineering — Product Quality;  ISO/IEC 25010:2011. Systems and Software Engineering — Systems and software Quality Requirements and Evaluation (SQuaRE) — System and software quality models. 34
  • 35. Стандарты кодирования — за «безопасный код» Структурная безопасность исходного кода ПО требует соблюдения определенных техник кодирования, одной из которых является систематическая обработка ошибок и исключительных ситуаций на всех уровнях архитектуры (уровень представления, уровень бизнес-логики, уровень (базы) данных). Одним из элементов обработки ошибок и исключений является спецификация (ограничение) типов исключений, которые могут порождать структурные элементы кода. 35
  • 36. Безопасность классов и методов Функция C++ безопасна, если она не возбуждает никаких исключений или все возбужденные внутри нее исключения обрабатываются в ее теле. Класс C++ безопасен, если безопасны все его методы. В свою очередь, небезопасные функции могут специфицировать исключения, возбуждением которых (и только их!) способно завершиться исполнение таких функций. Обнаруженное при исполнении нарушение гарантии влечет за собой вызов функции unexpected(), по умолчанию вызывающей terminate(). Виртуальные функции в производных классах могут повторять спецификации исключений функций в базовых классов или накладывать более строгие ограничения. 36
  • 37. Безопасность классов и методов: пример // описания функций int foo(int &i) throw(); bool bar(char *pc = 0) throw(IllegalCast); void foobar() throw(IllegalCast, BadIndex); // определения функции int foo(int &i) throw() { /* … */} bool bar(char *pc = 0) throw(IllegalCast) { /* … */} void foobar() throw(IllegalCast, BadIndex) { /* … */} 37
  • 38. Безопасность конструкторов Конструкторы, как и другие методы классов, могут возбуждать исключения. Для обработки всех исключений, возникших при исполнении конструктора, его тело и список инициализации должны быть совместно помещены в функциональный защищенный блок. Beta::Beta(int value) try : Alpha(foo(value)) { // тело конструктора /* … */ } catch(...) { /* … */ } 38
  • 39. Безопасность деструкторов Деструкторы классов не должны возбуждать исключения. Одной из причин этого является необходимость корректного освобождения ресурсов, занятых массивами и коллекциями объектов:  если вызываемая в деструкторе функция может возбудить исключение, деструктор должен перехватить и обработать его (возможно, прервав программу);  если возможность реакции на исключение необходима клиентам класса во время некоторой операции, в его открытом интерфейса должна быть функция (не деструктор!), которая такую операцию выполняет. В общем случае деструктор класса может специфицироваться как throw(): ~Alpha() throw(); 39
  • 40. Безопасность или нейтральность кода? От безопасности программного кода важно отличать нейтральность, под которой, согласно терминологии Г. Саттера (Herb Sutter), следует понимать способность методов класса прозрачно «пропускать сквозь себя» объекты-исключения, полученные ими на обработку, но не предназначенные для них. Нейтральный метод:  может обрабатывать исключения;  должен ретранслировать полученные им исключения методуобработчику в неизменном виде и сохранять свою работоспособность при любых обстоятельствах. 40
  • 41. Пользовательские и стандартные классы исключительных ситуаций Для передачи из точки возбуждения исключения в точку его обработки сведений об условиях возникновения аномалии программист может определять и использовать собственные классы исключительных ситуаций. Такие классы могут быть сколь угодно простыми (включая пустые) или сложными (содержащими члены данных, конструкторы, деструкторы и интерфейсные методы). Стандартная библиотека языка C++ содержит собственную иерархию классов исключений, являющихся прямыми или косвенными потомками базового класса exception. Потомки класса exception условно представляют две категории ошибок: логические ошибки и ошибки времени исполнения. 41
  • 42. Класс std::exception namespace std { class exception { public: exception() throw(); exception( const exception & ) throw(); exception& operator=( const exception & ) throw(); virtual ~exception() throw(); virtual const char* what() const throw(); }; } 42
  • 43. Стандартные классы ― логические ошибки В число классов категории «логические ошибки» входят базовый промежуточный класс logic_error, а также производные от него специализированные классы:     invalid_argument out_of_range length_error domain_error — — — — ошибка «неверный аргумент»; ошибка «вне диапазона»; ошибка «неверная длина»; ошибка «вне допустимой области». 43
  • 44. Стандартные классы ― ошибки времени исполнения В число классов категории «ошибки времени исполнения» входят базовый промежуточный класс runtime_error, а также производные от него специализированные классы:  range_error — ошибка диапазона;  overflow_error — переполнение;  underflow_error — потеря значимости. 44
  • 45. Прочие классы исключений стандартной библиотеки Также производными от exception являются классы bad_alloc и bad_cast, сигнализирующие об ошибках при выделении динамической памяти и неудаче при выполнении «ссылочного» варианта операции dynamic_cast, соответственно. 45