Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
369164_46F07_otvety_na_bilety_po_oop_si.doc
Скачиваний:
43
Добавлен:
24.12.2018
Размер:
613.38 Кб
Скачать

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

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

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

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

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

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

Основные этапы развития языка

Первые версии языка программирования Си++ (тогда он назывался "Си с классами") были разработаны в начале 80-х годов Бьярном Страуструпом, сотрудником знаменитой AT&T Bell Labs, где ранее были разработаны такие шедевры программирования, как операционная система UNIX и язык программирования Си. По признанию самого автора языка, Си++ никогда не разрабатывался на бумаге. Проектирование, реализация и документирование новых возможностей происходили фактически одновременно. Единственной целью разработки было создание языка, на котором было бы удобно программировать автору и его друзьям. Если вспомнить историю создания языка Си, то прослеживаются явные аналогии. За основу был взят популярный в среде профессиональных разработчиков язык программирования Си. Первыми средствами, которыми был расширен Си, стали средства поддержки абстракций данных и объектно-ориентированного программирования. Как это принято в AT&T, описание нового языка не было опубликовано сразу. Первыми его пользователями стали сами сотрудники Bell Labs. В 1993 впервые была реализована коммерческий транслятор, и сам язык был назван "С++", что можно (имея в виду операцию инкрементирования языка Си) трактовать как увеличенный или расширенный язык Си. Первым транслятором языка был препроцессор cfront, транслирующий программу на Си++ в эквивалентную программу на Си. И только в конце 80-х годов были реализованы прямые трансляторы, не использующие Си в качестве промежуточного языка. Пионером среди таких трансляторов стал GNU CC. Если не считать документацию к транслятору cfront, первой книгой с описанием языка стала "The C++ Programming Language" (Addison-Wesley, 1985), переведенная на русский язык и изданная в 1991 году (Страуструп Б. Язык программирования С++. М.: Радио и Связь, 1991). С этого момента началось его бурное распространение и создание многочисленных реализаций. Модель реализации ООП была частично позаимствована из языка программирования Simula67 и ориентировалась в основном на возможность эффективной реализации на вычислительных машинах со стандартной архитектурой. Некоторые возможности языка Simula были отклонены, так как, по мнению автора Си++, подталкивали разработчика к плохому стилю программирования. Так, в первых версиях Си++ полностью отсутствовала возможность динамической идентификации типа объекта (run-time type identification, rtti). Основные концепции поддержки ООП в Си++ были изложены Страуструпом в статье "What is Object Oriented Programming". C 1985 года в язык были введены новые возможности: множественное и виртуальное наследование, шаблоны функций и классов, обработка исключительных ситуаций. Кардинально изменена семантика совместного использования оператора new, изменен синтаксис для вложенных классов. С момента опубликования и до настоящего момента язык постоянно усовершенствовался и расширялся. Важным этапом в его развитии стала публикация в 1990 году подробного и достаточно строгого описания языка [3]. Сокращенно эту книгу часто называют ARM. Фактически одновременно с этим началась стандартизация языка. Инициатором стандартизации выступил не автор языка. Более того, Страуструп всегда довольно прохладно относился к попытке его полной стандартизации и выступал за реализации, в которых базовые возможности языка расширялись бы средствами и библиотеками, характерными только для данной реализации.

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

1. Комментарии

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

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

Символы // начинают комментарий, который заканчивается в конце строки, на которой они появились.

2. Константы

Константа — это переменная, которую необходимо обязательно инициализировать и которая после этого не меняет своего значения. Числовые константы в C делают с помощью #define, и это неплохо работает, хотя и имеет свои минусы. Константы всех остальных типов в Cи используют редко.

В Си++ константы и всё, с ними связанное, получило религиозный статус с приходом классов. Чем отличаются константы Си++ от констант Си?

…А главное отличие — их теперь можно использовать! Например, можно написать так:

const int N = 10;

int A [N];

В Си этого сделать было нельзя.

А раз константы можно использовать, отчего же этого не делать? Они многим лучше, чем #define:

  • они имеют тип, а значит, позволяют найти парочку ошибок в вашей программе;

  • они могут быть не просто числом или строкой, но и какой-нибудь сложной структурой;

  • их имена можно использовать при отладке;

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

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

Так например, если написать

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

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

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

СИ:

Для защиты программы от ошибок связанных с макроопределениями были введены встраиваемые функции: inline-ф-ции.

#define SQR(x) (x)*(x)

Встраиваемая функция – её код прописывается непосредственно вместо вызова

С++:

Ключевое слово inline

inline double SQR(double a)

{return a*a}

Определения должны располагаться в том же файле перед вызовом другой функции.

Они должны быть очень небольшого размера. Если содержат if(), for, while...

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

Структуры языка C++ представляют поименованную совокупность компонентов, называемых полями, или элементами структуры. Элементом структуры может быть:

  • переменная любого допустимого типа;

  • битовое поле;

  • функция;

struct [имя_структуры] {

тип_элемента_структуры имя_ элемента1;

тип_элемента_структуры имя_ элемента2;

...

тип_элемента_структуры имя_ элементаN;

} [список_объявляемых_переменных];

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

Использование объединений значительно экономит память, выделяемую под объекты.

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

Так, компилятор Visual C++ выделит 4 байта под следующее объединение:

union unionA {

char ch1;

float f1;} a1={ 'M' };

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

Перечисление задает для каждого мнемонического названия в указываемом множестве свой индекс.

Перечисление может иметь следующее формальное описание:

enum имя_типа {список_значений}

список_объявляемых_переменных;

enum имя_типа список_объявляемых_переменных;

enum (список_элемент=значение);

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

Значение каждого нумератора определяется как значение типа int. По умолчанию первый нумератор определяется значением 0, второй - значением 1 и т.д. Для инициализации значений нумератора не с 0, а с другого целочисленного значения, следует присвоить это значение первому элементу списка значений перечислимого типа.

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