Выбрать главу

Первые компиляторы 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] предложил углубленный анализ языка и его использования в контексте объектно-ориентированного проектирования.