1 Краткая история
Происхождение С++

- Начало 80-х: пазработан Бьярном Страуструпом (Bell Laboratories). ''Си с классами''.
- 1983: появилось название ''C++''.
- 1985: первый коммерческий выпуск.
- 1985: выход книги ''Язык программирования С++''.
- 1989: выход версии 2.0.
- 1998: опубликован первый стандарт языка ISO/IEC 14882:1998 (известный как C++98).
- 2003: опубликован второй стандарт.
- 2011: опубликован стандарт С++11.
- 2014: опубликован стандарт С++14.
Возможности
- Поддержка процедурного программирования
- Поддержка модульного программирования
- Поддержка объектно-ориентированного программирования
- Поддержка обобщенного программирования
- Поддержка функционального программирования (C++11)
- Поддержка параллелелизма (С++11)
2 Парадигмы программирования
Понятие парадигмы
Определение
Парадигма программирования — это совокупность идей и понятий, определяющая стиль написания программ.
Парадигма определяется базовой программной единицей и самим принципом достижения модульности программы.
В качестве этой единицы выступают:
- определение - декларативное, функциональное программирование;
- действие - императивное программирование;
- правило - продукционное программирование;
- диаграмма переходов - автоматное программирование;
и др.
- В императивном программировании программа описывается как последовательность действий, меняющих состояние памяти.
- В функциональном программировании представляется в виде выражения и множества определений функций (в математическом смысле).
- В объектно-ориентированном программировании программу принято рассматривать как набор взаимодействующих объектов. ООП есть по сути императивное программирование, дополненное принципом инкапсуляции данных и методов в объект (принцип модульности) и наследованием (принципом повторного использования разработанного функционала).
Процедурное программирование
Процедурное программирование является разновидностью императивной парадигмы.
Определение
Реши, какие требуются процедуры; используй наилучшие доступные алгоритмы.
Упор делается на обработке - алгоритме, необходимом для выполнения требуемых вычислений.
Языки поддерживают эту парадигму, предоставляя средства для передачи аргументов функциям и возврата значений из функций.
Модульное программирование
Определение
Реши, какие требуются модули; разбей программу так, чтобы скрыть данные в модулях.
Эта парадигма известна также как "принцип сокрытия данных".
Типичным примером модуля является определение связного списка или дерева с набором функция для манипулирования их элементами.
Достоинство модуля заключается в том, что имена переменных и функций, определяемых в нем,
можно сделать локальными и они не будут конфликтовать с аналогичными именами в других модулях.
Особенности модульного программирования:
- Принцип сокрытия данных
- Раздельная компиляция
- Обработка исключений
stack.h
// stack.h
void push(char);
char pop();
usage.c
// usage.c
void f()
{
push('a');
char c = pop();
}
stack.c
//stack.c
const int max_size = 200;
char v[max_size];
int top = 0;
void push(char)
{...}
char pop()
{...}
Ориентация на типы
Определение
Реши, какие требуются типы; обеспечь полный набор операций для каждого типа.
Она получила название программирование с ориентацией на типы
В задаче приходиться манипулировать данными.
Сложность представления данных заставляет конструировать
сложные типы - на базе стандартных и уже разработанных.
В языках появляется поддержка механизмов создания новых типов -
структуры, массивы, классы.
Обобщенное программирование
Определение
Реши, какие требуются алгоритмы; параметризируй их так, чтобы они могли работать со множеством подходящих типов и структур данных.
Связанный список - более общее понятие, которое не зависит от определения книги или студента.
Следовательно, он должен быть представлен независимо.
Объектно-ориентированное программирование
Определение
Реши, какие требуются классы; обеспечь полный набор операций для каждого класса; явно вырази общность через наследование.
Объектно-ориентированное программирование - это методология программирования, основанная на представлении программы в виде совокупности объектов, каждый из которых является экземпляром определенного класса, а классы образуют иерархию наследования.
Программа будет считаться объектно-ориентированной только при соблюдении следующих трех требований:
- Данный подход использует в качестве базовых элементов объекты, а не переменные, функции или алгоритмы.
- Каждый объект является экземпляром определенного класса.
- Классы организованы в иерархию.
В соответствии с определением не все языки программирования можно считать объектно-ориентированными. Язык можно отнести к таковым, если он имеет средства поддержки объектно-ориентированного стиля и использование этого стиля в языке естественно и не требует искусственных усилий.