С++ для начинающих - Учебное пособие

Часть i краткий обзор языка c++

Программы, которые мы пишем, имеют два основных аспекта:

набор алгоритмов;

набор данных, которыми оперируют.

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

зато отношения между ними (парадигма программирования) менялись. .

В процедурной парадигме программирования задача непосредственно моделируется набором алгоритмов. Возьмем, к примеру, систему выдачи книг в библиотеке. В ней реализуются две главные процедуры: процедура выдачи книг и процедура приема книг. Данные хранятся отдельно и передаются этим процедурам как параметры. К наиболее известным  процедурным  языкам  программирования  относятся  FORTRAN,  C  и Pascal. С++ также поддерживает процедурное программирование. Отдельные процедуры носят в этом языке название функций. В части III рассматривается поддержка, предоставляемая в С++  процедурной  парадигме  программирования:  функции,  шаблоны  функций, обобщенные алгоритмы.

В 70-е годы процедурную парадигму стала вытеснять парадигма абстрактных типов данных (теперь чаще называемая объектным подходом). В рамках этой парадигмы задача моделируется набором абстракций данных. В С++ эти абстракции получили название классов. Наша библиотечная система могла бы быть представлена как взаимоотношения объектов различных классов, представляющих книги, читателей, даты возврата и т.п. Алгоритмы, реализуемые каждым классом, называются открытым интерфейсом класса. Данные “скрыты” внутри объектов класса. Парадигму абстрактных типов данных поддерживают такие языки, как CLU, Ada и Modula-2. В части IV обсуждаются вопросы поддержки этой парадигмы языком С++.

Объектно-ориентированное программирование расширяет парадигму абстрактных типов данных механизмом наследования (повторного использования существующих объектов) и динамического связывания (повторного использования существующих интерфейсов). Вводятся отношения тип-подтип. Книга, видеокассета, компакт-диск – все они хранятся в библиотеке, и поэтому могут быть названы подтипами (или подклассами) одного родительского  типа,  представляющего  то,  что  может  храниться  в  библиотеке.  Хотя каждый  из  классов  способен  реализовывать  свой  собственный  алгоритм  выдачи  и возврата, открытый интерфейс для них одинаков. Три наиболее известных языка, поддерживающие  объектно-ориентированный  подход, – это Simula, Smalltalk и Java. В части V рассматриваются вопросы поддержки парадигмы объектно-ориентированного программирования в С++.

Хотя  мы  и  считаем  С++  в  основном  объектно-ориентированным  языком,  он поддерживает и процедурную, и объектную парадигму. Преимущество такого подхода в том, что для каждого конкретного  случая можно выбрать наилучшее решение. Однако есть  и  обратная  сторона  медали:  С++  является  достаточно  громоздким  и  сложным языком.

В части I мы “пробежимся” по всем основным аспектам С++. Одна из причин такого краткого  обзора  –  желание  дать  читателю  представление  об  основных  возможностях языка,  чтобы  затем  приводить  достаточно  содержательные  примеры.  Скажем,  мы  не будем   рассматривать   в   деталях   понятие   класса   вплоть   до  главы   13,  однако   без упоминания о нем наши примеры оказались бы неинтересными и надуманными.

 

Другая причина такого поверхностного, но широкого обзора – эстетическая. Если вы еще не оценили красоту и сложность сонаты Бетховена или живость регтайма Джоплина, вам будет безумно скучно разбираться в отдельных деталях вроде диезов, бемолей, октав и аккордов. Однако, не овладев ими, вы не научитесь музыке. Во многом это справедливо и для программирования. Разбираться в путанице приоритетов операций или правил приведения типов скучно, но совершенно необходимо для овладения С++.

В главе 1 представлены базовые элементы языка: встроенные типы данных, переменные, выражения, инструкции (statements) и функции. Мы увидим минимальную законченную С++ программу, обсудим вопросы компиляции, коснемся препроцессора и поддержки ввода/вывода.

В главе 2 мы реализуем абстракцию массива – процедурно, объектно, и объектно- ориентированно. Мы сравним нашу реализацию с реализацией, предоставляемой стандартной библиотекой С++, и познакомимся с набором обобщенных алгоритмов стандартной библиотеки. Мы коснемся и таких вещей, как шаблоны, исключения и пространства имен. Фактически, мы представим все особенности языка С++, хотя обсуждение деталей отложим до следующих глав.

Возможно, некоторые читатели сочтут главу 2 трудной для понимания. Материал представляется без подробного объяснения, даются ссылки на последующие разделы. Мы рекомендуем таким читателям не углубляться в эту главу, пропустить ее вовсе или прочитать по диагонали. В главе 3 материал излагается в более традиционной манере. После этого можно будет вернуться к главе 2.