Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

алгоритмы и програмування / Книги / Шилдт Г. C++ Руководство для начинающих

.pdf
Скачиваний:
5696
Добавлен:
19.04.2015
Размер:
19.93 Mб
Скачать

22 Глава 1. ОСНОВЫ С++

Если и существует один компьютерный язык, который определяет суп) со­

BpeMeHHoro программирования, то, безусловно, зто С++. Язык С++ предназна­

чен для разработки высокопроизводительного llрограммного обеспечения. ЕI"O синтаксис стал стандартом для других профессиональных языков программи­

рова.ния, а его принципы ра.lработки отражают идеи развития вычислительной

техники в целом. С++ послужил фундаментом для разработки языков будущего. Например, K3KJava, так и С# - прямые ПОТОМIСИ языка С++. СеГОДIIЯ быть про­ фессиональныM программистом высокого клас,:а означает быть компетентным в

С++. С++ - это ключ J( современному програм\iированию.

Цель этоro модуля - представить С++ в историческом аспекте, проследить

его истоки, проанализировuть его взаимоотношения с неrюсредствснным пред­

шественником (С), рассмотреть ero возможности (области ПРИМСНСIIИЯ) и ЩНШ­ ципы программирования, которые он поддерживает. Самым трудным 8 изучении

языка программирования, безусловно. является то, что НИ один его элемеlН не

существует изолировашю от других. Компоненты языка работают вместе, можно

сказать, в дружном "коллективе". Такая тесная взаимосвязь усложняет рассмо­

трение одного аспекта С++ без изучения других. Зачастую обсуждение одного

средства предусматривает предварительное знакомство с дрynlМ. Для преодоле­

ния подобных трудностей в этом модуле ПРИВОДIIТСЯ краткое описание таЮIХ эле­ ментов С++, как общий формат С++-программы, основные инструкции управле­ ния и операторы. При этом мы не будем пока УI'лубляться в детали, а сосредото­

чимся па общих концепциях создания С++-программы.

ВАЖНОI

 

,ММ ИЭИСТnРИId СО3ДnWИАu-С+*

/

История создания С++ начинается с языка С. И немудреlfО: С++ построеllllа фундаменте С. С++ и в самом деле представляе1" собой супермножество язЬ/ка С. С++ можно назвать расширенной и улучшешю~r версией языка С. предназначен­

ной для поддержки объектно-ориентированного lIрограммирования (ero ПРИН­

ципы описаны ниже в этом модуле). С++ также включает ряд других усовершен­ ствований ЯЗЫI(а С, например расширенный набор библиотеЧIIЫХ функций. При Э1'ОМ "вкус И запах" С++ унаследовал непосредственно из языка С. Чтобы до кон­

ца понять и оценить достоинства С++, необходимо понять все "как" и "почему" n

отношении языка С.

С++: PYI<OBOACтeO ДМ! начинающих 23

Язык С: начало эры современного

программирования

Изобретение языка С отмстило начало новой эры COBpeMeHHoro программи­ рования. Его влияние нельзя было переоцеtlить, поскольку он коренным образом

изменил подход ~ программированию и его восприятие. Его синтаксис и принци­

I1Ы разработки оказали влияние на ВСС последующие компьютерные языки, по­

этому язык С можно назвать одной из основных революционных СИЛ в развитии

вычислительной техники.

Язык С изобрел Дэнис Ритчи (Dennis Ritchie) для компьютера РОР-ll (раз­ работка компании ОЕС - Digita) Equipment Corporation), который работал под

управлением операционной системы (ОС) UNIX. Язык С - это результат про­

цесса разработки, который сначала был связан с другим языком - BCPL, создан­ ным Мартином Ричардсом (Martin Riсlшгds). Язык BCPL ИНДУUИРОВaJI появле­ ние языка, получившего lIазвание В (его автор - Кен Томпсон (Кеп Thompson»,

который в свою очередь в lIачале 70-х годов привел к разработке языка С.

Язык С стал считаться первым современным "языком программиста", по­

скольку до его изобретения l(!Омпьютерные языки в основном разрабатывались либо как учебные упражнения, либо как результат деятельности бюрократиче­ ских структур. С языком С все обстояло иначе. Он был задуман и разработан ре­

альными, практикующими программиста.\1И и отражал их подход к I1РОГРамми­

рованию. Его средства были многократно обдуманы, отточены и протестированы людьми, которые действительно работали с этим языком. В результате этого про­

цесса появился язык, который понравился MHomM программистам-практикам и

быстро распространился по всему миру. Ero невиданный успех обусловило то,

что он был разработан программистами для программистов.

Язык С возник в результате реВОЛЮ1{ИИ cmpyкmypup08a,molO npozpa.AWupo-

вания БО-х годов. До появлеllИЯ структурироваююго программировзния 060-

значились проблемы в написания больших программ, поскольку программисты

пользовались логикой, которая ПРИ80ДИJlа к созданию так наЗЫI~аемого "cnareT-

ти-кода", состоящего из множества переХОДО8, последовательность которых было

трудно проследить. В структурированных ЯЗЫI<аХ программирования эта пробле­

ма реmалась путем Ifсполь:ювания хорошо определенных инструкций управле­ ния, подпрограмм, локальных персменных и других средств. Появление структу­

рированных языков позволило писать уже довольно большие nporpaмМbl.

Несмотря на то что в то время уже существовали другие структурированные

языки (например Pascal), С стал первым языком, в котором успешно сочеталисъ

мощь, изящество и выразительность. Ero лаконизм, простота синтаксиса и фило­ софия БЫЛII I-laСl'ОЛЬКО ПРI1Dлекательными, что в мире программирования непо-

+

+

u-

2i

aI

О

:I:

U

О

24 !Лава 1. Основы С++

стижимо быстро образовалась целая армия его приверженцев. С точки зрения

сегодняшнего ДНЯ этот феномен даже трудно понять, но, тем не менее, язык С

стал своеl'ородадолrожданным "свежим ветром". который вдохнул в программи­

рование новую жизнь. В результате С был общепризнан как самый популярный структурированный язык 1980-х годов.

ПреДПОСblЛКИ возникновения языка С++

Приведенная выше характеристика языка С может вызвать справедливое не­ доумение: зачем же тогда, мол, был изобретен я;tык С++? Если С - такой успеш­ ный и полезный язык, то почему возникла необходимость в чем-то еще? Оказы­ вается, все дело в сложности. На протяжении всей истории программирования

усложнение программ заставляло программистов искать пути, которые бы позво­

лили справиться со сложностью. Язык С++ можно считать одним из способов ее

преодоления. Попробуем лучше раскрыть взаимосвязь между постоянно возрас­

тающей сложностью программ и путями развития языков программирования.

Отношение к программированию резко изменflЛОСЬ с момента изобретения КО.\{­

пьютера. Например, программированиедля первых вычислительных машин состоя­

ло в переключении тумблеров на их передней панели таким образом, чтобы их поло­

жение соответствовало двоичным кодам машинных команд. Пока длины программ не превышали нескольких сотен команд, такой метод еще имел право на существо­

вание. Но по мере их дальнейшего роста был изобретен язык ассемблер, чтобы про­

граммисты могли использовать символическое представление машинных команд.

Поскольку программы продолжали расти в размерах, желание справиться с более высоким уровнем сложности ВЫЗВало появление ЯЗЫКОВ высокого уровня, разработ­ ка которых дала программистам больше инструментов (новых и разных).

Первым широко распространенным языком программирования был, конечно же, FORTRAN. Несмотря на то что это был очень значительный шаг на пути про­ гресса в области программирования, FORTRAN все же трудно назвать языком, который способствовал написанию ясных и простых для понимания программ.

Шестидесятые годы двадцатого столетия считаются·периодом появления струк­ турированного программирования. Именно такой метод программирования и

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

героических усилий со стороны программиста. Но если программный проект до­

стигал определенного размера, то даже с использованием упомянутых структури­

рованных методов его сложность резко возрастала и оказывалась непреодолимой

для возможностей программиста. К концу 70-х к "критической" точке подошло

довольно много проектов.

С++: PYI<080ACTBO ДМl начинающих 25

Решитьэту проблему "DЗЯЛИСЬ" новыетехнолоmи программирования. Одна из них получила название объектно-ориентированного nрограм.мuрованuя (ООП).

Вооружившись методами 00 П, программист мог справляться с программами го­

раздо большего размера, чем прежде. Но язык С не поддерживал методов ооп. Стремление получить объектно-ориентированную версию языка С в конце кон­

цов и привело к созданию С++.

Несмотря на то что язык С был одним из самых любимых и распространен­

ных профессиональных языков программирования, настало время, когда его возможности по написанию сложных программ достигли своего предела. Же­

лание преодолеть этот барьер и помочь программисту легко справляться с еще

более объемными и сложными программами - вот что стало основной причи­

ной создания С++.

Рождение С++

Язык С++ был создан Бьерном Страуструпом (Bjame Stroustrup) в 1979 году

в компании ВеН Laboratories (г. Муррей-Хилл, шт. Нью-Джерси). Сиачала но­ вый язык получил имя "С с классами" (С with Classes), но в 1983 году он стал

называться С++.

Страуструп построил С++ на фундаменте языка С, включающем все его

средства, атрибуты и основные достоинства. Для него также остается в силе

принцип С, согласно которому программист, а не язык, несет ответственность

за результаты работы своей программы. Именно этот момент позволяет понять, что изобретение С++ не было попыткой создать новый язык программирова­ ния. Это было скорее усовершенствование уже существующего (и при этом

весьма успешного) языка.

Большинство новшеств, которыми Страуструп обогатил язык С, было предна­ значенодля поддержки объектно-ориентированного программирования. По сути,

С++ стал объектно-ориентированной версией языка С. Взяв язык С за основу,

Страуструп подготовил плавный переход к ооп. Теперь, вместо того, чтобы из­ учать совершенно новый язык, С-программисту достаточно было·освоить только ряд новых средств, и он мог пожинать плоды использования 06ъектно-ориенти­

рованной технологии программироваиия.

Создавая С++, Страуструп понимал, иасколько важно, сохранив изначальную

суть языка С, Т.е. его зффективность, гибкость и принципы разработки, внести в

него поддержку объеКТlю-ориеllТИРОВaJlНОl"O орограммирования. К счастью, эта

цель была достигнута. С++ по-прежнему предоставляет программисту свободу

действий и власть над компьютером (которые были присущи языку С), значи­ тельно расширяя при этом его (программиста) возможности за счет использова­

ния объектов.

:j: u

о

1:

()

О

26 Глава 1. Основы С++

Несмотря на то что С++ изначально был I-I.щелен на поддержку очень БО.1Ь­

ПlИX программ, этим, Конечно же, его использование не ограничивалось. И 8 са­

мом деле, объектно-ориентированные средства С++ можно эффективно приме­ пять практически к любой задаче программирования. Неудивительно, что С++

используется для создания компиляторов, peДёJKTOpOB, компьютерных игр и про­

грамм сетевого обслуживания. Поскольку С++ обладает эффективностью языка

С, то программиое обеспечение многих высокоэффективных систем построено с

использованием С++. Кроме того, С++ - это язык, который чаще всего выбира­ ется для Wiпdоws-программирования.

Эволюция С++

С момента изобретения С++ претерпел т~,и крупные l1ереработки, причем

каждый раз язык как ДОПОJlllЯЛСЯ новыми средствами, так и в чем-то изменялся.

Первой ревизии он был подвергнут в 1985 году. второй - в 1990, а третья произо­

шла в процессе стандартизации, который актюшзировался в начале 1990-х. Спе­

циально для этого был сформирован объединенный АNSI/ISО-комитет (я был

его членом), который 25 января 1994 года принял первый проект предложенного

на рассмотрение стандарта. В этот проект БЫЛII включены все средства, впервые

определенные Страуструпом, и добавлены новые. Но в целом он отражал состоя­ ние С++ на тот момент времени.

Вскоре после завершения работы над первым проектом стандарта С++ про­

изошло событие, которое заставило значительно расширить существующий

стандарт. Речь идет о создании'Ллександром Степановым (Alexander Stepanov)

стандартной библиотеки

шаблонов (Standar<\ Template Library - STL). Как

вы узнаете позже, STL -

это набор обобщенных функций, которые можно ис­

пользовать для обработки данных. Он доволыio большой по размеру. Комитет ANSI/ISO проголосовал за включение STL в спеllИфикauию С++. добавление STL расширило сферу рассмотрения средств С++ далеко за пределы исходнuго определения ЯЗblка. Однако ВlUlючение STL. помимо прочего, замедлило процесс стандартизации С++, причем довольно сущест)}еllllO.

Помимо STL, в сам ЯЗblК было добавлено н('сколько новых средств и внесено

множество мелких изменений. Поэтому верси.il С++ после рассмотрения коми­

тетом по стандартизацЮ1 стала намного больше и сложнее по сравнению с ис­ ходным вариантом Страуструпа. Конечный результат работы комитета датиру­ ется 14 ноября 1997 года, а [lеалыlO ЛNSI/ISО-стандарт языка С++ увидел Сllет

в1998 году. Именно эта спецификация С++ ОnЫЧJlО называется Standard С++.

иименно она описана в данной книге. Эта версия С++ поддерживается всеми

ОСНОВJlЫМИ C++-компилятораМII, включая Vistl<ll С-Н (Мiсrоsоft) и С++ Buildct·

С++: руководство для начинающих 27

(Borland). Поэтому код программ, приведенных в этой ЮiИге. полностью приме­

ним ко всем современным С++-средам.

ВАЖНО!

IIII..C8S13hC** с ЯЗЬ'КQМИ 'nуо И с#.

ПОМИМО С++, существуют два других современных языка программирования: java н С#. Язык.Jаvа разработан компанией Sun Microsystems, а С# - компанией

Мicrоsоft. Поскольку иногда возникает путаница относительно того, какое ОТIЮ­

шеtlНС эти два языка имеют к С++, попробуем внести ясность о этот вопрос.

С++ является родительским языком· дляjаv~ и'С#. И хотя разработчикиjаvа

и С# добаВIIЛИ к псрвоисточнику, удалили из него или модифицировали различ­

ные средства, D целом синтаксис этих трех языков практически идентичен. Более

того, объектная модель, используемая С++, подобна объеК11iЫМ моделям языков

.Java и С#. Наконец, очень сходно общее впечатщшие и ощущение от использо­ вания всех этих языков. Это зиачит, что, зная С++, вы можете легко изучитьjаvа или С#. Схожесть синтаксисов и объектных моделей - одна из причин быстрого

освоения (11 одобрения) этих двух языков многими опытными С++-программи­ стам". Обратная ситуация также имеет место: если вы знаетеjаvа или С#, изуче­

ние С++ не доставит вам хлопот.

Основное различие между С++, Java и С# заключается в типе вычислитель­

ной среды, для которой разрабатывался каждый из этих языков. С++ создавался

с целью lIаписания высокоэффективных программ, предназначеНJlЫХ для выпол­ нения под управлением Оllределенной операционной системы и в расчете на ЦП конкретного типа. Например, если вы хотите написать высокоэффективную про­

грамму для выполнения на процессоре Intel Pentium под управлением операци­ онной системы Windows, лучше всего использовать для этого язык С++.

Языки java и С# ра.lработаны в ответ на Уliикальные потребности сильно рас­

пределенной сетевой среды Internet. (При разработке С# также ставилась цель

упростить СО~iДание программных компонентов.) Intemet связывает множество

различных типов ЦП и операционных систем. Поэтому возможность создания межплатформеНIIОГО (совместимого с несколькими операционными средами) переносимого программного кода для 1nternet при решеНИII некоторых задач ста­

ло определяющим УСЛОDием при выборе языка программирования.

IIерпым языком, отвечающим таким требованиям, был ]ava. Используя Java.

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

TaKIIM образом. Java-программа может свободно "бороздить просторы" Intemet.

Несмотря на то чтоjаvа позволяет создавать переиосимый ПРОJ"раммный код, ко-

+

+

u

~

аз

О

:J:

()

О

28 Глава 1. Основы С++

торый работает в сильно распределенной среде, цена этой переносимости - эф­ фективность. )аvа-программы выполняются медленнее, чем С++-программы. То же справедливо и дЛЯ С#. Поэтому, если вы хотите создавать высокоэффектив­ ные приложения, используйте С++. Если же вам нужны переносимые програм­ МЫ, используйте]аvа или С#.

Спросим у опытного программиста

Вопрос. каким образом. 1I3ы'"Java u С# позволяют созihuJamьм.eжnлoтфopм.ен.­

ные (coвм.ecmuм.ыe с неclcолышAIu оrrераЦUОННbllllll cpeдaмu) nepeнocu­ JltЫe npozpaJl4JllЫ u м..ем.у С nом.ощью С++ невО3АСОЖНО iJocmuчь mmc010

жериультamа?

Ответ. Все дело в типе объектного кода, создаваемого компиляторам В результате работы С++-компилятора мы получаем машинный код, ко­

торый непосредственно выполняется конкретным центральным процеl;­

сором (ЦП). Друrими словами, С++-компилятор связан с конкретными ЦП и операционной системой. Если нужно выполнить С++-проrpамму

под управлением другой операционной системой, необходимо пt>реком­

пилировать ее и получить машинный lCOn, подходящий для данной среды.

Поэтому, чтобы С++-программа могла выполняться в различных средах,

нужно создать несколько выполняемых версий этой проrpaммы.

Используя языкиjаvа и С#, можно добиться переносимости програММНО­

го кода за счет специальной компиляции проrpамм, позволяющей пере­

вести исходный проrpаммный код на промежуточный язык, именуемый nсевдо"одом. Для java-проrpамм этI)т промежуточный язык называют

байт-"одом (bytecode), Т.е. машинно-независимым кодом, генерируемым jаvа-комnилятором. В результате КОМНИЛЯЦИИ C#-nporpaммw получается не исполняемый I(ОД, а файл, который содержит специальный псевдоко;х,

именуемый nромежуmочнbI.М.язы."ОА! Мicrosоft(Microsoft Intemlediate

Language - MSI L). В обоих случаях :IТOT псевдокод ВЫnОJПfяется специ­

альной операционной системой, которая дляjаvа называется вuртуШlЬ­

НОй машuнойjаvа Оауа Virtual MaclUne - jVM), а ДЛЯ С# - средством Соттоп Language Runtime (CLR). Следовательно, java-программа сможет выполняться D любой среде, содержащей JVM, а C#-проrpамма -

в любой среде, в которой реализовано средство CLR.

ПОСКОЛЬКУ специальные операционные системы ДЛЯ выполнения java-

иС#-кода занимают промежуточное местоположение между проrpаммой

ицп, выполнениеjаvа- и С#-программ сопряжено с расходом определен­ ных системных ресурсов, что совершеllНО излишне при ВЫПОJПfеНЮI C+~'­

программ. Вот поэтому С++-программы обbIЧНО выполняются быстрее,

чем эквивалентные ПРОllJ3.ммы, написанные Hajava и С#.

С++: руководство ДЛ)) начинающих 29

и последнее. Языки C++,java и С# предназначены для решения различных классов задач. Поэтому вопрос "Какой язык лучше?" поставлен некорректно.

Уместнее сформулировать вопрос иначе: "Какой язык наиболее подходит для ре­

шения данной задачи?".

~ПРОСЫДI\'iIтекущегоl<онтрОл'il________

1.От какого языка программирования произошел С++?

2.Какой основной фактор обусловил создание С++?

3.Верно ли, что С++ является предком языковJava и С#?·

ВАЖНОI

58 0бьектнn-nриеЫZИРОВQнное

программирование

Основополагающими для разработки С++ стали принципы объектно-ори­

ентированного программирования (ООП). Именно ООП явилось толчком для создания С++. А раз так, то, прежде чем мы напишем самую простую С++-про­ грамму, важно понять, что собой представляют принципы ООП.

Объектно-ориентированное программирование объединило лучшие идеи

структурированного с рядом мощных концепций, которые способствуют более эффективной организации программ. В самом общем смысле любую программу

можно организовать одним из двух способов: опираясь на код (действия) или на данные (информация, на l<ОТОРУЮ направлены эти действия). При использова­

нии лишь методов структурированного программирования программы обычно опираются на код. Такой подход можно выразить в использовании "кода, дей­

ствующего на данные".

Механизм объектно-ориентированного программирования основан на выборе второго способа. В этом случае ключевым принципом организации программ яв­ ляется использование "данных, управляющих доступом !( коду". В любом 06ъек­

тно-ориентированном языке программирования определяются данные и процеду­

ры, которые разрешается применить к этим данным. Таким образом, тип данных в

точности определяет, операции какого вида можно примешпь к этим данным.

1. Язык С++ произошел от С.

2.Основной фактор создания С++ - повышеIше сложности ПРОll>амм.

3.Верно: С++ действительно является родительским языком для Java и С#.

t

u

:D

ID

О

I

U

О

30 Глава 1. Основы С++

ДЛЯ поддержки принципов объектно-ориеtIтированноro программирования все языки ООП, включая С++, характеризуются следующими общими свойства­

ми: иmcaпсуляцией, полиморфизмом н наследованием. Рассмотрим кратко каж­

дое из ЭТИХ свойств.

ИнкапсуМlЦИЯ

Инкапсуляция - это такой механизм программирования, который связывает

воедино код и данные, им обрабатываемые, чтобы обезопасить их как от внешне­

го вмешательства, так и от неправильного исrlOJlьзоваиия. В объекпю-ориеНnf­

рованиом языке код и данные могут быть связаны способом, при котором созда­ ется самодостаточный черныйЯЩlJК. В этом "яшике" содержатся все необходимые (для обеспечения самостоятельности) данные If код. При таком связывании кода

и данных создается объект, Т.е. 06ьекm - это КО:iСТРУКЦИЯ, котuрая поддерживает

инка.псуляцию.

Спросим у опытного программиста

Вопрос. Я СЛЫIIUVI, .,то mep.JtIUH ".JtIemoij" прlLNeшrетCR " noдnpozpa.J/l..Jtle. Тогда

прагда ли то, что .JtIe1JIOiJ - это то же Ctl.JtlOe, что и ФУJlJСЦU?

Ответ. В общем CMblCJIe ответ: да. Термин "метод" популяри:ювался t: появлени·

ем языка Java. То, что C++-програММIIСТ называет функцией, Jаvа-про·

граммист называет м('Тодом. С#-программисты также используют термltн

Uметод". В виду такой широкой популярности этот термин все чаще r-та.1И применять и к C++-фУНКlIии.

Внутри объекта код, данные или обе эти составляющие могут быть закРЫТЫ\fИ

в "рамках" этогообъекта или открытыми. Закрытый код (или данные) известен и

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

коду или данным не может получить доступ та часть программы, которая суще­

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

с закрытыми элементами объекта.

Базовой единицей инкапсуляции является класс. Класс определяет новый тип

данных, который задает формат 06ьекта. Класс' включает как данные, так и код,

предназначенный ДЛЯ выполнения над этими данными. Следовательно, класс

связы8em данные с "адом. В С++ спецификация класса используется для по-

С++: PYI(OBOACTBO ДЛ~ начинающих 31

строения объектов. Обьекты - это экземпляры класса. По сути, lUIacc представ­

ляет собой набор планов, которые определяют, К3..I( Cl'pUlITb объект.

В lUIacce данные объявляются в виде nереме1lЯЫХ. а КОД оформляется в 8ИДt:

фуmщий (1I0Дl1рограмм). Функции и переменныс, СОС1'авляющнс класс, назьша­

ются его членами. Таким образом, переменная, объявленная в КЛi!ссе, называется Ч:lеIlОМ дml1lЫХ, а функция, объявленная в классе, назьшаеТС>1 ФуIt1Щllей-ч/leIIOАI. ИlIогда вместо термина I(лен дmmых используется теРМЮI lzере.ме//uйя эюеАmляра

(или nереАfеllНая реализации).

ПолиморфИЗМ

Полиморфизм (от греческого <:Л.ова polym01p11ism, означающего "много форм") -

это свойство, позволяющее исnользовать один интерфейс для целого lUIacca дей­

ствиii. В качестве простого примера полиморфизма можно привести руль автомоби­ ля. Лля руля (т.е. шперфейса) безразлично, какой пш рулеоого механизма исполь­ зуется u автомобиле. Другим словами, руль работаетодинаково. не:iависимо от того, оснащеli ли автомобиль рулевым управлением прямоro деЙСТВIIЯ (без усилителя),

рулевым управлением с УСИЛИТeJlем или механизмом реечной lIсредачи. Если вы

знаете, как обращаться с рулем, вы сможете вести автомоБИЛI, любого ТИП8.

ТОТ же IIРИНЦИП можно применить к программировClНИJO. Рассмотрим, напри­ мер, стек, или список, добавление и удаление элементов к !{оторому осуществля­

ется по ПРИIiЦИПУ "последним прибыл - пеРПl)IМ обслужен". У "ас может быть

программа, А которой используются три различных типа стека. Один стек пред­ назначен ДЛЯ цеЛОЧJ1СЛСIШЫХ значений, второй - для значений с плавающей точ­

кой и третий - для символов. AлrОРlfТМ реализации всех стеков - один и тот

же. несмотря на то, что 1:1 них хранятся данные различных типов. В необъектно­

ориентированном языке программисту пришлось бы создать три различных ,..а­

бора подпрограмм обслуживания с.тека, причем подпрограммы должны были бы

иметь различные имена, а каждый набор - собственный интерфейс. Но благо­ даря полиморфизму в С++ можно создать одии общий набор подпрограмм (один интерфейс), который подходит для всех трех конкретных СИ1'УациЙ. Таким обра­

зом, зная, как использовать один стек, вы можете использовать все остальные.

В более общем виде концепция полиморфизма выражается фРaзQй "один ин­

терфейс - много методов". Это означает, что для группы связанных действий

можно использовать один обобщенный интерфейс. Полиморфизм позволяет по­

низить уровень сложности за счет возможности применения одного и того же ИН­

терфейса ДЛЯ задания общею класса действий. Выбор же кою(рemuоzo деиС1llfJUЯ

(т.е. функции) примени.тельно к той или иной ситуации ложится "на плечи" ком­

пилятора. Вам, как программисту, не нужно делать этот выбор вручную. Ваша

задача - использовать общий mперфеЙс.

+

+

u

1i

CD

О

1:

U

О

Соседние файлы в папке Книги