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

ООП / учебное_пособие

.pdf
Скачиваний:
117
Добавлен:
24.02.2016
Размер:
1.6 Mб
Скачать

Ю.А. Луцик, В.Н. Комличенко

ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ НА ЯЗЫКЕ С++

МИНСК БГУИР 2007

УДК 681.322 (075.8) ББК 32.97 я 73

Л 86

Рецензенты:

Кафедра «Прикладной математики и информатики» Беларусского государственного педагогического университета имени М.Танка, (заведующий кафед-

рой, канд. физ-мат. наук А.А. Бейда), заведующий кафедрой «Программное обеспечение вычислительной техни-

ки и автоматизированных систем» Беларусского нучно-технического университета, канд. техн. наук Н.А. Разоренов

Луцик, Ю. А.

Л86 Объектно-ориентированное программирование на языке С++: учеб. пособие / Ю.А. Луцик., В.Н. Комличенко . - Минск: БГУИР, 2007. - 264 с.: ил.

ISBN 978-985-488-242-0

Вучебном пособии рассмотрены приемы и правила объектноориентированного программирования с использованием языка С++. Изложены основные конструкции языка С++, а также общие принципы разработки объектно-ориентированных программ. Рассмотрена разработка программ для Windows с использованием WIN32 API.

Пособие будет полезно студентам всех специальностей, магистрантам и аспирантам.

УДК 681.322 (075.8) ББК 32.97 я 73

 

© Луцик Ю.А., Комличенко В.Н., 2007

ISBN 978-985-488-242-0

© УО «Белорусский государственный

 

университет информатики и

 

радиоэлектроники», 2007

 

2

ВВЕДЕНИЕ

Одна из важнейших задач программирования – разработка алгоритма. Имеется два основных подхода к разработке программ. Первый из них называется процедурным программированием. Для создания программ на его основе необходимо следующее:

-определить задачу, которую нужно решить;

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

-разбить программу на логически законченные этапы;

-создать текст программы;

-отладить программу;

-тестировать программу.

Второй подход называется объектно-ориентированным программирова-

нием (ООП). Для разработки программ, основанных на использовании объект- но-ориентированного программирования, необходимо:

-определить задачу;

-определить уникальные объекты в области решаемой задачи;

-определить взаимосвязь между объектами;

-создать классы объектов, определяя переменные, представляющие всевозможные состояния, в которых может находиться объект;

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

-объявить объекты данных классов;

-определить начальное состояние системы;

-скомпилировать, скомпоновать систему.

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

Материал пособия основывается на ряде изданий [1–11].

3

1.ОБЪЕКТНО-ОРИЕНТИРОВАННЫЙ ПОДХОД

Объектно-ориентированное программирование – это методология программирования, основанная на представлении программы в виде совокупности взаимодействующих друг с другом объектов, каждый из которых является экземпляром определенного класса, а классы могут образовывать иерархию наследования. Программа будет объектно-ориентированной только при соблюдении трех требований: 1) в качестве базовых элементов используются объекты, а не алгоритмы; 2) каждый объект является экземпляром какого-либо определенного класса; 3) классы организованы иерархически.

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

Именно объектно-ориентированная декомпозиция отличает объектноориентированное проектирование от структурного; в первом случае логическая структура системы отражается абстракциями в виде классов и объектов, во втором – алгоритмами.

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

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

2.ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ

2.1.Абстрактные типы данных

Концепция абстрактных типов и абстрактных типов данных является ключевой в программировании. Абстракция подразумевает разделение и независимое рассмотрение интерфейса и реализации.

Интерфейс и внутренняя реализация являются определяющими свой-

ствами объектов окружающего нас мира. Интерфейс – это средство взаимодействия с некоторым объектом. Реализация – это внутреннее свойство объекта.

4

Наибольший интерес представляет эффективность реализации.

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

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

Различают процедурную абстракцию и абстракцию данных. Процедурная абстракция требует раздельного рассмотрения назначения

процедуры (например функции С/С++) и ее реализации.

Абстракция данных требует раздельного рассмотрения операций над данными и реализации этих операций. Достаточно знать, какие операции выполняет модуль (функция С/С++), но не требуется знать, какие данные он при этом использует (они скрыты) и как в действительности выполняются эти операции.

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

Абстракция данных предполагает определение и рассмотрение абстрактных типов данных (АТД), или, иначе, новых типов данных, введенных пользователем. АТД – это совокупность данных вместе с множеством операций, которые можно выполнять над этими данными.

2.2. Базовые принципы объектно-ориентированного программирования

Объектно-ориентированное программирование основывается на трех ос-

новных концепциях: инкапсуляции, полиморфизме и наследовании.

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

5

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

Полиморфизм обеспечивает возможность реагировать различным образом на одно и то же сообщение (вызов функции-члена). Полиморфизм позволяет уменьшить сложность программы посредством использования одного и того же интерфейса для задания целого класса действий. Поддержка полиморфизма в ООП осуществляется через виртуальные функции и механизм перегрузки и переопределения.

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

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

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

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

При построении объектно-ориентированной программы одним из основных является вопрос иерархии классов. Пусть имеется некоторая иерархия (структура, взаимосвязь) классов. В этом случае можно:

-определить объект для заданного класса;

-построить новый класс, наследуя свойства существующего класса;

-изменить поведение нового класса (изменить существующие и добавить новые функции).

Построение нового класса, наследованного из существующего, предпола-

гает:

-добавление в новый класс новых компонент-данных;

-добавление в новый класс новых компонент-функций;

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

Наследование может быть одиночным и множественным (рис. 1). При

6

множественном наследовании производный (новый) класс имеет более одного наследуемого (старого) класса, из которых образуется новый класс. При этом новый класс наследует поведение этих классов.

Общий базовый класс

 

Производный

Производный

Производный

базовый класс

базовый класс

базовый класс

Производный Производный

 

Производный

Простое (одиночное) наследование

Множественное наследование

Рис. 1. Виды иерархии классов

 

Таким образом, объектно-ориентированное программирование – метод построения программ в виде множества взаимодействующих объектов, структура и поведение которых описаны соответствующими классами. Все эти классы образуют иерархию классов, выражающую отношение наследования.

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

Язык программирования называется объектно-ориентированным, если :

-он поддерживает абстрактные типы данных (объекты с определенным интерфейсом и скрытым внутренним состоянием);

-объекты имеют связанные с ними типы (классы);

-поддерживается механизм наследования.

Программа будет объектно-ориентированной только при соблюдении всех трех указанных требований. В частности, программирование, не основанное на иерархических отношениях, не относится к OOП, а называется про-

граммированием на основе абстрактных типов данных.

2.3. Основные достоинства языка С++

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

7

2.4. Особенности языка С++

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

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

2.4.1. Ключевые слова

Язык С++ расширяет множество ключевых слов, принятых в языке С,

следующими ключевыми словами:

 

class

new

inline

try

private

delete

operator

catch

public

this

template

throw

protected

friend

virtual

 

2.4.2. Константы и переменные

В С++ односимвольные константы (данные, не изменяющие своего значения) имеют тип char, в то же время в С++ поддерживается возможность работы с двухсимвольными константами типа int:

’aB’ , ’\n\t’ .

При этом первый символ располагается в младшем байте, а второй − в старшем.

2.4.3. Операции

В языке С++ введены следующие новые операции: :: − операция разрешения контекста;

.* и ->* − операции обращения через указатель к компоненте класса; new и delete − операции динамического выделения и освобождения па-

мяти.

Использование этих и других операций при разработке программ будет показано далее, при изучении соответствующего материала.

2.4.4. Типы данных

В С++ поддерживаются все типы данных, предопределенные в С. Кроме того, введено несколько новых типов данных: классы и ссылки.

Ссылки расширяют и упрощают используемую в С передачу аргументов в функцию: по значению и по адресу.

2.4.5. Передача аргументов функции по умолчанию

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

8

число фактических параметров может быть меньше числа формальных параметров. В этом случае принимается умалчиваемое значение соответствующего параметра. Например:

#include <iostream> using mamespace std;

int sm(int i1, int i2, int i3=0, int i4=0)

{cout<<i1<<’ ’<<i2<<’ ’<<i3<<’ ’<<i4<<’ ’; return i1+i2+i3+i4;

}

int main()

{cout <<"сумма = "<< sm(1,2) << endl; cout <<"сумма = "<< sm(1,2,3) << endl; cout << "сумма = "<< sm(1,2,3,4) << endl; return 0;

}

Результатом работы программы будет:

1

2

0

0

сумма = 3

1

2

3

0

сумма = 6

1

2

3

4

сумма = 10

Описание параметров по умолчанию должно находиться в конце списка формальных параметров (в заголовке функции). Задание параметров по умолчанию может быть выполнено только в прототипе функции или при его отсутствии в заголовке функции.

2.5. Простейший ввод и вывод

В С++ ввод и вывод данных производится потоками байт. Поток (последовательность байт) − это логическое устройство, которое выдает и принимает информацию от пользователя и связано с физическими устройствами вводавывода. При операциях ввода байты направляются от устройства в основную память. В операциях вывода – наоборот.

Имеется четыре потока (связанных с ними объекта), обеспечивающих ввод и вывод информации и определенных в заголовочном файле iostream.h:

cin − поток стандартного ввода; cout − поток стандартного вывода; cerr − поток стандартной ошибки;

clog − буферизируемый поток стандартных ошибок.

2.5.1. Объект cin

Для ввода информации с клавиатуры используется объект cin. Формат записи cin имеет следующий вид:

cin [>>имя_переменной];

Объект cin имеет некоторые недостатки. Необходимо, чтобы данные вво-

9

дились в соответствии с форматом переменных, что не всегда может быть гарантировано.

2.5.2. Объект cout

Объект cout позволяет выводить информацию на стандартное устройство вывода – экран. Формат записи cout имеет следующий вид:

сout << data [ << data];

data − это переменные, константы, выражения или комбинации всех трех типов.

Простейший пример применения cout − это вывод, например, символьной строки:

cout << ”объектно-ориентированное программирование ”; cout << ”программирование на С++”.

Надо помнить, что cout не выполняет автоматический переход на новую строку после вывода информации. Для перевода курсора на новую строку надо вставлять символ ’\n’ или манипулятор endl.

cout << ”объектно-ориентированное программирование \n”; cout << ”программирование на С++”<<endl;

Для управления выводом информации используются манипуляторы.

2.5.3. Манипуляторы

Для форматирования выводимой информации используются манипуляторы.Описания для стандартных манипуляторов включены в файл iomanip.h

Манипуляторы dec, hex и oct используются для вывода числовой информации в десятичном, шестнадцатеричном или восьмеричном представлении. Применение их можно видеть на примере следующей программы:

#include <iostream> using namespace std;

int main()

 

 

 

{ int a=0x11, b=4,

//

целые числа: шестнадцатеричное и десятичное

c=051,

d=8,

//

восьмеричное и десятичное

i,j;

 

 

 

i=a+b;

 

 

 

j=c+d;

 

 

 

cout << i

<<' ' <<hex << i <<' '<<oct << i <<' ' <<dec << i <<endl;

cout <<hex << j <<' ' << j <<' '<<dec << j <<' ' << oct << j <<endl; return 0;

}

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

21 15 25 21

31 31 49 61

10