Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ShPOR_OOP.docx
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
261.06 Кб
Скачать
  1. История развития языков программирования

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

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

На протяжении 60-х годов запросы на разработку программного обеспечения возросли и программы стали очень большими. Это привело к тому, что было разработано структурное программирование. С развитием структурного программирования следующим достижением были процедуры и функции. Общий код программы в данном случае становится меньше. Функции позволяют создавать модульные программы.

Следующим достижением было использование структур, благодаря которым перешли к классам. Структуры — это составные типы данных, построенные с использованием других типов Класс — это структура, которая имеет свои переменные и функции, которые работают с этими переменными. Это было очень большое достижение в области программирования.

В случае, когда нужно иметь эффективную программу, вместо машинных языков используются близкие к ним машинно-ориентированные языки —ассемблеры. Люди используют мнемонические команды взамен машинных команд.

Но даже работа с ассемблером достаточно сложна и требует специальной подготовки.

В 1954 году, когда был создан первый язык высокого уровня — ФортранЯзыки высокого уровня имитируют естественные языки, используя некоторые слова разговорного языка и общепринятые математические символы. Эти языки более удобны для человека, с помощью них, можно писать программы до нескольких тысяч строк длиной. Однако легко понимаемый в коротких программах, этот язык становился нечитаемым и трудно управляемым, когда дело касалось больших программ. Решение этой проблемы пришло после изобретения языков структурного программирования, таких как Алгол(1958), Паскаль(1970),Си(1972).

Также создавались функциональные языки (Пример: Lisp — англ. LISt Processing, 1958) и логические языки (пример: Prolog —англ. PROgramming in LOGic, 1972).

в конце 1970-х и начале 1980-х были разработаны принципы объектно-ориентированного программирования. ООП сочетает лучшие принципы структурного программирования с новыми мощными концепциями, базовые из которых называются инкапсуляциейполиморфизмом и наследованием.

Примерами объектно-ориентированных языков являются Object PascalC++Java и др.

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

  1. Основные свойства объектно-ориентированных языков программирования

Основными свойствами ООП являются:

Инкапсуляция-объединение данных с функциями их разработки в сочетании со скрытием ненужной для использования этих данных информацией

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

Полиморфизм-возможность использовать в различных классах иерархии одно имя для обозначения сходных по смыслу действий и гибко выбирать требуемое действие во время выполнения программы

История развития С++

Язык программирования С++ разработан в начале 80-ых годов (1983 г.) сотрудником AT&T Bell Laboratories Бьерном Страуструпом. Основой для его создания послужил процедурно-ориентированный язык системного программирования С, позволяющий разрабатывать эффективные модульные программы решения широкого класса научно-технических задач. Эффективность написанных на языке С программ обусловлена возможностью учета в ней архитектурных и аппаратных особенностей ЭВМ, на которой программа реализуется. При создании С++ использовались определенные концепции языков Симула-67 и Ангол-68 и преследовались следующие цели:

1. Обеспечить поддержку абстрактных (определяемых пользователем) типов данных

2. Предоставить средства для объектно-ориентированного программирования

3. Улучшить существующие конструкции языка С.

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

Первые версии языка программирования Си++ были разработаны в начале 80-х годов Бьярном Страуструпом. По признанию самого автора языка, Си++ никогда не разрабатывался на бумаге. Проектирование, реализация и документирование новых возможностей происходили фактически одновременно. За основу был взят популярный в среде профессиональных разработчиков язык программирования Си. Первыми средствами, которыми был расширен Си, стали средства поддержки абстракций данных и объектно-ориентированного программирования. Описание нового языка не было опубликовано сразу. Первыми его пользователями стали сами сотрудники Bell Labs. В 1993 впервые была реализована коммерческий транслятор, и сам язык был назван "С. Первым транслятором языка был препроцессор cfront, транслирующий программу на Си++ в эквивалентную программу на Си. И только в конце 80-х годов были реализованы прямые трансляторы, не использующие Си в качестве промежуточного языка. Пионером среди таких трансляторов стал GNU CC. Если не считать документацию к транслятору cfront, первой книгой с описанием языка стала "The C++ Programming Language" (Addison-Wesley, 1985), переведенная на русский язык и изданная в 1991 году. С этого момента началось его бурное распространение и создание многочисленных реализаций. Модель реализации ООП была частично позаимствована из языка программирования Simula67 и ориентировалась в основном на возможность эффективной реализации на вычислительных машинах со стандартной архитектурой. C 1985 года в язык были введены новые возможности: множественное и виртуальное наследование, шаблоны функций и классов, обработка исключительных ситуаций. Кардинально изменена семантика совместного использования оператора new, изменен синтаксис для вложенных классов.

  1. С++ как улучшение Си. Комментарии. Константы. Встраиваемые функции. Объявление структур, объединений и перечислений. Объявления переменных

  1. Комментарии ( /* ---- */) в С++ появился // и считается законченным окончанием строки.

  2. Константы. Можно задавать без знаковые константы. Также ужесточилось действие ключевого слова const. Теперь целые константы, описанные словом const могут использоваться для описания размеров массива. Константы в С++ подчиняются тем же правилам видимости, что и переменные.

12u[u] – без знаковая константа

12 – знаковая неименованная константа

//константы double

const double PI=3.14;

const double E=2.8;

//указатель на константу

const double *ptoconst=Π

//константный указатель

double *const constpconst=&E;

//константы на указатель на константу

const double *const constpconst=Π

*ptoconst=2.5;//ошибка. Значение по указателю менять нельзя

ptoconst=Π// правильно

constp=&E;//ошибка

*constp+=3.0;

Встраиваемые функции

В Си++ введено слово inline, означающее рекомендацию компилятору сделать функцию встраиваемой, то есть вместо генерации вызывающего её кода подставлять непосредственно её тело. Помимо "рекомендации", стандарт закрепляет за словом inline требование (следовательно, и разрешение) описывать функцию в каждой единице трансляции, в которой она используется, что, собственно, и играет ключевую роль в вопросе встраивания.Так например, если написать

inline double Sqr(double x) {return x*x;}

то Sqr(x) будет (почти во всех реализациях) вычисляться так же быстро, как x*x, но x предварительно приводится к типу double. По сути, Sqr(x) будет заменено на что-то вроде (double y=x, y*y), если бы такие выражения были разрешены.

Встроенные функции: приводят к типу, они знают об области видимости, они могут содержать условные операторы, они могут быть (перегруженными, или функциями-членами, или членами пространств имён, или функциями-друзьями, или задаваться шаблонами, или быть параметрами шаблонов.

Объявление структур, объединений, перечислений

В С++ введен упрощенный синтаксис для определения переменных, типа структур, объединений и перечислений, в котором можно опускать ключевые слова struct, union, enum.

//C

enum day{sun,mon,tue,wen};

struct path{char str[30];

enum day Week;}

struct path Link;

//C++

enum day{sun,mon,tue,wen};

struct path{char str[30];

day Week;}

path List;

Допускается использовать неименованные перечисления и объявления, что тоже делает синтаксис более простым и логичным.

struct Goods{

char *name;

union{double d, long l, int i)};

};

Переменные в С++ разрешается объявлять в любом месте программы. Важно лишь то, чтобы переменная была объявлена до ее использования. Допускается даже объявлять переменные цикла for в заголовке цикла.

for(int i;i<n;i++)...

В старых компиляторах область действия распространяется до конца блока, где находится оператор for. Во всех современных компиляторах распространяется только на тело цикла.

  1. Ссылки

В С++ появилась принципиально новая конструкция, которая называется ссылка. РБНФ:

тип “&” имя1”=”имя2”;”

Такое объявление фактически назначает переменной с именем 2 второе имя с названием имя 1. Ссылка в объявлении всегда должна быть проинициализирована, затем ее уже нельзя изменить.

int a,b;

int &alt = a;//alt есть ссылка на переменную целого типа a

alt=b;//все равно как если бы a=b

alt++;//все равно как если бы a++

Пусть имеется следующая конструкция

int *point=&a;//следующие условные выражения будут всегда истинны

*point == alt;

point == &alt;

Ссылку можно рассматривать как постоянный указатель, который постоянно раз адресован и можно не выполнять для него операцию раз адресации. Если одновременно объявлять несколько переменных типа ссылка, то перед каждым из них должен стоять &.

Для чего нужны:

  1. Для передачи аргументов в функцию

void f(int &a) {...}

...

int b,c;

f(b);

Ссылка не создает копии объекта, а является другим его именем. Таким образом, в обычном случае условное выражение &alt =&a. Из этого правила имеется два исключения:

  1. Это происходит при объявлении ссылки на константу. При этом случае генерируется временная переменная.

char &fcn=’A’; //создается временная переменная и ссылка будет на эту временную переменную. Это необходимо из соображений безопасности, чтобы не было объединения области памяти одинаковых констант.

  1. Временный объект создается также при инициализации ссылки переменной другого типа.

unsigned int u=20;

int &refi = u;//создаст временную переменную, выполнит преобразование unsigned в int и уже назначит новое имя не для оригинальной переменной, а для временной

В случае создания временного объекта, компилятор, как правило выдает соответствующее предупреждение.

Основной причиной создания ссылок является передача аргументов в функцию через ссылку и получение возвращаемого значения через ссылку. Аргументы передаются в функцию по ссылке в 2 случаях:

  1. При передаче в функцию аргумента, который должен быть изменен

  2. В случае больших структур

void Swap(int *a, int *b)

{

int temp=*a;

*a=*b;

*b=temp;

}

int x=5, y=10;

Swap(&x,&y);

void Swap(int &a, int &b)

{

int temp=a;

a=b;//разадресация не нужна

b=temp;

}

int x=5, y=10;

Swap(x,y);

В использовании ссылок в качестве передаваемых параметров есть недостатки: фактически параметр может быть изменен без ведома вызывающей программы, и это никак не отражается в синтаксисе вызова.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]