
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( );
В следующем семестре продолжим изучение ООП .