Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции / lect14.doc
Скачиваний:
8
Добавлен:
20.05.2014
Размер:
79.87 Кб
Скачать

Int d1, d2; float w; ........ // это описания данных

. . . . . . . . . . .

Newcl ob1, ob2; // это создание двух объектов класса (14.2)

w = ob2.f(d1); // вызов метода объекта

}

В заключение перечислим основные особенности объектов.

Каждый объект имеет

Имя поля методы

- это характеристики объекта,

- это поведение объекта.

Объекты создаются и им посылаются сообщения, т.е. они

действуют и взаимодействуют. В ООП программа - это определения объектов

и их интерфейса, т.е. взаимодействия.

14.3. Три основных принципа ООП

Эти принципы, которые рассматриваются во всех книгах по ООП, имеют

следующие названия:

1) инкапсуляция,

2) наследование,

3) полиморфизм.

И н к а п с у л я ц и ю, т.е. объединение данных с функциями для их

обработки, рассмотрели в начале раздела 14.2.

Н а с л е д о в а н и е - это использование классов-родителей для создания

классов-потомков. Эти классы называют также базовым и производным.

Создав какой-либо класс, можно создавать его модифицированные версии,

которые наследуют переменные и методы класса - предка.

Объект-потомок автоматически наследует все данные и методы от родителя. Но

наследуемые свойства можно изменять и дополнять. Этот принцип позволяет

резко сокращать тексты сложных программ, т.к. не нужно повторять длинные

описания, и, кроме того, поведение объектов становится более ясным для

понимания. Следовательно, в ООП придерживаются правила "наследуй и

изменяй!"

П о л и м о р ф и з м - это правила использования функций с одинаковыми

именами. Например, стандартная функция exp будет выполняться по-разному

для вещественного (x) и комплексного (z = x + iy) аргументов:

exp(z) = exp(x) ∙ ( cos(y) + i sin(y) ), т.к. вызов функции определяется не только

её именем, но и типом её аргументов. Компилятор для exp(x) и exp(z) вызывает

разные функции, но от пользователя это скрыто.

С полиморфизмом тесно связан раздел ООП – перегрузка функций.

Слово полиморфизм можно трактовать как многоформенность, многообразие.

Кратко поясним принцип полиморфизма на примере наследования свойств

нескольких классов-родителей. Пусть имеем базовые классы Ma1 и Pa1 и

производный класс R2, см. рис. 14.3.

Ma1 |█

Pa1 |█

||

R2

Рис. 14.3 - Класс R2 наследует свойства классов Ma1, Pa1

В каждом классе Pa1 и Ma1 есть функции fmet(x), причем эти методы вычисляют

абсолютно разные значения fmet, a совпадение имен является случайным.

Методы fmet условно показаны темнымы прямоугольниками на рис. 14.3. Пусть

создан объект obmy класса R2

R2 obmy ;

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

obmy.fmet(z);

Возникает вопрос, какой из двух методов - fmet из Ma1 или fmet из Pa1 -

будет выполняться. Для правильного вызова нужно написать

obmy . Мa1 :: fmet (z)

и объяснение рассматрим позже.

14.4 Достоинства и недостатки ООП

Д о с т о и н с т в а

1. Составление и понимание больших программ, т.е. содержащих

примерно 1000 операторов или более, становится менее трудным, т.е. они

пишутся быстрее и качественнее. Но следует отметить, что при этом стоимость

ООП продукта возрастает примерно на 20% по сравнению с традиционными

программами.

2. Возможно создание библиотеки классов, т.е. библиотеки объектов, а не

разрозненных подпрограмм или программ.

3. Упрощается обмен объектами при переносе их в другие программы.

4. Возможность динамического изменения как данных, так и методов.

Динамическое изменение - это изменение в процессе выполнения программы.

Здесь следует понимать, что в обычной программе изменить текст какой-либо

подпрограммы в процессе выполнения нельзя.

Н е д о с т а т к и

1. Для ООП нужно хорошее знание сложного языка, например, Си++.

2. Усложнение программирования.

Специалисты по Си++ рекомендуют осваивать программирование на нем сначала

без ООП. Но некоторые из них также считают, что время ООП для прикладных

программистов придет не скоро. Обратимся к сведениям о результатах опроса

в 1995г. 1000 крупных фирм США, занимающихся программированием. Этот опрос

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

по-моему, они ошибались. Все современные языки основаны на С++ и ООП.

В программировании для современных систем баз данных (БД) также применяют

объектно-ориентированный подход.

14.5. Пример простой программы

Рассмотрим простую задачу : вывести N строк таблицы значений sin(x)

при 0 ≤ x ≤ π . Составим программу для решения по двум технологиям:

1) без применения ООП; 2) с применением ООП.

Способ 1 –“безклассовый”, т.е. процедурное программирование.

#include <iostream.h>

#include <math.h>

#include <conio.h>

void main ( ) {

float x, step; int k, N;

N=7; step = M_PI / (N-1); // или 3.141593

for (k=0; k<N; k++)

{x = step*k;

cout<<" k=" << k <<"\t x="<<x <<"\t sin(x)="<<sin(x)<<endl; }

getch( ); }

// - - - - - - - - - - - -

Способ 2 – ООП, т.е. с классом.

#include <iostream.h>

#include <math.h>

#include <conio.h>

class tabsin { // класс

private: float step; / / поле класса

public: float x; int N ; / / поля класса

void tab( ); };

void tabsin :: tab( ) { // метод, т.е. функция класса

int k; step = M_PI / (N-1); // или 3.141593

for (k=0; k<N; k++)

{x = step * k;

cout<<" k="<<k<< "\t x=" << x << "\t sin(x)=" << sin(x)<<endl;

} }

void main ( ) {

tabsin s; // создание объекта

s.N=7; // данные класса

s.tab ( ); // вызов метода

getch( ); }

В последней функции main можно для обращения к объекту использовать

указатель, что характерно для работы с объектами в С++ :

tabsin *ts; ts=& s; ts->N = 7; ts->tab( );

В следующем семестре продолжим изучение ООП .

Соседние файлы в папке Лекции