24. История языка программирования C++. Принципы программирования на языке C++.
C++ является одним из самых популярных и востребованных языков программирования. В отличие от языка C, по сути своей являющегося структурным, где основой всего являются процедуры и функции, в C++ главенствующую роль занимают объекты и классы (подобный подход к программированию называют объектно-ориентированным). Необходимостью создания языка C++ стала, в первую очередь, невозможность выполнения насущных задач, стоявших перед программистами в 1990-е годы, ведущим в то время языком C. Первые попытки исправить эти недостатки стали предприниматься еще в начале 80-х годов. Уже тогда Бьерн Страуструп (корпорация AT&T, монополист телефонной связи на рынке США) стал разрабатывать расширение языка C под условным названием “C с классами”. Стиль ведения разработки вполне соответствовал духу, в котором создавался и сам язык C, - в него вводились многочисленные возможности с целью максимального упрощения работы конкретных людей и групп. Первый коммерческий транслятор нового языка, получившего в итоге название C++, появился в 1983 году. Он представлял собой препроцессор, транслировавший программу в код на C. Однако фактическим рождением языка можно считать выход в 1985 году книги Страуструпа. Именно с этого момента C++ начинает набирать всемирную популярность. Само название «C++» происходит от названия языка C, в котором оператор ++ обозначает инкремент переменной.
Бьерн Страуструп высвободил объектно-ориентированный потенциал C путем перенесения возможностей классов в C. Но при этом, C++ наследует как хорошие, так и плохие стороны С. Другим, но не менее основным источником вдохновения был язык Simula67. Концепция классов (с производными классами и виртуальными функциями) была позаимствована именно из него. Средства перегрузки операторов и возможность помещения объявлений в любом месте, где может быть записана инструкция, напоминает Algol68.
В языке C++ полностью поддерживаются принципы объектно-ориентированного программирования, включая три кита, на которых оно стоит: инкапсуляцию, наследование и полиморфизм. Инкапсуляция в C++ поддерживается посредством создания нестандартных (пользовательских) типов данных, называемых классами. Язык C++ поддерживает наследование. Это значит, что можно объявить новый тип данных (класс), который является расширением существующего.
Хотя язык C++ справедливо называют продолжением C и любая работоспособная программа на языке C будет поддерживаться компилятором С++, при переходе от С к С++ был сделан весьма существенный скачок. Перед тем как начинать осваивать С++, Страуструп и большинство других программистов, использующих С++ считают изучение языка С необязательным.
C++ широко используется для разработки программного обеспечения. Область его применения включает создание операционных систем, разнообразных прикладных программ, драйверов устройств, приложений для встраиваемых систем, высокопроизводительных серверов, а также развлекательных приложений (например, видеоигр). Существует несколько реализаций языка C++ — как бесплатных, так и коммерческих. Наиболее популярны проект GNU, Microsoft, Intel и Embarcadero (Borland). C++ оказал огромное влияние на другие языки программирования, в первую очередь на Java и C#.
Пример структуры программы языка C++
#include <fstream> // набор классов/функций для записи данных из/в файл
/* в зависимости от конкретных нужд количество директив препроцессора, в принципе, может быть любым */
void main (void) // основная функция main; главная программа, с выполнения которой обычно начинается любая программа на C/C++
{
}
Основные элементы языка C++
Типы:
int (целый), float (вещественный), long double (длинный вещественный), char (символьный)
cin // консольный ввод
cout // консольный вывод
Операторы:
if // если
while // цикл с условием (выполняется, пока не выполняется условие)
for // цикл с условием (выполняется, пока выполняется условие)
NB ^_^
Структурное программирование — методология разработки программного обеспечения, в основе которой лежит представление программы в виде блоков.
Процедура — независимая часть программы, которую после однократного описания можно многократно вызвать по имени из последующих частей программы для выполнения определенных действия.
Функция — подпрограмма специального вида, которая, кроме получения параметров, выполнения действий и передачи результатов работы через параметры имеет ещё одну возможность — она может возвращать результат. Вызов функции является, с точки зрения языка программирования, выражением, он может использоваться в других выражениях.
Объектно-ориентированное программирование (ООП) — методология разработки программного обеспечения, в которой основными концепциями являются понятия объектов и классов.
Объект — сущность в адресном пространстве вычислительной системы, появляющаяся при создании экземпляра класса.
Класс — разновидность абстрактного типа данных в ООП, характеризуемый способом своего построения. По сути, класс является моделью ещё не существующей сущности (объекта). Фактически он описывает устройство объекта, являясь своего рода чертежом. Говорят, что объект — это экземпляр класса.
Инкапсуляция — свойство системы, позволяющее объединить данные и методы, работающие с ними, в классе и скрыть детали реализации от пользователя.
Наследование — свойство системы, позволяющее описать новый класс на основе уже существующего с частично или полностью заимствующейся функциональностью.
Полиморфизм — это свойство системы использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта.
Транслятор — программа или техническое средство, выполняющее трансляцию программы. Транслятор обычно выполняет также диагностику ошибок, формирует словари идентификаторов, выдаёт для печати тексты программы и т. д.
Трансляция программы — преобразование программы, представленной на одном из языков программирования, в программу на другом языке и, в определённом смысле, равносильную первой.
Компилятор — программа или техническое средство, выполняющее компиляцию. Машинная программа, используемая для компиляции. Программа, переводящая текст программы на языке высокого уровня в эквивалентную программу на машинном языке. Программа выполняющая (после трансляции) компоновку программы.
Компиляция — трансляция программы на язык, близкий к машинному, и последующая её компоновка.
25. Понятие объекта и класса.
Класс – определённый программистом тип, к которому относятся любые структуры данных, определённые посредством ключевых слов class, struct и union. При определении класса значительно расширяются возможности языка C++, так как в дальнейшем этот класс можно использовать как любой другой тип. Как только класс определён, можно создавать объекты этого класса, каждый из которых имеет члены, определённые в классе. Классы основаны на понятии структуры языка C, которая может содержать поля данных, а также расширяться за счёт поддержки функций. Эти функции-члены (методы) определяют операции над объектами класса. Другой важной функцией классов является наличие закрытых (private) членов, доступ к которым извне не возможен и, более того, узнать о их существовании практически невозможно.
Объект – некоторый набор данных, которые могут иметь связанные с ними функции. Каждый объект является реализацией конкретного класса, который определяет поля данных объекта и его поведение.
Класс – тип, определённый программистом. Этот тип применим ко всему, что создано с использованием ключевого слова class.
Определение класса:
class <имя класса>
{
private:
<объявления>
public:
<объявления>
protected:
<объявления>
};
В конце объявления класса (как и любых переменных, к примеру) обязательно наличие точки с запятой.
Объявления могут включать объявления функций, данных (функции-члены, данные-члены). Данные-члены определяют свойства класса (длину, адрес, форму). Функции-члены определяют поведение класса (действия, которые он может выполнять).
Ключевые слова, задающие область действия (видимости) членов класса:
private (закрытый) – члены класса определяются только внутри класса и вне его использоваться не могут
public (открытый) – члены класса определены как для членов класса, так и вне его
protected (защищённый) – члены класса определены для членов класса, его потомков и друзей (подробнее в вопросе о наследовании)
private, public, protected – атрибуты доступа к членам класса
При отсутствии явного указания области видимости они автоматически определяются как закрытые и недоступны вне определения класса.
Графическая точка на экране монитора (данные – координаты x, y и цвет; функции-члены – инициализация точки, определение цвета). Пример программы:
class GraphPoint
{
private:
int x,y, color;
public:
void inlt (int wx, int wy, int wcolor);
int getcolor (void);
void setnewcolor (int wcolor);
};
26. Скрытие данных и общий интерфейс.
Скрытие данных – это формальный механизм, предотвращающий прямой доступ к внутреннему представлению типа класса из функций программы. Ограничение доступа к членам задается с помощью атрибутов доступа к членам класса, помеченных ключевыми словами public, private и protected . Члены, объявленные в секции public, называются открытыми, а объявленные в секциях private и protected соответственно закрытыми или защищенными.
private (закрытый) – члены класса определяются только внутри класса и вне его использоваться не могут
public (открытый) – члены класса определены как для членов класса, так и вне его
protected (защищённый) – члены класса определены для членов класса, его потомков и друзей (подробнее в вопросе о наследовании)
class <имя класса>
{
private:
<объявления>
public:
<объявления>
protected:
<объявления>
};
Закрытый член доступен только функциям-членам и друзьям класса. Класс, который хочет скрыть информацию, объявляет свои данные-члены закрытыми.
Защищенный член ведет себя как открытый по отношению к производному классу (его потомкам и друзьям) и как закрытый по отношению к остальной части программы.
Согласно принятому соглашению, сначала объявляются открытые члены класса. (в старых программах C++ сначала шли закрытые члены и этот стиль еще кое-где сохранился). В теле класса может быть несколько секций public, protected и private. Каждая секция продолжается либо до метки следующей секции, либо до закрывающей фигурной скобки. Если спецификатор доступа не указан, то секция, непосредственно следующая за открывающей скобкой, по умолчанию считается private.
Интерфейс – открытая часть класса, один из аспектов объекта, абстрактный класс. Это контракт, который обязуется выполнить класс, выполняющий его, а с другой стороны – тип данных, задающий внешнее поведение объектов, внутреннюю структуру и реализацию которого обеспечивает класс.
Один класс может определять несколько интерфейсов.
Интерфейс - смысловая и синтаксическая конструкция в коде программы, используемая для специфицирования услуг, предоставляемых классом или компонентом. Интерфейс определяет границу взаимодействия между классами или компонентами, специфицируя определенную абстракцию, которую осуществляет реализующая сторона. В отличие от многих других видов интерфейсов, интерфейс в ООП является строго формализованным элементом объектно-ориентированного языка и в качестве смысловой конструкции широко используется кодом программы.
В C++ интерфейсов, строго говоря, нет вообще. Механизм, аналогичный интерфейсам (и исторически предшествующий им) реализуется другими средствами чрезвычайно мощной объектной подсистемы этого языка.
C++ поддерживает множественное наследование и абстрактные классы, поэтому отдельная синтаксическая конструкция для интерфейсов в этом языке не нужна. Интерфейсы определяются при помощи абстрактных классов, а реализация интерфейса производится путём наследования этих классов.
Интерфейс реализуется через наследование. Благодаря наличию множественного наследования, ничто не мешает реализовать в одном классе несколько интерфейсов, если в этом есть необходимость (подробнее об этом в вопросах о наследовании и множественном наследовании).