Программирование >>  Программирование на языке c++ 

1 ... 12 13 14 [ 15 ] 16 17 18 ... 159


void swap(int& а, int& b) { int temp;

temp = a;

a = b;

b = temp; } Теперь вызов функции int a=10, b=20; swap(a,b);

приведет к тому, что после ее завершения а=20 и Ь=10 (см. прил. 2.2).

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

Существуют и другие отличия, которые рассматриваются в §2.5 и 2.6.

2.2. Поддержка абстрактных

типов данных

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

1) введением классов, которые содержат описание данных и функций, манипулирующих этими данными. Введением механизмов для ограничения или запрета доступа к компонентам класса. Такие механизмы реализуются приданием компонентам класса атрибутов private (доступ извне запрещен), protected (доступ извне ограничен) и public (доступ извне разрешен). Переопределение существующих в языке операторов для новых типов данных, какими являются классы;

2) введением объектов и средств их инициализации и разрушения. Выше уже говорилось, что класс - это абстракция, объект - это реальность. Когда мы определяем объект, то



выделяем память компьютера для хранения информации о чем-то реальном. Выделенная память делится на поля, описанные в соответствующем классе. Среди указанных полей можно выделить поля, предназначенные для хранения данных. Эти поля могут иметь произвольные (случайные) значения. Однако часто при создании объекта их надо инициализировать, т. е. записать в них некоторые заданные исходные значения. Такими значениями могут быть и указатели на динамически выделенные области памяти. Опуская другие детали, которые будут подробно оговорены далее, скажем, что язык С++ имеет специальное средство для инициализации, называемое конструктором (constructor). Диаметрально противоположное средство, используемое для разрушения объекта (например, освобождение динамически выделенных областей памяти), называется деструктором (destructor);

3) введением специальных средств для поддержки операций копирования объектов. Предположим, описан класс с именем my class. Определим два объекта my obl и ту оЬ2 этого класса:

my class ту оЫ,ту оЬ2;

Выполним некоторые операции с шу оЬ2 и далее запишем выражение:

ту оЫ=ту оЬ2;

Здесь надо определить, как интерпретировать оператор присваивания - (дополнительные пояснения даны в § 5.5). Рассмотрим другой пример:

my class ту оЫ( 10,20);

my class ту оЬ2=ту оЫ;

Здесь ту оЫ( 10,20) - это конструктор с двумя параметрами, значения которых используются для инициализации. Второе выражение говорит о том, что ту оЬ2 должен быть инициализирован так же, как и ту оЫ. В первом примере нам необходимо переопределить оператор присваивания (=). Во втором примере надо ввести специальный конструктор для копирования (сору constructor), который имеет форму: my class (const my class&) (дополнительные пояснения даны в § 5.5);

4) поддержкой специальных конструкций - шаблонов, называемых templates, или, что то же самое, специальных описаний для семейства взаимосвязанных классов (подробно эти



вопросы освещаются в гл. 6). Рассмотрим пример следующего описания:

template <class type> class vector { type real vector;

В действительности шаблон позволяет передать в описываемый Ю1асс тип (в примере type) в виде параметра. После этого можно определить объект так:

vector <int> vect1(cnHcoK apryMeHTOB);

и это будет вектор, компонентами которого являются целые числа, или:

vector <float> уес12(список аргументов);

В этом случае компонентами вектора являются вещественные числа и т. п.;

5) поддержкой специальных средств для обработки ошибочных или исключительных ситуаций (exeption handling). Продолжим рассмотрение нашего примера. Предположим, мы описали класс vector и далее определили объект этого класса v, содержащий п элементов, т. е. мы определили v(n). Что будет, если в процессе работы мы превысим значение п? В общем случае это ошибка и ее надо найти. Предположим, класс vector является библиотечным. При этом чаще всего библиотечные классы разрабатывают одни программисты, а используют другие. Разработчик библиотеки знает, как определить ошибочное значение индекса (п), но не знает, как исправить ошибку. С другой стороны, программист, пользователь библиотеки, в большинстве случаев знает, как исправить ошибку, но не знает, как ее найти. Разрешение этого противоречия заключается в следующем. Разработчик библиотеки заранее предусматривает выявление возможных ошибок и в случае их возникновения информирует пользователя, который может предпринять соответствующие действия. Все эти действия реализуются через специальный механизм, называемый exception handling (см. гл. 7);

6) поддержкой преобразования типов для абстрактных данных (т. е. для типов данных, определенных пользователем). Другими словами, если мы используем выражение:

а = Ь;



1 ... 12 13 14 [ 15 ] 16 17 18 ... 159

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика