Р.У. Себеста - Основные копцепции языков программирования (2001) (1160794), страница 114
Текст из файла (страница 114)
Однако. если абстрактный тип ланных в я >ыс Лба . являе<ся указателем. кол клиента должен быть заново скомпилировал после и< лпфи. ,<и определения типа. Недостатком ограничения, введенного в языке М<ч!ип<-' лля з,испей. является вынужденное их использование. что приводит к снижению;ровня ., пасности программы.
Компромиссным решением этой проблемы является тп> <Ьакт. ь языке Моди!а-" указатели не ииипиализир)ются по умолчанию нулевь«», <росом позволяет клиентам объявлять переменную аострактиого типа и использовагь се ло и> зк оиа станет хранить адрес некоторой ячейки. вьшсленной< в динамической пап я > и 10.5.3. Абстрактные типы данных в языке С++ Я>ык С>.< был создан п)тек< добавления попых свойсгв в язык С. Первы пал<ими лнснием стала поддержка обьектио-орле>пированно<о программирования. 1!оскольолними из основных компонентов объеьтио-ориентированного программирования яв=-.
тся абстрактные типы данных. язык С -'>, очевидно. должен их поддерживать. <1 то время как языки Лда и Мо<(п!а-' обеспечивают иикапсуляпик, которая мо кет .. шьзоваться при люделировании абстрактных типов данных в языке С, <- ввс <оно по:. пе класса, который непосрелственно поддерживает абстрактные типы далнь<к. В язы<! -- классы — типы. а пакеты языка Ада и модули языка Мо<)п!а-2 типами не яаляют!!акеты и модули импортируются, позволяя импортируюшей программной слииипс ьявлять переменные любого типа.
определенного в пакете или молуле. В программе и,> <че С++ переменные объявляются как сушности. ил<сюшие тип данного класса 1'алим эз>ом, классы гораздо больше похожи на встроенные типы. чем пакеты или мпл)ли :-. граь<мная единица. которая видит пакет в языке А<!а или молуль в языке Мо<!о!а-". ' с< т доступ к любым открытым сушностям просто по их именам. Программная етини.. на языке С++. которая обьявляет экземпляр класса. также имеет доступ к лн бым о<- ° гь:тым сушностям в этом классе. но только через экземпляр этого класса. 10.5.3.
1. Инкагзсуляцмя Классы в языке С++ основаны на классах языка 51М()(.А 67 и являются рас<инрсни««ипа аггпсс языка С. Поскольку язык С++ является наследником языка 51МГ!.А А7. .:зсс в С вЂ” это описание типа ланных. Данные, определенные в классе. называются даннымн-членамн (<!а!а <пе>пЬсгя!. и -.<нкпии, определенные в классе, — функциями-членамн (шетЬег й>псг!опз).
Все >л:мпляры класса совместно используют единый набор функций-членов, но кажлый экечпляр получает свой собственный набор данных-членов класса. Несмотря на то что >кемпляры класса могут быть также и статическими (я!або), и динамическими (Ьеар, >е<п!с). мы рассмотрим только автоматические классы (згас)<-дупак!с). Экземпляры тз. < х классов всегда создаются при объявлении объекта. Кроме того, экземпляр класса пе",естает сушествовать, выходя из своей области видимости. Классы могут иметь динами-еские данные-члены, так что даже если экземпляр класса является автоматическим. <>и может включать в себя динамические данные-члены, которые размешаются в линамичсской памяти. Для управления динамической памятью в языке С++ предусмотрены операторы пем и с$е1епе. 10.5.
Примеры абстракции данных в разных языках Функция-член класса описывается двумя разными способами. В классе можно поместить либо полное определение функции, либо только ее заголовок. Когда в определении класса приводятся и заголовок, и тело функции-члена, зта функция-член по умолчанию является !пйпе-подставляемой. Это означает, что ее код будет помешен в код вызывающей функции вместо использования обычного вызова и возврата управления. Если в определении класса приведен только заголовок функции-члена, то ее полное определение помещается вне класса и компилируется отдельно. Рекомендуется делать кй)пе-подставляемымн небольшие по размеру функции-члены, поскольку они нс занимают много места в коле клиента, и при этом экономится время на вызов функции и возврат из нее. 10.5.3.2.
Сокрытие информации Класс в языке С+ может содержать как скрытые, так н видимые сушности. Сущности, которые должны быть скрыты, помешаются в разделе ргдзгасв, а видимые, или открытые, сущности записываются в разделе риЫйс. Таким образом, раздел рпЪ11с описывает интерфейс обьектов класса. Сушествует также третья категория видимости, ргопессес)„которая в контексте наслеловання обсуждается в главе ! !. Язык С++ дает возможность пользователю включать в определение класса функции, называемые конструкторами (сопкгисгогз), которые используются для инициализации данных-членов вновь создаваемых объектов. Конструктор может также размешать динамические данные-члены нового объекта в динамической памяти.
Конструкторы неявно вызываются при создании объекта класса. Конструктор имеет то же имя, что и класс, частью которого он является. Это выглядит странно, но вполне безопасно. В классе может быть несколько конструкторов, при этом они, очевидно, являются перегруженными функциями. Конечно, каждый из них должен иметь уникальный набор параметров. В языке С++ класс может также содержать функцию, называемую деструктором (безгпкгог), которая неявно вызывается прн выходе экземпляра класса нз своей области видимости.
Все динамические объекты существуют до тех пор, пока они не будут явно уничтожены оператором сзе1епе. Как указывалось выше, автоматические экземпляры класса могут содержать динамические данные-члены. Деструктор такого экземпляра может содержать оператор с(е1все, для того чтобы освобождать области динамической памяти, занимаемые динамическими данными-членами.
Деструкторы часто используются как средство отладки, при этом они просто выводят на экран или на принтер значения некоторых или всех данных-членов объекта перед тем, как они будут удалены из памяти. Имя деструктора — это имя класса, перед которым стоит гильда (-).
Ни конструктор, ни деструктор не возвращают никаких значений и не используют операторы гепигп. И конструкторы, и деструкторы можно вызывать явно. 10.$.3.3. Пример Примером абстрактного типа данных в языке С+~ снова служит стек. Мзпс1ис)е <зоаггеаю. )з> с1аев вгас!с ( ргдзгапе: //** Эти члены класса являются видиыыми только для //других членов класса или друзей //(см. Раздел 10.5.3.4) йпх *атас!с рГгз зпп вах 1еп; йпГ. Гор рсгг Глава 10.
Абстрактные типы данных риЬ11о: //*" Эти члены являются видимыми для клиентов вгаск() [ всас]с рсг = пен дпе [100]; //** Конструктор шах 1еп = 99; гор ргг = -1; -всас]с() (с)е1еке [] всаск рсг;)т //** Деструктор чоЫ рцвЬ(апе пишЬег) ( дк (гор ргг == шах 1еп) соцс « "Ошибка в функции рцвЬ вЂ” стек полон~п"; е1ве вгасх ргг[++гор рсг] = пцшьегт ) чодс[ рос() ( дй (Сор рсг == -1) соцс« "Ошибка в функции рор — стек пуст'~п"; е1ве Гор рсг--т ) дпе Гор(] (гееигп (всас]с рсг [сор рсг) ]; ] дпе ешрсу() (гетпгп (Гор ртг == -1); ) Мы обсудим только некоторые аспекты данного определения класса, поскольку нет .акой необходимости разбираться во всех деталях этого кода.
Директива препроцес: «а *1пс1ис)е используется для обеспечения видимости стандартного пакета ввода и -=.вола 1овггеаш, который содержит простой поток вывода, используемый кодом ъекта сонг. Класс всас]с содержит три данных-члена — вгасх ргг, п1ах 1еп и рг г. Все они являются закрытыми данными-членами. Этот класс содержит также . тыре открытые функции-члена — рцвЬ, рор, Гор и ешрту, а также конструктор и ыструктор. Конструктор использует оператор выделения динамической памяти пен для тычещения в куче 100 элементов типа дпе. Он также инициализирует переменные еп и гор ргг. Деструктор предназначен для освобождения памяти.
занятой .;сивом, который используется для реализации стека, когда объект типа ягаск выхо.: т нз своей области видимости. Этот массив размещается в динамической памяти кон.тр] ктором. Поскольку в классе содержатся тела функций-членов, все они являются по молчанию (пйпе-подставляемыми. Ниже приводится пример программы на языке С++, которая использует абстрактный -нп ланных всас)т. чодс[ ша1п() ( дпс ор опе; всас)с вайт //** Создает зкзеыпляр класса всасй вс)с.рцвЬ(42)] вс)т.рцвЬ(17) т гор опе = вг]т.сор() т вгк.рор(); Когда во время выполнения программы достигается ее конец. переменные гор опе и я" )с выходят из области своей видимости, что приводит к неявному вызову деструкто- ] 0.5.