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

hkjCJgcQqF

.pdf
Скачиваний:
2
Добавлен:
15.04.2023
Размер:
810.94 Кб
Скачать

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ МУРМАНСКИЙ ГОСУДАРСТВЕННЫЙ ГУМАНИТАРНЫЙ УНИВЕРСИТЕТ

Л.В. Яковлева

Практикум по объектно-ориентированному

программированию в С++

Часть 1

МУРМАНСК

2011

3

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ МУРМАНСКИЙ ГОСУДАРСТВЕННЫЙ ГУМАНИТАРНЫЙ УНИВЕРСИТЕТ

Л.В. Яковлева

Практикум по объектно-ориентированному

программированию в С++

Учебно-методическое пособие

Часть 1

МУРМАНСК

2011

4

УДК 004.434(075.8) ББК 32.973.26-018.1я73

Я47

Печатается по решению Совета по научно-исследовательской работе и редакционно-издательской деятельности Мурманского государственного гуманитарного университета

Рекомендовано учебно-методическим советом МГГУ к использованию в учебном процессе (протокол № 3 от 23.12.2010 г.)

Научный редактор: Б.М. Верещагин, канд. физ-мат. наук, доцент МГГУ

Рецензенты: В.В. Качала, канд. тех. наук, доцент, профессор кафедры информационных систем и прикладной математики МГТУ; Ю.В. Матвеев, начальник АСУ ООО «СЗРК-Мурманск»

Яковлева Л.В.

Практикум по объектно-ориентированному программированию в С++: учебно-методическое пособие: в 2 ч. / науч. ред. Б.М. Верещагин. – Мурманск: МГГУ, 2011. – Часть 1. – 126 с.

Учебно-методическое пособие предназначено для выполнения лабораторных работ по основным темам дисциплины «Практикум на ЭВМ». В данном пособии определяется терминология объектно-ориентированных концепций и представляется способ, которым эти концепции поддерживаются в С++. Основное внимание уделяется абстрактным типам данных и полиморфизму как основе понимания парадигмы объектно-ориентированного программирования. Фрагменты программ, приводимые в пособии, позволяют студентам быстро овладеть техникой объектно-ориентированного программирования.

Предназначено для аудиторной работы студентов по специальности 010501 «Прикладная математика и информатика».

Печатается в авторской редакции.

Яковлева Л.В., 2011

Оформление. ГОУВПО «Мурманский государственный гуманитарный университет», 2011

5

Введение

Учебно-методическое пособие «Практикум по объектно-ориентиро- ванному программированию в С++» разработано на основе ГОС ВПО 2-го поколения (дата утверждения 23.03.2000 г) для студентов, обучающихся по специальности 010501 «Прикладная математика и информатика». В первой части данного учебно-методического пособия основное внимание уделяется абстрактным типам данных, конструированию классов, перегрузке функций и операций. Каждая глава пособия раскрывает специфические возможности языка С++, которые поддерживают концепции объектноориентированного программирования.

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

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

Втретьей главе рассмотрена перегрузка операторов применительно к классам. Первоначально обсуждаются общие понятия и вопросы проектирования, а затем конкретные операторы, такие как присваивание, доступ по индексу, вызов функции, перегрузка операторов new и delete, а также операторы преобразования типа.

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

Цель данного курса состоит в том, чтобы на основе объектноориентированной методологии изучить основные конструкции языка С++. Эта цель конкретизируется в следующих задачах:

объектная ориентация программирования должна подчеркиваться везде;

изучение тех аспектов языка С++, которые широко используются в реализации стандартной библиотеки шаблонов;

анализ на безопасность разрабатываемого программного кода;

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

Главная задача курса – это построение эффективных объектно-

ориентированных проектов для прикладной математики на языке С++ с использованием библиотек STL.

Первая часть учебно-методического пособия “Практикум по объект- но-ориентированному программированию в С++” предназначена для

6

обеспечения будущих выпускников по специальности «Прикладная математика и информатика» (код 010501) специальными компетентностями в области объектно-ориентированного программирования, в частности, такими знаниями и умениями, как:

разрабатывать абстрактные типы данных (АТД);

использовать механизм класса для создания пользовательских типов данных и реализации объектов этих типов в программах;

использовать перегрузку функций и операций в проектируемых классах;

конструировать и реализовывать параметрический полиморфизм в

виде шаблонных функций.

Содержание дисциплины “Практикум на ЭВМ” третий семестр специальности 010501 ”Прикладная математика и информатика“ представлено в следующей таблице:

 

 

 

Количество часов

 

Наименование темы

Всего

Лекц.

Лаб.

Сам.

 

 

аудит.

работы

раб.

 

 

 

1.

Классы и объекты

6

2

4

1

2.

Перегруженные функции

4

2

2

 

3.

Перегрузка операторов и реобразования,

6

2

4

1

 

определенные пользователем

 

 

 

 

 

4.

Шаблоны функций

4

1

3

1

5.

Шаблоны классов

6

1

5

1

6.

Наследование

6

2

4

1

7.

Абстрактные классы, динамическая

6

1

5

1

 

информация о типе

 

 

 

 

 

8.

Классы и динамическая память

6

1

5

1

9.

Исключения

4

1

3

 

10.

Потоковый ввод-вывод

4

1

3

 

11.

Стандартная библиотека шаблонов

8

2

6

1

 

Всего

60

16

44

8

Каждая тема представлена отдельной главой. Главы обычно имеют такую структуру: концепции ООП, работающий код, декомпозиция программ, упражнения. Упражнения выделены в лабораторные работы. Задания в лабораторных работах подобраны разной степени сложности от очень простых до довольно сложных, позволяющих учитывать степень овладения языком С++ студентами. Каждая последующая глава объясняет конструкции языка, поддерживающие ООП. Пособие представляет собой учебник, в котором намеренно используются примеры рабочего кода. С самого начала студенту предоставляются полностью рабочие программы. Упражнения из лабораторных работ объединены с примерами таким образом, чтобы поощрить экспериментирование. В тексте использовано множество стандартных структур данных из области информатики.

7

Реализованы стеки, безопасные массивы, списки, деревья и строки. Упражнения расширяют понимание студентом того, как построить и использовать эти структуры. Все программы были протестированы на платформе операционной системы Windows , используя среду разработки Microsoft Visual Studio 2008 и Bloodshed Dev-C++.

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

8

Глава 1. Классы и объекты

Пользовательский тип – класс

Класс – это определяемый пользователем тип с данными и функциями (методами), называемыми членами (members) класса. Переменная типа класс называется объектом. Определение класса состоит из двух частей:

заголовка, включающего ключевое слово class, за которым следует имя класса;

тела, заключенного в фигурные скобки.

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

class MyClass { /* ... */ } myClass, yourClass;

Внутри тела объявляются данные-члены и функции-члены и указываются уровни доступа к ним. Каждое определение вводит новый тип данных. Даже если два класса имеют одинаковые списки членов, они все равно считаются разными типами:

class First { int ivar; double dvar; };

class Second { int ivar; double dvar; };

class First obj1;

Second obj2 = obj1; // ошибка: obj1 и obj2 имеют разные типы

Тело класса определяет отдельную область видимости. Объявление членов внутри тела помещает их имена в область видимости класса. Класс создает различные уровни доступа к его членам, разделяя объявление на части:

private;

protected;

public;

Закрытая область класса (private), а следовательно закрытая часть объекта может быть доступна только для функций-членов в этом классе. Часть public (открытая) объекта может быть доступна для внешних элементов программы, в области действия которых находится этот объект. Члены protected (защищенные) используются с производными классами.

Данные-члены класса объявляются так же, как переменные С++, а методы задаются как объявление функций С++. Следует, по возможности, помещать данные-члены класса в закрытую часть секции. В результате этого значение данных-членов обновляется только открытой функциейчленом класса. В качестве типов для данных-членов могут использоваться встроенные типы (например, int, double, char и т.д.), объекты других

9

классов, а также указатели или ссылки на проектируемый класс. Пример объявления класса Rectangle

class Rectangle

{

private:

// длина и ширина прямоугольного объекта float length, width;

public:

// конструктор

Rectangle (float len=0, float wid=0);

//методы для нахождения и изменения закрытых данных float GetLength ( ) const;

void PutLength (float len); float GetWidth ( ) const; void PutWidth (float wid);

//методы, вычисляющие периметр и площадь прямоугольника float Perimeter ( ) const;

float Area ( ) const;

};

Использование ключевого слова const после списка параметров в объявлении некоторых методов делает эти методы константными, т.е. никакой элемент данных не может быть изменен.

Конструкторы и деструкторы

Функция, называемая конструктором класса, имеет то же имя, что и класс. Конструктор не имеет возвращаемого значения, поскольку вызывается только во время создания объекта. Конструктору могут передаваться параметры, используемые для инициализации одного или более данныхчленов класса. Например, в классе Rectangle конструктору дается имя Rectangle, и он принимает параметры len и wid, используемые для инициализации длины и ширины объекта: Rectangle (float len=1, float wid=1). Эти параметры имеют значение по умолчанию, которые указывают, что используется значение 1, когда параметр len или wid не передается явно.

Конструкторы неформально можно разделить на три типа: конструкторы по умолчанию (с пустым списком параметров), конструкторы с параметрами, конструкторы копирования. Обычно в классе определено несколько типов конструкторов. Как известно, существование нескольких конструкторов возможно в силу перегрузки функций. В некоторых случаях в классе необходимо определять конструктор по умолчанию. Например, когда в прикладных программах необходимо использовать массив объектов данного класса.

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

10

некоторые действия, которые уничтожат его. Локальные объекты создаются при входе в соответствующий блок, а при выходе из него они уничтожаются. При разрушении объекта автоматически вызываются его деструктор. Для этого существует несколько причин. Например, объект должен освободить занимаемую им память или закрыть файл, открытый ранее. В языке С++ эти действия выполняет деструктор. Имя деструктора совпадает с именем конструктора (класса), но перед ним ставится знак ~ (тильда). Деструктор также не возвращает никаких значений.

Объявление объекта

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

написать ключевое слово class, а после него – имя класса. В предыдущем примере объект obj1 класса First объявлен именно таким образом;

указать только имя класса. Так объявлен объект obj2 класса Second из приведенного примера (второй способ введен в C++ для упрощения объявлений.)

Объявление класса и его определение описывает новый тип данных. Объявление объекта типа пользовательского класса создает экземпляр класса. При создании объекта типа класс автоматически вызывается конструктор для инициализации некоторых или всех данных-членов класса. Если в классе определен конструктор с параметрами, то параметры для объекта передаются конструктору заключением их в скобки после имени объекта. Например, следующие объявления создают два объекта типа Rectangle:

Rectangle room (12, 18); Rectangle rect;

Каждый объект имеет полный диапазон данных-членов и методов, объявляемых в классе. Открытые члены доступны с использованием имени объекта и имени члена, разделяемых “.” (точкой). Например:

int x= room.Area( ); rect.PutLength(20);

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

11

Реализация класса

Каждый метод в объявлении класса должен быть определен. Определения функций могут быть заданы в теле класса (встроенный код) или вне него. При определении функции вне тела класса сначала указывается возвращаемое значение, затем перед именем функции добавляется имя класса, за которым следует два двоеточия, затем после имени функции следует список параметров и тело функции. При необходимости после списка параметров добавляется спецификатор const. Символ “::” называется операцией разрешения области видимости и указывает на то, что функция принадлежит области видимости класса. Это позволяет всем операторам в определении функции иметь доступ к закрытым членам класса. Например, определение члена-функции GetLength ( ) , когда она записана вне тела класса Rectangle выглядит следующим образом:

float Rectagle::GetLength ( ) const

{

return length; //доступ к закрытому члену length

}

Функция-член класса может быть записана и внутри тела класса. В этом случае код является расширенным, встраиваемым (inline), а операции разрешения области видимости не используются, так как код находится в области действия тела класса.

class Rectangle

{

private:

// длина и ширина прямоугольного объекта float length, width;

public:

float GetLength ( ) const

{

return length;

}

…};

Реализация конструктора

Конструктор может быть определен как inline или вне тела класса. Например, следующий код определяет конструктор Rectangle:

Rectangle::Rectangle (float len, float wid)

{

length=len; width=wid; }

C++ предоставляет специальный синтаксис для инициализации членов класса – это список инициализации. Если список инициализации используется, то он помещается после заголовка функции и отделяется от

12

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]