Объектно-ориентированное программирование учебное пособие



страница15/15
Дата17.04.2013
Размер1.64 Mb.
ТипУчебное пособие
1   ...   7   8   9   10   11   12   13   14   15

class Two

{

public:

virtual int value ( )

{

return 2;

}

};
Класс One описывает виртуальный метод, который возвращает значение 1. Этот метод переопределяется в классе Two на метод, возвращающий значение 2.

Определим следующие функции:
void directAssign (One x)

{

printf(“по значению переменная равна %d \ n”,

x .value ( ) );

}

void byPointer (One * x)

{

printf(“по указателю переменная равна %d \ n”,

x -> value ( ) );

}

void byReference (One & x)

{

printf(“по ссылке переменная равна %d \ n”,

x .value ( ) );

}
Эти функции используют в качестве аргумента значение класса One, которое передается соответственно по значению, через указатель и через ссылку. При выполнении этих функций с аргументом класса Two для первой параметр преобразуется к классу One, и в результате будет напечатано значение 1. Две другие функции допускают полиморфный аргумент. В обоих случаях переданное значение сохранит свой динамический тип данных, и напечатано будет значение 2.

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

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

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

В C++ определено два вида шаблонов: шаблоны-классы и шаблоны-функции.

Шаблоны-классы могут использоваться многими способами, но наиболее очевидным является их использование в качестве адаптивных объектов памяти.


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

Возможность параметрического программирования на языке C++ обеспечивается стандартной библиотекой шаблонов STL (Standard Template Library).

В библиотеке STL много разнообразного материала, так много, что перечислять его нет смысла, но за всей данной разработкой стоят несколько четких концепций, которые могут быть исключительно полезны для понимания всех составляющих STL. Первыми из них являются концепции контейнера(container) и итератора(iterator).

Контэйнер представляет собой объект, в котором другие объекты могут храниться, как массивы. Итератор представляет собой механизм, с помощью которого происходит обращение к объектам в контейнере. Например, в стандартном массиве вы располагаете индексом для обращения к элементам массива; этот индекс и есть итератор.

Эти контейнеры и итераторы реализованы в форме шаблонов. Реализация контейнера с шаблонами позволяет ему работать с любыми видами объектов.

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

Лучший способ описания STL – на примере. Листинг программы представляет собой пример использования контейнера list, содержащего связанный список объектов.

___________________________________________________________________

#include

#include

#include
using namespace std;
// переименование некоторых типов для облегчения

//последующей работы при создании списка и его

//итератора.

typedef list strList;

typedef list :: iterator strIter;
int main( )

{

strList myList;

//

//Добавление строк

//

myList.insert(myList.end(),”first”);

myList.insert(myList.end(),”second”);

myList.insert(myList.end(),”third”);

myList.insert(myList.end(),”fourth”);

myList.insert(myList.end(),”fifth”);

myList.push_front(“Head”); //добавить в начало

myList.push_back(“Tail”); //добавить в конец
//Вывод списка

//

for (strIter iter=myList.begin( ); iter !=myList.end(); ++iter)

cout << *iter << endl;

cout << endl; //добавление пустой строки
//Убираем один из элементов

//

myList.erase(find(myList.begin( ),myList.end( ), “third”));
// Сейчас показываем в обратном порядке

//

strIter iter = myList.end ( );

--iter;

for (int ix = myList.size( ) ; ix > 0 ; --iter ; --ix )

cout << *iter << endl;
return 0;

}

__________________________________________________________________
Первое, что представляет интерес в этой программе – тот факт что STL не использует расширения .h для своих заголовочных файлов.

Типы strList и strIter создаются, чтобы сделать код более удобочитаемым. В противном случае пришлось бы постоянно набирать громоздкие названия при описании списка контейнера и итератора.

Следующий интересный фрагмент – вызов элемента-функции insert списка контейнера. Аргументы этой функции элемента локализованы в контейнере, в который вставляется новый элемент; в нем же располагается и сам этот элемент. Для записи элементов в коней списка вызывается элемент-функция end. Она возвращает итератор, указывающий на коней списка.

Элементы-функции push_front и push_back содержат один аргумент - объект, заносимый в контейнер, и добавляют элементы соответственно в начало и в конец контейнера.

Элемент-функция erase, довольно очевидна, поскольку она содержит один параметр: итератор, указывающий на местоположение удаляемого элемента списка. В данном случае итератор получен путем вызова алгоритма find. Параметрами при этом являются указатели итератора на начало и конец списка, а также объект, поиск которого осуществляется.


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

first

second

third

fourth

fifth

Tail
Head

fifth

fourth

third

second

first

Tail
Object Windows Library.Базовая структура OWL
Библиотека Object Windows Library (OWL), включенная в пакет Borland C++ является библиотекой С++ и позволяет сократить время и усилия, требуемые для разработки программ под Windows.

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

Управление событиями: класс TEventHandler

Программист мало работает с этим классом напрямую. Функции, которые он представляет, доступны во многих других программных группах, благодаря механизму наследования в С++. Этот класс управляет сообщениями, с которыми взаимодействуют программы. Сообщения имеют вид постоянных потоков.

Потоковые и устойчивые объекты: класс TStreamableBase.

Этот класс, фактически, является частью обычной библиотеки классов, а не классом OWL. Он позволяет рассматривать некий класс в качестве потока и сохранять его в памяти или на диске для дальнейшего использования во время, в том числе и последующих выполнений программы. Это является экзотичным для небольших программ, но имеет большое значение для более сложных приложений.

Управление модулями: классы TModule, TApplication.

TModule, Tapplication - относятся к группе управления модулями. TModule отвечает за загрузку и за выгрузку библиотек DLL, в то время, как TApplication ответственен за инициализацию программы, управление ею в период выполнения и управление задачами, которые необходимы при завершении выполнения программ.

Управление окнами: класс TWindow.

Этот класс является базовым оконным классом и наследует свойства классов TEventHandler и TStreamableBase. Существуют различные типы окон, построенные на этом классе TWindow.

TFrameWindow - простое окно с рамкой и меню.

TDecoratedFrame - расширяет возможности по использованию интерфейсных элементов: строки состояния и панели инструментов.

TMDIFrame, TMDIChild, TDecoratedMDIFrame - являются классами многодокументного интерфейса (MDI) и используются для представления множественных окон в рамках одного приложения.

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

Пример программы с использованием OWL.

______________________________________________________________

#include

#include
class MainApp : public TApplication

{

public :

MainApp ( ) : TApplication ( ) { }

void InitMainWindow ( ) ; // переопределяет функцию класса TApplication

};
void MainApp :: InitMainWindow ( )

{

SetMainWindow (new TFrameWindow (0,”First OWL Program”));

}
int OwlMain (int, char **)

{

return MainApp ( ).Run ( );

}

Программа отображает простейшее окно Windows с заголовком «First OWL Program». Для ее завершения необходимо нажать Alt-F4 или открыть системное меню и выбрать Close.

Эта программа содержит два элемента: класс для управления окном и класс для управления приложениями.

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

OwlMain вызывает функцию Run, и обработка по умолчанию в рамках OWL делает все остальное. (Run- это функция класса TApplication).

Механизм действия этой программы скрыт в построении классов. MainApp вызывает конструктор для TApplication внутри своего собственного конструктора. Это инициирует обработку по умолчанию для всех функций поддержки, кроме функции InitMainWindow, которая была перегружена посредством объявления функции-члена под тем же именем.

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

Два включенных в программу заголовочных файла предназначены для классов TFrameWindow (framewin.h) и TApplication (applicat.h). Программа для Windows должна иметь файл с расширением .DЕF, чтобы сообщить компоновщику, что делать с сегментами памяти и стеком. Borland C++ предоставляет такой файл \BC5\LIB|DEFAULT.DEF , который и был использован этой программой. Его следует добавить к списку файлов вашего проекта. Как правило, для небольших проектов не требуется изменение установок файла .DEF и файл, предоставляемый BorlandC++ можно использовать по умолчанию.
1   ...   7   8   9   10   11   12   13   14   15

Похожие:

Объектно-ориентированное программирование учебное пособие icon13. Основные принципы Объектно-Ориентированного Программирования (ооп) Объектно-Ориентированное Программирование
Объектно-Ориентированное Программирование это методология программирования, которая основана на представлении программы в виде совокупности...
Объектно-ориентированное программирование учебное пособие iconОбъектно-ориентированное программирование на языке Delphi
Методическое пособие предназначено для изучения основ объектно-ориентированного языка программирования Delphi (ооп) без ориентации...
Объектно-ориентированное программирование учебное пособие iconОбъектно-ориентированное программирование

Объектно-ориентированное программирование учебное пособие iconВизуальное объектно-ориентированное программирование. Графический интерфейс: форма и управляющие элементы

Объектно-ориентированное программирование учебное пособие iconСоздание web-сайтов, разработка программного обеспечения, объектно-ориентированное программирование, проектирование баз данных

Объектно-ориентированное программирование учебное пособие iconИнтегрированная среда разработки языка Visual Basic
...
Объектно-ориентированное программирование учебное пособие iconКурс: Объектно-ориентированное программирование
Напишите программу для общения через Internet. Программа должна состоять из двух частей: сервер и клиент. Сервер стартует в качестве...
Объектно-ориентированное программирование учебное пособие iconПрограммирование простых типов данных
Учебное пособие предназначено для студентов физического факультета, изучающих курс "Программирование и вычислительная физика"
Объектно-ориентированное программирование учебное пособие iconЗадание к лабораторным работам по курсу “Объектно-ориентированное программирование”
Разработать структуру элементов данных класса в виде динамической структуры данных (динамический массив, список, массив указателей)....
Объектно-ориентированное программирование учебное пособие iconУчебное пособие Уфа 2006 удк 519. 8 Б 19 ббк 22. 1: 22. 18 (Я7)
Бакусова С. М. Математика. Часть Математическое программирование / Учебное пособие. Уфа: ООО полиграфстудия «Оптима», 2006. – 71...
Разместите кнопку на своём сайте:
ru.convdocs.org


База данных защищена авторским правом ©ru.convdocs.org 2016
обратиться к администрации
ru.convdocs.org