Чтение онлайн

на главную - закладки

Жанры

Шрифт:

Покажем пример с калькулятором. Он был представлен одним исходным файлом. Если он набит, то наверняка были трудности с размещением описаний в правильном порядке и необходимо было бы применить по меньшей мере одно «фальшивое» описание, чтобы компилятор обрабатывал взаимно рекурсивные функции expr, term и prim. Программа заключает в себе четыре части (лексический анализатор, программа синтаксического разбора, таблица имен и драйвер), но это никак не было отражено внутри программы. В общем, калькулятор был написан по-другому. Так это не делается; даже если в этой программе «на выброс» пренебречь всеми соображениями методологии программирования, эксплуатации и эффективности

компиляции, следует разбить эту программу в 200 строк на несколько файлов, чтобы программировать было приятнее.

Программа, которая состоит из нескольких раздельно компилируемых файлов, должна быть согласованной в смысле применения имен и типов, так же, как и программа, которая состоит из одного исходного файла. Вообще это может обеспечить и компоновщик. Компоновщик представляет собой программу, которая стыкует отдельно скомпилированные части вместе. Компоновщик часто именуют загрузчиком. В иМХ'е компоновщик именуется Id. Но компоновщики, которые имеются в большинстве систем, обеспечивают очень слабую поддержку проверки согласованности.

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

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

35. Классы

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

Тип является конкретным представлением некоторой концепции. К примеру, включающийся в C++ тип float с его операциями +, —, * и т. д. обеспечивает ограниченную, но конкретную версию математического понятия действительного числа. Новый тип образуется для того, чтобы дать специальное и конкретное описание понятия, которому ничто прямо и очевидно среди встроенных типов не отвечает.

К примеру, в программе, работающей с телефоном, можно было бы создать тип trunkmodule (элемент линии), а в программе обработки текстов – тип listofpa-ragraphs (список параграфов). Обычно программу, в которой образуются типы, хорошо отвечающие понятиям приложения, понять легче, чем ту, в которой это не происходит. Хорошо выбранные типы, которые определяются авторами программы, делают программу более четкой и короткой. Это также дает возможность компилятору обнаруживать недопустимые применения объектов, которые в противном случае останутся ненайденными до тестирования программы.

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

Класс представляет собой

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

Явной связи между функциями и типом данных не существует. Такую связь можно определить, описав функции как члены:

struct date {

int month, day, year;

void set(int, int, int); void get(int*, int*, int*); void next; void print; };

Функции, описанные данным способом, называются функциями-членами и могут вызываться только для специальной переменной некоторого типа с применением стандартного синтаксиса для доступа к членам структуры.

36. Перегрузка операций

Часто программы имеют дело с объектами, которые являются представлениями абстрактных понятий. К примеру, тип данных int в C++ вместе с операциями +, —, *, / и т. д. является реализацией математического понятия целых чисел. Подобные понятия чаще всего включают в себя множество операций, которые кратко, удобно и привычно описывают основные действия над объектами. Язык программирования может непосредственно поддерживать только очень малое количество таких понятий. Например, понятия, комплексная арифметика, матричная алгебра, логические сигналы и строки не имеют прямой поддержки в C++. Классы дают метод спецификации в C++ представления неэлементарных объектов с множеством действий, которые выполняются над данными объектами. Часто определение того, как работают операции на объекты классов, дает возможность обеспечить более удобную запись для манипуляции объектами классов, чем та, которую можно получить, применяя только основную функциональную запись.

К примеру:

class complex {

double re, im;

public:

complex(double r, double i) { re=r; im=i; }

friend complex operator+(complex, complex);

friend complex operator*(complex, complex);

};

дает возможность просто определить понятие комплексного числа, в котором число является парой чисел с плавающей точкой двойной точности, работа с которыми производится операциями + и *. Человек определяет смысл операций + и * с помощью определения функций с именами operator+ и operator*. Если, к примеру, имеем b и c типа complex, то b+c значит (по определению) operator+(b,c). Теперь существует возможность приблизить простую интерпретацию комплексных выражений. К примеру:

void f

{

complex a = complex(1, 3.1);

complex b = complex(1.2, 2);

complex c = b;

a = b+c;

b = b+c*a;

c = a*b+complex(1,2);

}

37. Производные классы

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

Поделиться:
Популярные книги

Он тебя не любит(?)

Тоцка Тала
Любовные романы:
современные любовные романы
7.48
рейтинг книги
Он тебя не любит(?)

Рассвет русского царства. Книга 2

Грехов Тимофей
2. Новая Русь
Фантастика:
альтернативная история
попаданцы
историческое фэнтези
5.00
рейтинг книги
Рассвет русского царства. Книга 2

Князь Андер Арес 4

Грехов Тимофей
4. Андер Арес
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
попаданцы
5.25
рейтинг книги
Князь Андер Арес 4

Адаптация

Кораблев Родион
1. Другая сторона
Фантастика:
фэнтези
6.33
рейтинг книги
Адаптация

Санин (сборник)

Арцыбашев Михаил Петрович
Русская классика XX века
Проза:
русская классическая проза
роман
повесть
рассказ
5.80
рейтинг книги
Санин (сборник)

Самые знаменитые произведения писателя в одном томе

Брэдбери Рэй Дуглас
Фантастика:
фантастика: прочее
4.00
рейтинг книги
Самые знаменитые произведения писателя в одном томе

Царь-Холод, или Почему вымерзают русские

Кара-Мурза Сергей Георгиевич
Научно-образовательная:
политика
5.00
рейтинг книги
Царь-Холод, или Почему вымерзают русские

Русская драматургия XVIII – XIX вв. (Сборник)

Пушкин Александр Сергеевич
Поэзия:
драматургия
6.25
рейтинг книги
Русская драматургия XVIII – XIX вв. (Сборник)

Неудержимый. Книга XIV

Боярский Андрей
14. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Неудержимый. Книга XIV

Война. Krieg. 1941—1945. Произведения русских и немецких писателей

Быков Василий Владимирович
Проза:
военная проза
5.00
рейтинг книги
Война. Krieg. 1941—1945. Произведения русских и немецких писателей

Махабхарата: Ревизия смыслов

Лосев Петр Степанович
Анализ индуистских мифов
Религия и эзотерика:
самосовершенствование
религия
буддизм
5.00
рейтинг книги
Махабхарата: Ревизия смыслов

Сборник "Этические уравнения"

Головачев Василий Васильевич
Фантастика:
научная фантастика
4.75
рейтинг книги
Сборник Этические уравнения

Гоголь в воспоминаниях современников

Пушкин Александр Сергеевич
Документальная литература:
критика
биографии и мемуары
5.00
рейтинг книги
Гоголь в воспоминаниях современников

Против энтропии (Статьи о литературе)

Витковский Евгений
Документальная литература:
публицистика
5.00
рейтинг книги
Против энтропии (Статьи о литературе)