А.4. C++

А.4. C++

Происхождение

Язык программирования C++ был разработан Бьерном Страуструпом, сотрудником AT&T Bell Laboratories. Непосредственным предшественником C++ является С with Classes, созданный тем же автором в 1980 году. Язык С with Classes, в свою очередь, был создан под сильным влиянием С и Simula. C++ - это в значительной степени надстройка над С. В определенном смысле можно назвать C++ улучшенным С, тем С, который обеспечивает контроль типов, перегрузку функций и ряд других удобств. Но главное в том, что C++ добавляет к С объектную ориентированность.

Известны несколько версий C++. В версии 1.0 реализованы основные механизмы объектно-ориентированного программирования, такие как одиночное наследование и полиморфизм, проверка типов и перегрузка функций. В созданной в 1989 году версии 2.0 нашли отражение многие дополнительные свойства (например, множественное наследование), возникшие на базе широкого опыта применения языка многочисленным сообществом пользователей. В версии 3.0 (1990) появились шаблоны (параметризованные классы) и обработка исключений. Комитет ANSI по C++ (X3J16) недавно одобрил предложения по введению пространств имен (что соответствует нашему обозначению категорий классов) и проверки типов во время исполнения.

Первые компиляторы C++ строились на основе препроцессора для языка С, названного cfront. Поскольку этот транслятор создавал промежуточный код на С, он позволил очень быстро перенести C++ практически на все UNIX-системы. Сейчас почти на всех платформах созданы (в том числе коммерческие) "настоящие" компиляторы C++.

Обзор

Страуструп пишет: "C++ создавался с целью избавить автора и его друзей от необходимости программировать на ассемблере, С или других современных языках такого уровня. Главной задачей было придумать язык, на котором удобно писать хорошие программы и с которым программисту приятно работать. C++ никогда не проектировался на бумаге. Его проектирование, документирование и реализация выполнялись одновременно" [13]. C++ исправил многие недостатки С и ввел описания классов, контроль типов, перегрузку функций, управление памятью, постоянные типы, ссылки, встраиваемые функции, производные классы и виртуальные функции [14].

Характеристики C++ приведены в табл. А-3.  

Абстракции  Переменные экземпляра Методы экземпляра Переменные класса Методы класса  Да Да Да Да 

Инкапсуляция  Переменных Методов  Открытые, защищенные, закрытые Открытые, защищенные, закрытые 

Модульность  Разновидности модулей  файл 

Иерархии  Наследование Шаблоны Метаклассы  Множественное Да Нет 

Типизация  Сильная типизация Полиморфизм  Да Да (одиночный) 

Параллельность  Многозадачность  Непрямая (посредством классов) 

Сохраняемость  Долгоживущие объекты  Нет 

Таблица А-3. C++.

Пример

Снова вернемся к задаче определения фигур. В C++ принято описывать интерфейсную часть классов в заголовочных файлах. Мы можем написать:

struct point {

int x; int y;

};

class Shape { public:

Shape(); void setCenter(Point p}; virtual void draw() = 0; Point center() const;

private

Point theCenter;

};

class Circle : public Shape { public:

Circle(); void setRadius(int r); virtual void draw(); int radius() const;

private:

int theRadius;

};

class Rectangle : public Shape { public:

Rectangle(); void setHeight(int h); void setWidth(int w); virtual void draw(); int height() conat; int width() const;

private:

int theHeigh; int theWidth;

};

class SolidRectangle : public Rectangle { public:

virtual void draw();

};

Определение C++ не предполагает наличия библиотеки классов. Для наших целей мы предположим наличие программного интерфейса Х Windows и глобальных объектов Display, window, GraphicsContext (требуемых xlib). Теперь можно завершить разработку, написав в отдельном файле реализацию методов, перечисленных выше:

Shape::Shape() {

theCenter.x = 0; theCenter.y = 0;

};

void Shape::getCenter(Point p) {

theCenter = p;

};

Point Shape::center() const {

return theCenter;

};

Circle::Circle() : theRadius(0) {};

void Circle: :setRadius( int r) {

theRadius = r;

};

void Circle::draw() {

int x = (center().x - theRadius); int y = (center().y - theRadius); XDrawArc(Display, Window, GraphicsContext, x, y,   (theRadius ? 2), (theRadius * 2), 0, (360 ? 64));

};

int Circle::radius() const {

return theRadius;

};

Rectangle::Rectangle() : theHeight(0), theWidth(0) {};

void Rectangle::setHeight( int h) {

theHeight = h;

};

void Rectangle::setWidth( int w) {

theWidth = w;

};

void Rectangle::draw() {

int x = (center().x - (theWidth / 2)); int y = (center().y - (theHeight / 2)); XDrawRectangle(Display, Window, GraphicsContext, x, y, thewidth, theHeight);

};

int Rectangle::height() const {

return theHeight;

};

int Rectangle::width() const {

return thewidth;

};

void SolidRectangle::draw() {

Rectangle::draw(); int x - (center().x - (width() / 2)); int y - (center().y - (height() / 2)); gc oldGraphicsContext = GraphicsContext; XSetForeground(Display, GraphicsContext, Gray); XDrawFilled(Display, Window, GraphicsContext, x, y,   width(), height()); GraphicsContext = OldGraphicsContext;

};

Ссылки

Основной ссылкой по C++ является "Annotated C++ Reference Manual" Эллис и Страуструпа [15]. Кроме того, Страуструп [16] предложил углубленный анализ языка и его использования в контексте объектно-ориентированного проектирования.