Прикладное программирование на языке C++
Покупка
Новинка
Тематика:
Программирование на C и C++
Год издания: 2015
Кол-во страниц: 148
Дополнительно
Вид издания:
Учебное пособие
Уровень образования:
ВО - Бакалавриат
ISBN: 978-5-7038-4101-3
Артикул: 842305.01.99
Раскрыты основные принципы объектно-ориентированного программирования. Приведены фрагменты теоретического материала по прикладному программированию на языке С++, описания заданий для разработки программ, объяснения алгоритмов и исходные тексты программ по различным темам.
Для студентов 1-го и 2-го курсов всех специальностей МГТУ им. Н.Э. Баумана.
Тематика:
ББК:
УДК:
ОКСО:
- ВО - Бакалавриат
- 02.03.02: Фундаментальная информатика и информационные технологии
- 09.03.01: Информатика и вычислительная техника
- 09.03.02: Информационные системы и технологии
- 09.03.03: Прикладная информатика
ГРНТИ:
Скопировать запись
Фрагмент текстового слоя документа размещен для индексирующих роботов
Московский государственный технический университет имени Н.Э. Баумана Т.М. Волосатова, С.В. Родионов, Д.Т. Шварц Прикладное программирование на языке С++ Учебное пособие
УДК 681.3.066 ББК 32.973-018.2 В68 Издание доступно в электронном виде на портале ebooks.bmstu.ru по адресу: http://ebooks.bmstu.ru/catalog/229/book1064.html Факультет «Робототехника и комплексная автоматизация» Кафедра «Системы автоматизированного проектирования» Рекомендовано Редакционно-издательским советом МГТУ им. Н.Э. Баумана в качестве учебного пособия Рецензенты: разработчик ООО «Яндекс» Е.В. Гобарева; канд. техн. наук М.В. Филиппов Волосатова, Т. М. Прикладное программирование на языке С++ : учебное В68 пособие / Т. М. Волосатова, С. В. Родионов, Д. Т. Шварц. — Москва : Издательство МГТУ им. Н. Э. Баумана, 2015. — 146, [2] с. : ил. ISBN 978-5-7038-4101-3 Раскрыты основные принципы объектно-ориентированного программирования. Приведены фрагменты теоретического материала по прикладному программированию на языке С++, описания заданий для разработки программ, объяснения алгоритмов и исходные тексты программ по различным темам. Для студентов 1-го и 2-го курсов всех специальностей МГТУ им. Н.Э. Баумана. УДК 681.3.066 ББК 32.973-018.2 МГТУ им. Н.Э. Баумана, 2015 Оформление. Издательство ISBN 978-5-7038-4101-3 МГТУ им. Н.Э. Баумана, 2015 2
ПРЕДИСЛОВИЕ Учебное пособие содержит фрагменты теоретического материала по прикладному программированию на языке С++, задания для разработки программ, объяснения алгоритмов и прокомментированные исходные тексты программ по различным темам. Цель пособия — помочь студентам расширить свои знания языка С++ и освоить рациональные приемы составления программ на этом объектно-ориентированном языке. В настоящее время объектно-ориентированная технология (парадигма) программирования наиболее распространена и востребована. При объектно-ориентированном подходе к программированию программа представляет собой совокупность взаимодействующих между собой данных — объектов. Функциональную возможность и структуру объектов задают классы — типы данных, определенные пользователем. Изучение объектно-ориентированного программирования (ООП) целесообразно начать на примере объектно-ориентированного языка программирования C++ как наиболее теоретически выдержанного. Другие языки, поддерживающие идеи ООП, такие как Object Pascal [4], Java [7], разрабатывались в первую очередь с учетом удобства программирования задач в соответствующих предметных областях. Язык C++, унаследовав язык C (стандарт С90), был разработан Б. Страуструпом с наиболее возможной реализацией теоретических концепций ООП. Язык C++ вобрал в себя отдельные концепции не только языка С, но и некоторых других языков. Например, концепция классов взята автором языка С++ из языка Simula, а концепция наследования — из языка Smalltalk. 3
В данном учебном пособии C++ рассматривается в строго теоретическом аспекте. Объектно-ориентированная парадигма — программа рассматривается как совокупность фрагментов кода, обрабатывающих отдельные совокупности данных — объекты. Такие объекты взаимодействуют между собой посредством так называемых интерфейсов. При этом данные управляют доступом к коду. Выбор тем и изложение материала в пособии таковы, что студент сможет освоить: синтаксис, семантику и выразительные возможности языка С++; три основных принципа ООП; принципы реализации на языке С++ классических алгоритмов обработки информации. 4
1. ОСНОВНЫЕ ПРИНЦИПЫ ОБЪЕКТНООРИЕНТИРОВАННОГО ПРОГРАММИРОВАНИЯ Центральной идеей ООП является реализация понятия «абстракция». Смысл абстракции заключается в том, что сущность произвольной сложности можно рассматривать, а также осуществлять определенные действия над ней как над единым целым, не вдаваясь в детали внутреннего построения и функционирования. Поэтому при создании программного комплекса необходимо разработать определенные абстракции. Одним из основных способов создания абстракции является использование концепции иерархической классификации. Ее суть заключается в том, что сложные системы разбиваются на более простые фрагменты. Практически все сложные системы иерархичны, а уровни их иерархии отражают различные уровни абстракции. Для каждой конкретной задачи рассматривается соответствующий уровень. Выбор низшего уровня абстракции достаточно произволен. При этом выбранный в качестве низшего уровень в одном случае может оказаться уровнем достаточно высокой абстракции в другом проекте. Различают типовую и структурную иерархии, которые далее будут называться соответственно структурой классов и структурой объектов. Во всех объектно-ориентированных языках программирования реализованы следующие основные механизмы (постулаты) ООП: инкапсуляция, наследование, полиморфизм. Все эти механизмы важны для разработки и использования абстракций. Инкапсуляция — механизм, связывающий вместе код и данные, которыми он манипулирует, и одновременно защищающий 5
их от произвольного доступа со стороны другого кода, внешнего по отношению к рассматриваемому. Доступ к коду и данным жестко контролируется интерфейсом. Основой инкапсуляции при ООП является класс. Механизм инкапсуляции позволяет оставлять скрытыми от пользователя некоторые детали реализации класса, т. е. инкапсулировать их в классе, что упрощает работу с объектами этого класса. Наследование — механизм, с помощью которого один объект (производного класса) приобретает свойства другого объекта (родительского, базового класса). При использовании наследования новый объект не обязательно описывать, начиная с нуля, что существенно упрощает работу программиста. Наследование позволяет какому-либо объекту наследовать от своего родителя общие атрибуты, а для себя — определять только те характеристики, которые делают его уникальным внутри класса. Наследование — очень важное понятие, поддерживающее концепцию иерархической классификации. Полиморфизм — механизм, позволяющий использовать один и тот же интерфейс для общего класса действий. 6
2. КЛАССЫ И ОБЪЕКТЫ В ЯЗЫКЕ С++ Центральным понятием ООП на С++ является класс, используемый для описания типа, на основе которого создаются объекты этого типа (переменные типа класс). Класс, как и любой тип данных, характеризуется множеством значений, которые могут принимать объекты класса, и множеством функций, задающих операции над объектами. Класс полноценно определяет тип данных как совокупность множества значений и набора операций над этими значениями. 2.1. Синтаксис описания класса Грамматика описания класса выглядит следующим образом: class имя_класса { определение_членов_класса }; Члены класса можно разделить на информационные члены и функции-члены (методы) класса. Информационные члены описывают внутреннюю структуру информации, хранящейся в объекте, который создается на основе класса, а методы класса — алгоритмы обработки этой информации. Данные, хранящиеся в информационных членах, описывают состояние объекта, созданного на основе класса. На состояние объекта влияют изменения хранящихся данных с помощью методов класса. Алгоритмы, заложенные в реализации методов класса, определяют поведение объекта, т. е. реагирование объекта на поступающие внешние воздействия в виде входных данных. 2.2. Управление доступом к членам класса Принцип инкапсуляции обеспечивается вводом в класс областей доступа: private (закрытый, доступный только собственным методам); 7
public (открытый, доступный любым функциям); protected (защищенный, доступный только собственным методам и методам производных классов). Члены класса, находящиеся в закрытой области (private), недоступны для использования со стороны внешнего кода. Напротив, члены класса, находящиеся в открытой секции (public), доступны для использования со стороны внешнего кода. При описании класса каждый его член помещается в одну из перечисленных выше областей доступа: class имя_класса { private: определение_закрытых_членов_класса public: определение_открытых_членов_класса protected: определение_защищенных_членов_класса}; Порядок следования областей доступа и их количество в классе — произвольны. Служебное слово, определяющее первую область доступа, может отсутствовать. По умолчанию эта область считается private. В закрытую (private) область обычно помещаются информационные члены, а в открытую (public) — методы класса, реализующие интерфейс объектов класса с внешней средой. Если какойлибо метод имеет вспомогательное значение для других методов класса, являясь подпрограммой для них, то его также следует поместить в закрытую область, что обеспечивает логическую целостность информации. После описания класса его имя можно использовать для описания объектов этого типа. Доступ к информационным членам и методам объекта, описанным в открытой секции, осуществляется через объект или ссылку на объект с помощью операции выбора члена класса ‘.’. Если работа с объектом выполняется с помощью указателя на объект, то доступ к соответствующим членам класса осуществляется на основе указателя на член класса ‘->’. Объекты класса можно определять совместно с описанием класса. 8
2.3. Класс как область видимости Класс является областью видимости описанных в нем членов класса. Идентификатор члена класса локален по отношению к данному классу. Одноименные идентификаторы членов класса закрывают видимость соответствующих внешних идентификаторов. Операция ‘::’ позволяет получить доступ к одноименным объектам, внешним по отношению к текущей области видимости, в частности к глобальным функциям и переменным, следующим образом: имя_класса :: имя_члена_класса или :: имя — для имен глобальных функций и переменных. 2.4. Объявление и определение методов класса. Спецификатор inline Каждый метод класса, должен быть определен в программе. Определить метод класса можно либо непосредственно в классе (если тело метода не слишком сложно и громоздко), либо вынести определение вне класса, а в классе только объявить соответствующий метод, указав его прототип. При определении метода класса вне класса для указания области видимости соответствующего имени метода используется операция ‘::’. Это позволяет повысить наглядность текста, особенно в случае значительного объема кода в методах, но при этом прототипы объявления и определения функции должны совпадать. Метод класса и любую функцию, не связанную ни с каким классом, можно определить со спецификатором inline: inline int func1(); Такие функции называются встроенными. Спецификатор inline указывает компилятору, что необходимо по возможности генерировать в точке вызова код функции, а не команды вызова функции, находящейся в отдельном месте выполняемого кода программы. Это позволяет уменьшить время выполнения программы за счет отсутствия команд вызова функции и возврата из функции, которые, кроме передачи управления, выполняют действия соответственно по сохранению и восстановлению контекста (содержимого основных регистров процессора). Методы класса, определенные непосредственно в классе, являются inline-функциям. 9
2.5. Указатель this В классах С++ неявно введен специальный указатель this — указатель на текущий объект. Каждый метод класса при обращении к нему получает данный указатель в качестве неявного параметра. Через него методы класса могут получить доступ к другим членам класса. Указатель this можно рассматривать как локальную константу, имеющую тип X*, если X — имя описываемого класса. Нет необходимости применять его явно. Он используется явно, например, в том случае, когда выходным значением для метода является текущий объект. Данный указатель, как и другие указатели, может быть разыменован. При передаче возвращаемого значения метода класса в виде ссылки на текущий объект используется разыменованный указатель this, поскольку, как уже отмечалось, инициализируется непосредственным значением. 10