|
Программирование >> Программирование на языке c++
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) поддержкой преобразования типов для абстрактных данных (т. е. для типов данных, определенных пользователем). Другими словами, если мы используем выражение: а = Ь;
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |