Разделы презентаций


Эволюция технологии разработки ПО. Процедурная и объектная декомпозиция

Содержание

Эволюция технологии разработки ПО (2)2. Структурный подход к программированию - 60-70-е годы ХХ века – технология, представляющая собой набор рекомендаций и методов, базирующихся на большом опыте работы:нисходящая разработка;декомпозиция методом пошаговой детализации;структурное

Слайды и текст этой презентации

Слайд 1Часть 2 Объектно-ориентированное программирование Введение. Эволюция технологии разработки ПО. Процедурная и

объектная декомпозиция


«Стихийное» программирование – до середины 60-х годов ХХ

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


Слабое место – большая вероятность испортить глобальные данные.

Часть 2 Объектно-ориентированное программирование Введение. Эволюция технологии разработки ПО.  Процедурная и объектная декомпозиция «Стихийное» программирование –

Слайд 2Эволюция технологии разработки ПО (2)
2. Структурный подход к программированию -

60-70-е годы ХХ века – технология, представляющая собой набор рекомендаций

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


Эволюция технологии разработки ПО (2)2. Структурный подход к программированию - 60-70-е годы ХХ века – технология, представляющая

Слайд 3Эволюция технологии разработки ПО (3)
Модульное программирование – выделение групп подпрограмм,

использующих общие глобальные данные в модули – отдельно компилируемые части

программы (многоуровневая декомпозиция).

Слабое место – большое количество передаваемых параметров.

Эволюция технологии разработки ПО (3)Модульное программирование – выделение групп подпрограмм, использующих общие глобальные данные в модули –

Слайд 4Эволюция технологии разработки ПО (4)
3. Объектный подход к программированию –

с середины 80-х до наших дней.
Объектно-ориентированное программирование

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


Эволюция технологии разработки ПО (4)3. Объектный подход к программированию –    с середины 80-х до

Слайд 5Эволюция технологии разработки ПО (5)
Компонентный подход – с конца 90-х

годов ХХ века (COM-техноло-гия) – подключение объектов через универсальные интерфейсы

– развитие сетевого программирования – появление CASE-техноло-гий.
Эволюция технологии разработки ПО (5)Компонентный подход – с конца 90-х годов ХХ века (COM-техноло-гия) – подключение объектов

Слайд 6Пример
Разработать программную систему, которая для указанной функции на заданном

отрезке:
строит таблицу значений с определенным шагом;
определяет корни;
определяет максимум и минимум.



Пример Разработать программную систему, которая для указанной функции на заданном отрезке:строит таблицу значений с определенным шагом;определяет корни;определяет

Слайд 7Формы интерфейса пользователя
Программа исследования функций.
Введите функцию или слово «Конец»: y

= cos(x) – 1
Назначьте интервал: [-1, 0)
Введите номер решаемой задачи


( 1 – построение таблицы значений;
2 – нахождение корней;
3 – нахождение минимума и максимума;
4 – смена функции или завершение программы): 1

Построение таблицы.
Введите шаг: 0.01
Таблица значений:
x= y=

Нахождение корней.
Таблица корней:
x= y=

Экстремумы.
Минимум:
x= y=
Максимум:
x= y=

Формы интерфейса пользователяПрограмма исследования функций.Введите функцию или слово «Конец»: y = cos(x) – 1Назначьте интервал: [-1, 0)Введите

Слайд 8Диаграмма состояний интерфейса пользователя
Ввод
функции



Меню
Таблица
Корни
Экстремумы
1
2
3
4
«Конец»

Диаграмма состояний интерфейса пользователяВводфункцииМенюТаблицаКорниЭкстремумы1234«Конец»

Слайд 9Разработка схем алгоритмов методом пошаговой детализации
Начало
F, a, b
F =“End”
Analyze
(fun,a,b)
да
нет
Конец
F,

a, b
Analyze(F..)
Cod
Cod = 4
Roots
(fun,a,b)
да
нет
Выход
Cod
Cod
2
1
3
Table
(fun,a,b)
Extremes
(fun,a,b)
Translate
(F,fun)

Разработка схем алгоритмов методом пошаговой детализацииНачалоF, a, bF =“End”Analyze (fun,a,b)данетКонецF, a, bAnalyze(F..)CodCod = 4Roots(fun,a,b)данетВыходCodCod213Table (fun,a,b)Extremes(fun,a,b)Translate (F,fun)

Слайд 10Схема структурная программы
Main Program
Translate
Analyze
Roots
Extremes
Table
Процедурная декомпозиция – процесс разбиения программы на

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

один выход;
подпрограммы нижних уровней не вызывают подпрограмм верхних уровней;
размер подпрограммы не превышает 40-50 операторов.
Схема структурная программыMain ProgramTranslateAnalyzeRootsExtremesTableПроцедурная декомпозиция – процесс разбиения программы на подпрограммы.Структурной называют декомпозицию, если: каждая подпрограмма имеет

Слайд 11Объектная декомпозиция
Объектная декомпозиция – процесс представления предметной области задачи в

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

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

Ввод
функции

Активизировать

Активизировать

Меню

Таблица

Корни

Экстремумы

Активизировать

Активизировать

Активизировать

Функция


Задать

Рассчитать

Рассчитать

Рассчитать

Объект предметной области характеризуется:
именем;
состоянием;
поведением.
Состояние – совокупность значений характеристик объекта, существенных с т. з. решаемой задачи.
Поведение – совокупность реакций на сообщения.

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

Слайд 12Реализация объектов предметной области
Класс – это структурный тип данных, который

включает описание полей данных, а также процедур и функций, работающих

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

Слайд 13Методы построения классов
Наследование – механизм, позволяющий строить класс на базе

более простого посредством добавления полей и определения новых методов.
При

этом исходный класс, на базе которого выполняется построение, называют родительским или базовым, а строящейся класс – потомком или производным классом.
Если при наследовании какие-либо методы переопределяются, то такое наследование называется полиморфным.

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

3. Наполнение – механизм, позволяющих
включать указатели на объекты других
классов в конструируемый.
Методы построения классовНаследование – механизм, позволяющий строить класс на базе более простого посредством добавления полей и определения

Слайд 1411 Объектная модель С++ 11.1 Описание класса
Формат описания класса:
class

{ private: ;

protected: <Защищенные компоненты класса>;
public: <Общедоступные компоненты класса>;
};

Пример: Объект – строка (Ex5_01)

TSlovo

-Len
-Ref
#Pos

+TSlovo()
+~TSlovo()
+GetCh()
+PrintPos()

11 Объектная модель С++ 11.1 Описание классаФормат описания класса:class {  private:    ;

Слайд 15Пример описания класса (файл Slovo.h)
class TSlovo
{ private: int Len;

char *Ref;
protected: int Pos;
public:

TSlovo(char *ref,int pos=0);
~TSlovo(void) {delete Ref;}
char GetCh(void)
{ char Chr=Pos if(!Chr) Pos=-1;
return Pos++,Chr;
}
virtual void PrintPos(void);
};

Конструктор

Деструктор

inline

inline

Пример описания класса (файл Slovo.h)class TSlovo{ private:	 int Len;      char *Ref; protected:

Слайд 16Пример описания методов (файл Slovo.cpp)
#include "stdafx.h"
#include "slovo.h"
#include
#include

TSlovo::TSlovo(char *ref,int

pos):Pos(pos)
{ Len=strlen(ref);
Ref=new char[Len+1];
strcpy(Ref,ref);
}
void TSlovo::PrintPos(void)

{
cout< }
Пример описания методов (файл Slovo.cpp)#include

Слайд 1711.2 Объявление объектов и обращение к полям

и/или указателей>;

Примеры:

а) TPoint a,*b, c[5]; /* класс описан без конструктора

или с
конструктором без параметров */
б) TSlovo D(“Это строка”, 4); //конструктор с параметрами

<Имя объекта>.<Имя поля или метода>
<Имя указателя на объект> -><Имя поля или метода>
<Имя массива>[<Индекс>] .<Имя поля или метода>

Self (Паскаль) ⇔ this (С++)

Пример: this->Pos


Ссылка

Указатель

11.2 Объявление объектов и обращение к полям ;Примеры:а) TPoint a,*b, c[5]; /* класс описан без конструктора или

Слайд 18Тестирующая программа
#include "stdafx.h"
#include
#include ″Slovo.h"

int main(int argc, char* argv[])
{

TSlovo Greet("Hello World",6);
char Chr;
while (Chr=Greet.GetCh()) cout

';
return 0;
}

W o r l d

OOP1.cpp

Slovo.h

Slovo.cpp

Использует

Реализует

Тестирующая программа #include

Слайд 1911.3 Наследование
class :

<Имя базового класса>{…};
11.3 Наследование class :             {…};

Слайд 20Пример наследования Ex5_02 (Text.h)
#include "f:\iva\primer.vc\lection\oopr1\slovo.h"
#include
class TText:public TSlovo
{ private:

int Pos;
public:
TText(char *ref,int

pos=0):TSlovo(ref),Pos(pos) {}
void SetPos() { TSlovo::Pos=Pos; }
void PrintPos();
};
void TText::PrintPos(){cout<

TSlovo

TText

#Pos

+SetPos()
+PrintPos()

inline

inline

virtual

Пример наследования Ex5_02 (Text.h)#include

Слайд 21Тестирующая программа
#include "stdafx.h"
#include "Text.h"

int main(int argc, char* argv[])
{ TText

Greet("Hello World",6);

char Chr;
while (Chr=Greet.GetCh()) cout


cout<<'\n';
Greet.SetPos();
while (Chr=Greet.GetCh()) cout< cout<<'\n';
Greet.PrintPos();
return 0;
}

Hello World
World
0:6

TText(char *ref,int pos=0):
TSlovo(ref),Pos(pos)

void SetPos(){TSlovo::Pos=Pos;}

Тестирующая программа#include

Слайд 2211.4 Полиморфизм Виды полиморфизма
Полиморфизм
«Чистый»
Переопределение
методов в иерархии
Параметрическая
В пространствах
имен
Простой
полиморфизм
Сложный
полиморфизм
Шаблон
Перегрузка

11.4 Полиморфизм Виды полиморфизмаПолиморфизм«Чистый»Переопределениеметодов в иерархииПараметрическаяВ пространствахименПростойполиморфизмСложныйполиморфизмШаблонПерегрузка

Слайд 23Полиморфизм
В теории
простой полиморфизм
сложный полиморфизм

Пример использования сложного п-ма (Ex5_03):
#include "stdafx.h"
#include "f:\iva\primer.vc\lection\oopr11\Ttext.h"
int

main(int argc, char* argv[])
{ TSlovo SGreet("HELLO!!!"), *Ref=&SGreet;
TText Greet("Hello

World",6);
Ref->PrintPos();
cout< Ref=&Greet;
Ref->PrintPos();
cout< return 0;
}

0
0:6

В С++:
переопределение методов
виртуализация методов


Слайд 2411.5 Инициализация общих полей объектов при отсутствии конструкторов
Пример:
class TPoint

{public: int x,y;
...};
int

main()
{ TPoint A = {2,3};
TPoint *pB = {5,3};
TPoint C[]= {{4,5},{2,8},{7,6}};
...
}
11.5 Инициализация общих полей объектов при отсутствии конструкторовПример:class TPoint    {public: int x,y;

Слайд 2511.6 Конструкторы. Список инициализации
Пример (Ex5_4):

class TPoint
{ private: int x,y;
public:

TPoint(int ax,int ay){x=ax;y=ay;}
TPoint(){}

SetPoint(int ax,int ay) {x=ax;y=ay;} ...};
int main()
{ TPoint A, B(2,3), C[5], D[2] = {TPoint(2,4),TPoint(4,5)},
*E, *I = new TPoint(4,6), *M = new TPoint[3], *S[3];

?

?

A

2

3

B

?

?

C

?

?

?

?

?

?

?

?

2

4

D

4

5

?

A


E


I

4

6

?

?

?

?

?

?


M


S



11.6 Конструкторы. Список инициализацииПример (Ex5_4):class TPoint{ private: int x,y; public: TPoint(int ax,int ay){x=ax;y=ay;}

Слайд 26Распределение/освобождение памяти и инициализация объектов в программе
A.SetPoint(2,3); A.Print();
B.Print();
for

(i=0;iPrint();
for (i=0;i


{S[i]=new TPoint(i,i+1); S[i]->Print;}
delete E;
delete I;
delete [] M;
for (i=0;i<3;i++) delete S[i];
}

?

?

A

2

3

B

?

A

?

?

C

?

?

?

?

?

?

?

?

2

4

D

4

5


E


I

4

6

?

?

?

?

?

?


M


S



Распределение/освобождение памяти и инициализация объектов в программе A.SetPoint(2,3); A.Print(); B.Print();for (i=0;iPrint();for (i=0;i

Слайд 27Список инициализации. Инициализация объектных полей
Формат элемента списка инициализации:
()

Примеры:

a)

TPoint(int ax,ay): x(ax),y(ay) {}

б) class TLine
{ private:

const int x;
int &y;
TPoint t;
public: TLine(int ax,int ay,int tx,int ty):
x(ax),y(ay),t(tx,ty){}
TLine(){}
...};

Автоматически вызывает конструктор объектного поля без параметров TPoint( ) !

Список инициализации.  Инициализация объектных полейФормат элемента списка инициализации:()Примеры:a) TPoint(int ax,ay): x(ax),y(ay) {}б) class TLine  {

Слайд 2811.7 Копирующий конструктор
Автоматически вызывается:
а) при использовании объявлений типа
TPoint

A(2,5),B=A;
б) при передаче параметров-объектов по значению, например:
void Print(TPoint

R) {…}

Формат:

<Имя конструктора>(const <Имя класса> &<Имя объекта>){…}

Примеры:

а) TPoint(const TPoint &Obj)
{x=Obj.x; y=Obj.y;}

б) TPoint(const TPoint &Obj)
{x=Obj.x; y=2*Obj.y;}

Строится автоматически

11.7 Копирующий конструкторАвтоматически вызывается:а) при использовании объявлений типа  TPoint A(2,5),B=A;б) при передаче параметров-объектов по значению, например:

Слайд 29Пример обязательного определения копирующего конструктора (Ex5_05)
#include "stdafx.h"
#include
class TNum
{ public: int

*pn;
TNum(int n){puts("new pn"); pn=new int(n);}
TNum(const TNum &Obj)

{puts("copy new pn"); pn=new int(*Obj.pn);}
~TNum(){puts("delete pn");delete pn;}
};
void Print(TNum b) { printf("%d ",*b.pn); }

int main(int argc, char* argv[])
{ TNum A(1);
Print(A); return 0;
}



A

B




pn

Пример обязательного определения копирующего конструктора (Ex5_05)#include

Слайд 3011.8 Конструкторы и деструкторы производных классов
A(){…}


B():A(),{}


C():B(),{}

A
B
C
При объявлении объектов

производного класса всегда вызывается конструктор базового класса.
Если в списке инициализации

конструктора производного класса вызов конструктора базового отсутствует, то автоматически вызывается конструктор базового класса без параметров
11.8 Конструкторы и деструкторы  производных классовA(){…}B():A(),{}C():B(),{}ABCПри объявлении объектов производного класса всегда вызывается конструктор базового класса.Если в

Слайд 31Порядок вызовов конструкторов и деструкторов для объектов производных классов (Ex5_06)


#include "stdafx.h"
#include
class TNum
{ public: int n;

TNum(int an):n(an) {puts("TNum(an)");}
TNum() {puts("TNum()");}
~TNum(){puts("~TNum");}
};
class TNum2:public TNum
{ public: int nn;
TNum2(int an):nn(an) {puts("TNum2(an)");}
~TNum2(){puts("~TNum2");}
};

int main(int argc, char* argv[])
{TNum2 A(1); return 0;}

TNum()
TNum2(an)
~TNum2
~TNum

Неявный вызов
конструктора TNum

Порядок вызовов конструкторов и деструкторов для объектов производных классов (Ex5_06) #include

Слайд 3211.9 Абстрактные методы и классы
Абстрактный метод.

class AClass
{


virtual int

Fun(int,int)=0;
}

Класс, содержащий абстрактный метод, называется абстрактным.
Объекты абстрактного класса создавать запрещено !
11.9 Абстрактные методы и классыАбстрактный метод. class AClass  { …

Слайд 3311.10 Множественное наследование. Виртуальное наследование
class : virtual

базового класса>
{ ...};
Порядок вызовов конструкторов:
конструктор виртуально наследуемого

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

TA

TB

TC

TD

Проблема:
дублирование полей базового класса

11.10 Множественное наследование.  Виртуальное наследованиеclass : virtual  { ...}; Порядок вызовов конструкторов: конструктор виртуально наследуемого

Слайд 34Пример множественного виртуального наследования
#include "stdafx.h"
#include
class TA
{ protected:

int Fix;
public: TA() { cout

TA(int fix):Fix(fix) { cout<<"Inside TA int\n";}
};
class TB:virtual public TA
{ public: int One;
TB(void){ cout<<"Inside TB\n";}
};


Пример множественного виртуального наследования#include

Слайд 35Пример множественного виртуального наследования (2)
class TC:virtual private TA

{ public: int Two;
TC() { cout

};
class TD:public TB,public TC
{ public:
TD(int fix):TA(fix){cout<<"Inside TD\n";}
void Out( ) {cout< };
main()
{ TD Var(10);
Var.Out( );
return 0;
}



Inside TA int
Inside TB
Inside TC
Inside TD
10

Пример множественного виртуального наследования (2)class TC:virtual private TA  { public:	int Two;	   TC() { cout

Слайд 3611.11 Приведение типов объекта
В С++ для приведения типов используют:
1) ()

- используется в Си/С++ для любых типов, ничего не проверяет;
2)

static_cast <Тип>(<Переменная>)- используется в С++ для любых типов, ничего не проверяет;
3) reinterpret_cast <Тип указателя>
(<Указатель или интегральный тип>)- используется в С++ для указателей, ничего не проверяет;
4) dynamic_cast <Тип указателя на объект>
(<Указатель на объект>) – используется в С++ для полиморфных классов, требует указания опции компилятора /GR (Project/Settings…), если приведение невозможно, то возвращает NULL.

11.11 Приведение типов объектаВ С++ для приведения типов используют:1) () - используется в Си/С++ для любых типов,

Слайд 37Пример приведения типов объектов (Ex5_07)
#include "stdafx.h"
#include
#include

class TA

{ protected: char

c;
public: TA(char ac):c(ac){}
virtual void func(){cout

TB(char *aS):TA(aS[0]){strcpy(S,aS);}
void func(){cout<};

TB

S

TB()
func()

TA

c

TA()
func()

Пример приведения типов объектов (Ex5_07)#include

Слайд 38Пример приведения типов объектов(2)
int main(int argc, char* argv[])
{ TA *pA=new

TA('A'),*pC=new TB("AB");
TB *pB=new TB("AC");

((TA *)pB)->func();
reinterpret_cast

*>(pB)->func();
static_cast(pB)->func();
dynamic_cast(pB)->func();

((TB *)pC)->func();
reinterpret_cast(pC)->func();
static_cast(pC)->func();
dynamic_cast(pC)->func();

((TB *)pA)->func();
reinterpret_cast(pA)->func();
static_cast(pA)->func();
// dynamic_cast(pA)->func();
if (TB *pD=dynamic_cast(pA)) pD->func();
else cout<<"Cast Error"< return 0;}

Восходящее
приведение


Нисходящее
приведение


Ошибка!
Приведение
не корректно


Слайд 3911.12 Контейнер «Двусвязный список» (Ex5_08)
Диаграмма классов

11.12 Контейнер «Двусвязный список» (Ex5_08)Диаграмма классов

Слайд 40Контейнер «Двусвязный список»(2)
Диаграмма компоновки

Контейнер «Двусвязный список»(2)Диаграмма компоновки

Слайд 41Файл Element.h
#include
class TElement
{ public: TElement *pre,*suc;
TElement() {

pre=suc=NULL;}
virtual ~TElement() { puts("Delete TElement.");}
virtual void Print()=0;
};
class

TSpisok
{ private: TElement *first,*last,*cur;
public: TSpisok() {first=last=cur=NULL;}
~TSpisok();
void Add(TElement *e);
TElement *Del();
void ForEach(void (*f)(TElement *e));
TElement *First(){return cur=first;}
TElement *Next(){return cur=cur->suc;}
TElement *Last(){return cur=last;}
TElement *Previous(){return cur=cur->pre;}
};

Слайд 42Файл Element.cpp
#include "stdafx.h"
#include "Element.h"
TSpisok::~TSpisok()
{ puts("Delete TSpisok");
while

((cur=Del())!=NULL) { cur->Print();

delete(cur); }
}
void TSpisok::Add(TElement *e)
{ if (first==NULL) first=last=e;
else { e->suc=first;
first->pre=e;
first=e; }
}

Слайд 43Файл Element.cpp (2)
TElement *TSpisok::Del(void)
{ TElement *temp=last;
if (last!=NULL)
{last=last->pre;

if (last!=NULL) last->suc=NULL;

}
if (last==NULL) first=NULL;
return temp;
}
void TSpisok::ForEach(void (*f)(TElement *e))
{ cur=first;
while (cur!=NULL)
{(*f)(cur);
cur=cur->suc;
}
}
Файл Element.cpp (2)TElement *TSpisok::Del(void){ TElement *temp=last;  if (last!=NULL) 			{last=last->pre;			 if (last!=NULL) last->suc=NULL;

Слайд 44Файл Num.h
#include "Element.h"
class TNum:public TElement
{ public: int num;

TNum(int n):TElement(),num(n) {}
~TNum() { puts("Delete

TNum.");}
void Print() { printf("%d ",num); }
};
class TChar:public TElement
{ public: char ch;
TChar(char c):TElement(),ch(c) {}
~TChar() { puts("Delete TChar.");}
void Print() { printf("%c ",ch);}
};
void Show(TElement *e);
Файл Num.cpp
#include "stdafx.h"
#include "Num.h"
void Show(TElement *e)
{ e->Print();}

Слайд 45Тестирующая программа
#include "stdafx.h"
#include "Num.h"
#include
#include
TSpisok N;
int main(int argc, char*

argv[])
{ char str[10];
int k,i;

TElement *p;
while(printf("Input numbers, strings or :"),
scanf("%s",str),strcmp(str,"end"))
{ k=atoi(str);
if (k||(strlen(str)==1 && str[0]=='0')) p=new TNum(k);
else p=new TChar(str[0]);
N.Add(p);
}
puts("All list:");
N.ForEach(Show);
Тестирующая программа#include

Слайд 46Тестирующая программа(2)
p=N.First(); k=0;
while (p!=NULL)
{

if (TNum *q=dynamic_cast(p)) k+=q->num;
// установить создание RTTI

(/GR в Project\Settings...)
p=N.Next();
}
printf("Summa= %d\n",k);
p=N.Last();
i=0;
while (p!=NULL)
{if (TChar *q=dynamic_cast(p)) str[i++]=q->ch;
p=N.Previous();
}
str[i]='\0';
printf("String= %s\n",str);
return 0;
}

Слайд 4711.13 Статические компоненты класса
Объявляются с описателем Static
Статические поля являются общими

для всех объектов класса и существуют даже при отсутствии объектов.

Инициализация статических полей в определении класса не допустима.
Статические методы не получают параметра this и, следовательно, не могут без указания объекта обращаться к нестатическим полям.
Для доступа к статическим компонентам вне компонентных функций используют квалификатор <класс>::
11.13 Статические компоненты классаОбъявляются с описателем StaticСтатические поля являются общими для всех объектов класса и существуют даже

Слайд 48Статические компоненты класса (Ex5_09)
Пример. Создать список объектов




Файл Statico.h
#include
#include
class

TPoint
{ public: char ch1,ch2;
static TPoint *first, *last;

TPoint *next;
TPoint(char ach1,char ach2);
void Draw()
{ printf("%c %c \n",ch1,ch2); }
static void DrawAll();
};



next



next


o

next



Сегмент данных


last


first


Статические компоненты класса (Ex5_09)Пример. Создать список объектовФайл Statico.h#include #include class TPoint { public:	char ch1,ch2;	   static

Слайд 49Файл Statico.cpp
#include "stdafx.h"
#include "statico.h"

TPoint *TPoint::first=NULL,*TPoint::last=NULL;

TPoint::TPoint(char ach1,char ach2)
{

ch1=ach1; ch2=ach2;
next=NULL;
if(first==NULL)first=this;

else last->next=this;
last=this;
}
void TPoint::DrawAll()
{ TPoint *p=first;
if(p==NULL)return;
do {p->Draw();
p=p->next;}
while(p!=NULL);
}

Слайд 50Тестирующая программа
#include "stdafx.h"
#include "statico.h"

int main(int argc, char* argv[])
{ TPoint A('S','C'),B('W','O'),C('M','S');

if(TPoint::first!=NULL) TPoint::DrawAll();
return 0;
}
S C
W O
M S

Тестирующая программа#include

Слайд 5111.14 Дружественные функции и классы
Описываются с описателем friend, что обеспечивает

доступ к внутренним компонентам класса

Пример:
class TPoint
{private: int x,y;

public:...
friend void Show(TPoint A); // функция
};
void Show(TPoint A){cout<
int main()
{ TPoint W(2,3);
Show(W);
... }

friend void TLine::Show(TPoint A); // метод

friend class TLine; // класс
11.14 Дружественные функции и классыОписываются с описателем friend, что обеспечивает доступ к внутренним компонентам классаПример:class TPoint

Слайд 5211.15 Переопределение операций Операции
Типы функций-операций:
1. Независимая функция-операция
а) operator@()
б)

результата> operator@(,)

2. Компонентная функция-операция
а) operator@( ) // Операнд

= Объект
б) <Тип результата > operator@(<Операнд2>) // Операнд1 = Объект

Формы вызова
а) стандартная б) операторная
operator@(<Арг>) @<Арг>
operator@(<Арг1>,<Арг2>) <Арг1>@<Арг2>

<Арг>. operator@( ) @<Арг>
<Арг1>. operator@(<Арг2>) <Арг1>@<Арг2>
11.15 Переопределение операций ОперацииТипы функций-операций:1. Независимая функция-операцияа) operator@()б) operator@(,)2. Компонентная функция-операцияа) operator@( ) // Операнд = Объектб)

Слайд 53Переопределение операций
1. Можно переопределять только операции, параметры которых –объекты.
2. Не

разрешается переопределение *, sizeof, ? :, #, ##, ::, Class::.
3.

Операции =, [ ], ( ) можно переопределять только в составе класса
4. При переопределении операций нельзя изменить ее приоритет и ассоциативность.
Переопределение операций1. Можно переопределять только операции, параметры которых –объекты.2. Не разрешается переопределение *, sizeof, ? :, #,

Слайд 54Пример 1. Класс «Точка» (Ex5_10)
Файл Tpoint.h

#include
class TPoint{
private:

float x,y;
public:
TPoint(float ax,float

ay):x(ax),y(ay)
{cout<<"Constructor\n";}
TPoint(){cout<<"Constructor without parameters\n";}
TPoint(TPoint &p){ cout<<"Copy Constructor\n";
x=p.x; y=p.y;
}
~TPoint(){cout<<"Destructor\n";}
void Out(void) { cout<<"\n{"< TPoint& operator+=(TPoint &p); // a+=b;
TPoint operator+(TPoint &p); // a+b;
TPoint& operator=(TPoint &p); // a=b;
};
Пример 1. Класс «Точка» (Ex5_10)Файл Tpoint.h#include class TPoint{  private:   float x,y;  public:

Слайд 55Файл Tpoint.cpp
#include "stdafx.h"
#include "Tpoint.h"

TPoint& TPoint::operator+=(TPoint &p)
{ x+=p.x; y+=p.y;

cout

TPoint::operator+(TPoint &p)
{ TPoint pp(x,y); cout<<"operator+\n";
return pp+=p;
}
TPoint& TPoint::operator=(TPoint &p)
{ x=p.x; y=p.y; cout<<"operator=\n";
return *this;
}
Файл Tpoint.cpp#include

Слайд 56Тестирующая программа
#include "stdafx.h"
#include "Tpoint.h"
int main(int argc, char* argv[])
{

TPoint p(2,3),q(4,5),r(7,8);
p+=r;
p.Out();
q=p+r;





q.Out();
return 0;
}

Constructor
Constructor Constructor

Constructor (pp)
Оperator +
Operator +=
Copy constructor
Destructor (pp)
Operator =
Destructor

Operator +=

Destructor
Destructor
Destructor

TPoint pp(x,y);
cout<<"operator+\n";
pp+=p;
return
}

x+=p.x; y+=p.y;
cout<<"+=\n";
return *this;

Тестирующая программа #include

Слайд 57Пример 2. Класс «Строка»(Ex5_11)
Файл S.h:
#include
#include
#include
#include
class String

{ private: char *str,name; int

len;
public: String(int Len,char Name);
String(char *vs,char Name);
String(String &S);
~String();
int Length(){return len;}
char operator[](int n)
{return ((n>=0)&&(n void print() { cout<<"Str: "< cout< String operator+(String &A);
String operator+(char c);
String& operator=(String &S);
};
Пример 2. Класс «Строка»(Ex5_11)Файл S.h:#include #include #include #include class String { private:   char *str,name;

Слайд 58Файл S.cpp
#include "stdafx.h"
#include "s.h"
String::String(int Len,char Name){ len=Len;
str=new char[len+1]; str[0]='\0'; name=Name;
cout

with length "

"< }

Файл S.cpp#include

Слайд 59Файл S.cpp (2)
String::String(String &S)
{
len=S.Length();
str=new char[len+1];
strcpy(str,S.str);
name='K';
cout

from "

{
delete [] str;
cout<<"Destructor "< }
Файл S.cpp (2)String::String(String &S)		{ 					len=S.Length(); 		str=new char[len+1];		strcpy(str,S.str);			name='K';  	cout

Слайд 60Файл S.cpp (3)
String String::operator+(String &A)
{ cout

int j=len+A.Length();
String S(j,'S');

strcpy(S.str,str);
strcat(S.str,A.str); cout<<"Operation +"<<"\n";
return S;
}
String String::operator+(char c)
{ cout<<"Operation +c"<<"\n"; int j=len+1;
String S(j,'Q'); strcpy(S.str,str);
S.str[len]=c; S.str[len+1]='\0';
cout<<"Operation +c"<<"\n"; return S;
}
Файл S.cpp (3)String String::operator+(String &A)   { cout

Слайд 61Файл S.cpp (3)
String& String::operator=(String &S)
{
cout

len=S.Length();
if (str!=NULL) delete[]str;
str=new char[len+1];


strcpy(str,S.str);
cout<<"Operation ="<<"\n";
return *this;
}
Файл S.cpp (3)String& String::operator=(String &S) 		{ 		cout

Слайд 62Тестирующая программа
#include "stdafx.h"
#include "s.h"

int main(int argc, char* argv[])
{ String

A("ABC",'A'),B("DEF",'B'),C(6,'C');
C.print();
C=A+B;
C.print();
C=C+'a';
C.print();

return 0;
}
Тестирующая программа#include

Слайд 63Выполнение операций

Выполнение операций

Слайд 6411.16 Параметризованные классы (шаблоны)
Формат описания шаблона класса:
template

Формат

объявления объектов:

(

конструктора>)

Пример. Динамический массив
(Ex5_12)
11.16 Параметризованные классы (шаблоны)Формат описания шаблона класса:template Формат объявления объектов:    ()Пример. Динамический массив(Ex5_12)

Слайд 65Файл A.h
#include

template
class TArray
{ type * content;


int size;


public:
TArray(int asize)
{ content = new type [size=asize];}
~TArray (){delete [] content;}
type & operator[] (int x)
{ if ((x<0)||(x>=size))
{ cerr << "Index Error"; x=0; }
return content[x];
}
};
Файл A.h#include template class TArray { type * content;  int size;

Слайд 66Тестирующая программа
№include "stdafx.h"
#include "A.h"
#include

int main(int argc, char* argv[])
{int i;


TArray int_a(5);
TArray char_a(5);
for (i=0;i


{ int_a[i]=i*3+2*(i+1); char_a[i]='A'+i;}
puts("Massivs ");
for (i=0;i<5;i++)
{ printf("%5d %2c\n",int_a[i],char_a[i]);}
return 0;
}

Тестирующая программа№include

Слайд 6711.17 Параметризованные функции
Формат описания шаблона функции:
template

Пример. Шаблон

функции определения максимального (Ex5_13)

#include "stdafx.h"
#include
#include
template

T max(T x, T y){ return(x>y)?x:y;}
char * max(char * x, char * y)
{ return strcmp(x,y) > 0? x:y;}

Слайд 68Тестирующая программа
int main(int argc, char* argv[])
{ int a=1,b=2;


char c='a', d='m';

float e=123, f=456;
double p=234.567,t=789.23;
char str1[]="AVERO", str2[]="AVIER";

cout << "Integer max= "< cout << "Character max= "< cout << "Float max= "< cout << "Double max= "< cout << "String max= "< return 0;
}
Тестирующая программаint main(int argc, char* argv[]){ int a=1,b=2;      char c='a', d='m';

Слайд 69Контейнер на основе шаблона (Ex5_14)






contents

Контейнер на основе шаблона (Ex5_14)contents

Слайд 70Объявление шаблона класса
#include
template
class arrayob
{ type **contents; int

size; int n;
public:
arrayob(int number){contents=new type *[size=number];}

~arrayob ();
int sizeofmas(){return n;}
void add(type *p) { if(n==size)cerr<<"Out of range";
else contents[n++]=p;
}
type & operator [] (int x)
{ if ((x<0)||(x>=size))
{ cerr <<"Error "< return *contents[x]; }
};
Объявление шаблона класса#include template class arrayob{ type **contents; int size; int n; public:  arrayob(int number){contents=new type

Слайд 71Объявление шаблона функции
template
arrayob ::~arrayob ()


{for(int i=0;i

delete [] contents;
}









contents

num

num

st






num

Объявление шаблона функцииtemplate   arrayob ::~arrayob ()     {for(int i=0;i

Слайд 72Файл N.h
#include
#include

class TNum
{ public: int num;
TNum(int n):num(n)

{}
virtual ~TNum(void) {cout

Print(void) { cout<};
class TStr:public TNum  
{ public: char *st;
TStr(char *s):TNum(strlen(s))
{st=new char[num+1];strcpy(st,s); st[num]='\0'; }
~TStr(void)
{ cout<<"Destructor TStr."; delete [] st;}
void Print(void)
{TNum::Print(); cout<};
Файл N.h#include #include class TNum{ public:	int num;  TNum(int n):num(n) {}  virtual ~TNum(void) {cout

Слайд 73Тестирующая программа
#include "stdafx.h"
#include
#include
#include "A.h"
#include "N.h"
arrayob ob_a(5);


int main(int argc, char* argv[])
{ int n,i;
char

S[10];
for(i=0;i<5;i++)
{ puts("Input number or string"); gets(S);
n=atoi(S);
if (n==0&&S[0]=='0'||n!=0)
ob_a.add(new TNum(n));
else ob_a.add(new TStr(S));}
cout<<" Contents of array"<<'\n';
for (i=0;i return 0;
}
Тестирующая программа#include

Обратная связь

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

Email: Нажмите что бы посмотреть 

Что такое TheSlide.ru?

Это сайт презентации, докладов, проектов в PowerPoint. Здесь удобно  хранить и делиться своими презентациями с другими пользователями.


Для правообладателей

Яндекс.Метрика