С.Б. Липпман, Ж. Лажойе - Язык программирования С++ Вводный курс (1114944), страница 2
Текст из файла (страница 2)
Шаблон функции предназначен для автоматической генерации потенциальнобесконечного множества экземпляров функций, отличающихся только типами данных.С++ поддерживает обработку исключений. Об исключении говорят, когда в программевозникает нестандартная ситуация, такая, например, как нехватка свободной памяти. В томместе программы, где это происходит, возбуждается исключение, то есть о проблеместавится в известность вызывающая программа.
Какая-то другая функция в программедолжна обработать исключение, то есть как-то отреагировать на него. Материал обисключениях разбит на две части. В главе 11 описан основной синтаксис и приведен простойпример, иллюстрирующий возбуждение и обработку исключений типа класса. Посколькуреальные исключения в программах обычно являются объектами некоторой иерархииклассов, то мы вернемся к этому вопросу в главе 19, после того как узнаем, что такоеобъектно-ориентированное программирование.В главе 12 представлена обширная коллекция обобщенных алгоритмов стандартнойбиблиотеки и способы их применения к контейнерным типам из главы 6, а также к массивамвстроенных типов. Эта глава начинается разбором примера построения программы сиспользованием обобщенных алгоритмов.
Итераторы, введенные в главе 6, обсуждаютсяболее детально в главе 12, поскольку именно они являются связующим звеном междуобобщенными алгоритмами и контейнерными типами. Также мы вводим и иллюстрируем напримерах понятие объекта-функции. Объекты-функции позволяют задавать альтернативнуюсемантику операций, используемых в обобщенных алгоритмах, – скажем, операцийсравнения на равенство или по величине. Детальное описание самих алгоритмов и примерыих использования приводятся в приложении.С++ для начинающих6Главы 13-16 (часть IV) посвящены объектному программированию, то есть использованиюмеханизма классов для создания абстрактных типов данных.
С помощью типов данных,описывающих конкретную предметную область, язык С++ позволяет программистамсосредоточиться на решении основной задачи и тратить меньше усилий на второстепенные.Фундаментальные для приложения типы данных могут быть реализованы один раз ииспользованы многократно, что дает программисту возможность не думать о деталяхреализации главной задачи. Инкапсуляция данных значительно упрощает последующеесопровождение и модификацию программы.В главе 13 основное внимание мы уделим общим вопросам механизма классов: какопределить класс, что такое сокрытие информации (разделение открытого интерфейса искрытой реализации), как определять экземпляры класса и манипулировать ими. Мы такжекоснемся областей видимости класса, вложенных классов и классов как членов пространстваимен.В главе 14 детально исследуются средства, имеющиеся в С++ для инициализации иуничтожения объектов класса и для присваивания им значений.
Для этих целей служатспециальные функции-члены, называемые конструкторами, деструкторами икопирующими операторами присваивания. Мы рассмотрим вопрос о почленнойинициализации и копировании, а также специальную оптимизацию для этого случая,которая получила название именованное возвращаемое значение.В главе 15 мы рассмотрим перегрузку операторов применительно к классам. Сначала мыостановимся на общих понятиях и вопросах проектирования, а затем перейдем крассмотрению конкретных операторов, таких, как присваивание, доступ по индексу, вызовфункции, а также операторов new и delete, специфичных для классов.Будет представлено понятие дружественного класса, имеющего особые права доступа, иобъяснено, зачем нужны друзья.
Будут рассмотрены и определенные пользователямипреобразования типов, стоящие за ними концепции и примеры использования. Кроме того,приводятся правила разрешения функций при перегрузке, иллюстрируемые примерамипрограммного кода.Шаблоны классов – тема главы 16. Шаблон класса можно рассматривать как алгоритмсоздания экземпляра класса, в котором параметры шаблона подлежат замене на конкретныезначения типов или констант. Скажем, в шаблоне класса vector параметризован тип егоэлементов. В классе для представления некоторого буфера можно параметризовать не толькотип размещаемых элементов, но и размер самого буфера.
При разработке сложныхмеханизмов, например в области распределенной обработки данных, могут бытьпараметризованы практически все интерфейсы: межпроцессной коммуникации, адресации,синхронизации. В главе 16 мы расскажем, как определить шаблон класса, как создатьэкземпляр класса, подставляя в шаблон конкретные значения, как определить члены шаблонакласса (функции-члены, статические члены и вложенные типы) и как следуеторганизовывать программу, в которой используются шаблоны классов. Заканчивается этаглава содержательным примером шаблона класса.Объектно-ориентированному программированию (ООП) и его поддержке в С++ посвященыглавы 17-20 (часть IV). В главе 17 описываются средства поддержки базовых концепцийООП – наследования и позднего связывания. В ООП между классами, имеющими общиечерты поведения, устанавливаются отношения родитель/потомок (или тип/подтип).
Вместотого чтобы повторно реализовывать общие характеристики, класс-потомок можетунаследовать их от класса-родителя. В класс-потомок (подтип) следует добавить только теС++ для начинающих7детали, которые отличают его от родителя. Например, мы можем определить родительскийкласс Employee (работник) и двух его потомков: TemporaryEmpl (временный работник) иManager (начальник), которые наследуют все поведение Employee. В них самихреализованы только специфичные для подтипа особенности. Второй аспект ООП,полиморфизм, позволяет родительскому классу представлять любого из своих наследников.Скажем, класс Employee может адресовать не только объект своего типа, но и объект типаTemporaryEmpl или Manager.
Позднее связывание – это способность разрешения операцийво время выполнения, то есть выбора нужной операции в зависимости от реального типаобъекта. В С++ это реализуется с помощью механизма виртуальных функций.Итак, в главе 17 представлены базовые черты ООП. В ней мы продолжим начатую в главе 6работу над системой текстового поиска – спроектируем и реализуем иерархию классовзапросов Query.В главе 18 разбираются более сложные случаи наследования – множественное ивиртуальное. Шаблон класса из главы 16 получает дальнейшее развитие и становитсятрехуровневой иерархией с множественным и виртуальным наследованием.В главе 19 представлено понятие идентификации типа во время выполнения (RTTI – run timetype identification).
RTTI позволяет программе запросить у полиморфного объекта классаинформацию о его типе во время выполнения. Например, мы можем спросить у объектаEmployee, действительно ли он представляет собой объект типа Manager. Кроме того, вглаве 19 мы вернемся к исключениям и рассмотрим иерархию классов исключенийстандартной библиотеки, приводя примеры построения и использования своей собственнойиерархии классов исключений. В этой главе рассматривается также вопрос о разрешенииперегруженных функций в случае наследования классов.В главе 20 подробно рассматривается использование библиотеки ввода/вывода iostream.Здесь мы на примерах покажем основные возможности ввода и вывода, расскажем, какопределить свои операторы ввода и вывода для класса, как проверять состояние потока иизменять его, как форматировать данные.
Библиотека ввода/вывода представляет собойиерархию классов с множественным и виртуальным наследованием.Завершается книга приложением, где все обобщенные алгоритмы приведены в алфавитномпорядке, с примерами их использования.При написании книги зачастую приходится оставлять в стороне множество вопросов,которые представляются не менее важными, чем вошедшие в книгу.
Отдельные аспектыязыка – детальное описание того, как работают конструкторы, в каких случаях создаютсявременные объекты, общие вопросы эффективности – не вписывались во вводный курс.Однако эти аспекты имеют огромное значение при проектировании реальных приложений.Перед тем как взяться за “C++ для начинающих”, Стен написал книгу “Inside the C++ ObjectModel” [LIPPMAN96a], в которой освещаются именно эти вопросы. В тех местах “C++ дляначинающих”, где читателю может потребоваться более детальная информация, даютсяссылки на разделы указанной книги.Некоторые части стандартной библиотеки С++ были сознательно исключены израссмотрения, в частности поддержка национальных языков и численные методы.Стандартная библиотека С++ очень обширна, и все ее аспекты невозможно осветить в одномучебнике.
Материал по отсутствующим вопросам вы можете найти в книгах, приведенных всписке литературы ([MUSSER96] и [STRUOSTRUP97u]). Наверняка вскоре выйдет ещенемало книг, освещающих различные аспекты стандартной библиотеки С++.С++ для начинающих8Изменения в третьем изданииВсе изменения можно разбить на четыре основные категории:материал, посвященный нововведениям языка: обработке исключений, идентификации типаво время выполнения, пространству имен, встроенному типу bool, новому синтаксисуприведения типов;материал, посвященный стандартной библиотеке С++, в том числе типам complex, string,auto_ptr, pair, последовательным и ассоциативным контейнерам (в основном это list, vector,map и set) и обобщенным алгоритмам;коррективы в старом тексте, отражающие улучшения, расширения и изменения, которыеновый стандарт С++ привнес в существовавшие ранее средства языка.