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()
{...}

Ориентация на типы


Определение

Реши, какие требуются типы; обеспечь полный набор операций для каждого типа.

Она получила название программирование с ориентацией на типы


В задаче приходиться манипулировать данными.

Сложность представления данных заставляет конструировать

сложные типы - на базе стандартных и уже разработанных.

В языках появляется поддержка механизмов создания новых типов -

структуры, массивы, классы.

Обобщенное программирование


Определение

Реши, какие требуются алгоритмы; параметризируй их так, чтобы они могли работать со множеством подходящих типов и структур данных.

Связанный список - более общее понятие, которое не зависит от определения книги или студента.

Следовательно, он должен быть представлен независимо.

Объектно-ориентированное программирование


Определение

Реши, какие требуются классы; обеспечь полный набор операций для каждого класса; явно вырази общность через наследование.

Объектно-ориентированное программирование - это методология программирования, основанная на представлении программы в виде совокупности объектов, каждый из которых является экземпляром определенного класса, а классы образуют иерархию наследования.

Программа будет считаться объектно-ориентированной только при соблюдении следующих трех требований:

  • Данный подход использует в качестве базовых элементов объекты, а не переменные, функции или алгоритмы.
  • Каждый объект является экземпляром определенного класса.
  • Классы организованы в иерархию.

В соответствии с определением не все языки программирования можно считать объектно-ориентированными. Язык можно отнести к таковым, если он имеет средства поддержки объектно-ориентированного стиля и использование этого стиля в языке естественно и не требует искусственных усилий.