Информатика_11 (Лекции №1 С++)

2013-09-07СтудИзба

Описание презентации

Файл "Информатика_11" внутри архива находится в папке "Лекции". Презентация из архива "Лекции №1 С++", который расположен в категории "". Всё это находится в предмете "информатика" из 2 семестр, которые можно найти в файловом архиве МГТУ им. Н.Э.Баумана. Не смотря на прямую связь этого архива с МГТУ им. Н.Э.Баумана, его также можно найти и в других разделах. Архив можно найти в разделе "лекции и семинары", в предмете "информатика" в общих файлах.

Просмотр презентации онлайн

Текст из слайда

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

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

нисходящая разработка;

декомпозиция методом пошаговой детализации;

структурное программирование;

сквозной структурный контроль и т. д.
Основная программа
Глобальные данные
Данные
Данные
1
Подпрограммы с локальными данными
...
2
Данные
n1
2

Эволюция технологии разработки ПО (3)
Модульное программирование – выделение групп подпрограмм,
использующих общие глобальные данные в модули – отдельно
компилируемые части программы (многоуровневая декомпозиция).
Основная программа
Глобальные данные
Модуль 1
Модуль k
Данные
Данные
Данные
...
1
Подпрограммы с
локальными данными
Данные
n1
...
Данные
...
1
Данные
nk
Подпрограммы с
локальными данными
Модули с локальными данными и попрограммами
Слабое место – большое
количество передаваемых параметров.
3

Эволюция технологии разработки ПО (4)
3. Объектный подход к
программированию –
с середины 80-х до наших
дней.
Объектно-ориентированное
программирование –
технология создания
сложного программного
обеспечения, основанная
на представлении программы в виде системы объектов, каждый из которых является экземпляром определенного типа (класса),
а классы образуют иерархию с наследованием
свойств.
Объект 1
Данные
Данные
Данные
..
1
n1
Подпрограммы с
локальными данными
Сообщения
Объект 2
Объект S
Данные
Данные
Данные
..
1
..
Данные
Данные
n1
..
1
Подпрограммы с
локальными данными
Данные
nk
Подпрограммы с
локальными данными
Сообщения
Объект L
Данные
Данные
..
1
Подпрограммы с
локальными данными
Данные
n1
4

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

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

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

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

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

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

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

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

Объектная декомпозиция
Объектная декомпозиция – процесс представления предметной
области задачи в виде отдельных функциональных элементов
(объектов предметной области), обменивающихся в процессе
выполнения программы входными воздействиями (сообщениями) .
Объект отвечает за выполнение некоторых действий, инициируемых
сообщениями и зависящих от параметров объекта.
Активизировать
Ввод
функции
Задать
Активизировать
Меню
Активизировать
Активизировать
Активизировать
Таблица
Корни
Рассчитать
Рассчитать
Функция
Экстремумы
Рассчитать
Объект предметной
области характеризуется:

именем;

состоянием;

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

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

Методы построения классов
1. Наследование – механизм, позволяющий
строить класс на базе более простого
посредством добавления полей и определения
новых методов.
При этом исходный класс, на базе которого
выполняется построение, называют
родительским или базовым, а строящейся класс
– потомком или производным классом.
Если при наследовании какие-либо методы
переопределяются, то такое наследование
называется полиморфным.
2. Композиция – механизм, позволяющий
включать несколько объектов других
классов в конструируемый.
3. Наполнение – механизм, позволяющих
включать указатели на объекты других
классов в конструируемый.
13

11 Объектная модель С++
11.1 Описание класса
Формат описания класса:
class <Имя класса>
{ private:
<Внутренние компоненты класса>;
protected: <Защищенные компоненты класса>;
public: <Общедоступные компоненты класса>;
};
TSlovo
Пример: Объект – строка (Ex5_01)
-Len
-Ref
#Pos
+TSlovo()
+~TSlovo()
+GetCh()
+PrintPos()
14

Пример описания класса (файл Slovo.h)
class TSlovo
{ private:
int Len;
char *Ref;
protected: int Pos;
public:
TSlovo(char *ref,int pos=0);
Конструктор
inline ~TSlovo(void) {delete Ref;}
Деструктор
inline char GetCh(void)
{ char Chr=Posif(!Chr) Pos=-1;
return Pos++,Chr;
}
virtual void PrintPos(void);
15
};

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


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

11.2 Объявление объектов и обращение к
полям
<Имя класса> <Список переменных и/или указателей>;
Примеры:
а) TPoint a,*b, c[5]; /* класс описан без конструктора или с
конструктором без параметров */
б) TSlovo D(“Это строка”, 4); //конструктор с параметрами
<Имя объекта>.<Имя поля или метода>
<Имя указателя на объект> -><Имя поля или метода>
<Имя массива>[<Индекс>] .<Имя поля или метода>
Ссылка
Self (Паскаль)  this (С++)
Указатель
Пример: this->Pos
17

Тестирующая программа
Использует
OOP1.cpp
Реализует
Slovo.h
Slovo.cpp
#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;
}
World
18

11.3 Наследование
class <Имя производного класса>:
<Вид наследования> <Имя базового класса>{…};
Вид
наследования
Объявление поля в
базовом классе
Видимость в
производном
классе
private
private
protected
public
не видимо
private
private
protected
private
protected
public
не видимо
protected
protected
public
private
protected
public
не видимо
protected
public
19

Пример наследования Ex5_02 (Text.h)
TSlovo
TText
#Pos
+SetPos()
+PrintPos()
#include "f:ivaprimer.vclectionoopr1slovo.h"
#include
class TText:public TSlovo
{
private:
int Pos;
public:
inline
TText(char *ref,int pos=0):TSlovo(ref),Pos(pos) {}
void SetPos() { TSlovo::Pos=Pos; }
inline
virtual void PrintPos();
};
void TText::PrintPos(){cout<

Тестирующая программа
#include "stdafx.h"
#include "Text.h"
int main(int argc, char* argv[])
{
TText Greet("Hello World",6);
TText(char *ref,int pos=0):
TSlovo(ref),Pos(pos)
char Chr;
while (Chr=Greet.GetCh()) cout<cout<<'n';
void SetPos(){TSlovo::Pos=Pos;}
Greet.SetPos();
while (Chr=Greet.GetCh()) cout<cout<<'n';
Greet.PrintPos();
Hello World
return 0;
World
}
0:6
21

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

Полиморфизм
В теории
простой полиморфизм
сложный полиморфизм
В С++:
переопределение методов
виртуализация методов
Пример использования сложного п-ма (Ex5_03):
#include "stdafx.h"
#include "f:ivaprimer.vclectionoopr11Ttext.h"
int main(int argc, char* argv[])
{ TSlovo SGreet("HELLO!!!"), *Ref=&SGreet;
TText Greet("Hello World",6);
Ref->PrintPos();
cout<Ref=&Greet;
Ref->PrintPos();
0
cout<0:6
return 0;
}
23

11.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}};
...
}
24

11.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,
A
? ?
E
*I = new TPoint(4,6), *M = new TPoint[3], *S[3];
B
2 3
C
? ? ? ? ? ? ? ? ? ?
I
M
4 6
D
2 4 4 5
S
? ? ? ? ? ?
25

Распределение/освобождение памяти и
инициализация объектов в программе
A.SetPoint(2,3); A.Print();
A
B
C
B.Print();
? ?
2 3
? ? ? ? ? ? ? ? ? ?
for (i=0;i<5;i++) {C[i].SetPoint(i,i+1); C[i].Print();}
E
I
for(i=0;i<2;i++) d[i].Print(); D
E=new TPoint(3,4); E->Print();
2 4 4 5
4 6
I->Print();
for (i=0;i<3;i++) {M[i].SetPoint(i,i+1); M[i].Print();}
for (i=0;i<3;i++)
{S[i]=new TPoint(i,i+1); S[i]->Print;}
delete E;
delete I;
M
delete [] M;
S
? ? ? ? ? ?
for (i=0;i<3;i++) delete S[i];
}
26

Список инициализации.
Инициализация объектных полей
Формат элемента списка инициализации:
<Имя поля>(<Список выражений>)
Примеры:
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( ) ! 27

11.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;}
28

Пример обязательного определения
копирующего конструктора (Ex5_05)
#include "stdafx.h"
A
B
pn
#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;
}
29

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

Порядок вызовов конструкторов и деструкторов
для объектов производных классов (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");}
Неявный вызов
};
конструктора TNum
class TNum2:public TNum
{ public:
int nn;
TNum2(int an):nn(an) {puts("TNum2(an)");}
~TNum2(){puts("~TNum2");}
TNum()
};
TNum2(an)
int main(int argc, char* argv[])
~TNum2
31
~TNum
{TNum2 A(1);
return 0;}

11.9 Абстрактные методы и классы
Абстрактный метод.
class AClass
{ …
virtual int Fun(int,int)=0;
}
Класс, содержащий абстрактный метод, называется
абстрактным.
Объекты абстрактного класса создавать запрещено !
32

11.10 Множественное наследование.
Виртуальное наследование
TA
TB
TC
TD
Проблема:
дублирование
полей
базового
класса
class <Имя>: virtual <Вид наследования> <Имя базового класса>
{ ...};
Порядок вызовов конструкторов:

конструктор виртуально наследуемого базового класса,

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

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

Пример множественного виртуального
наследования
#include "stdafx.h"
#include
class TA
{ protected:
int Fix;
public:
TA() { cout<<"Inside An";}
TA(int fix):Fix(fix) { cout<<"Inside TA intn";}
};
class TB:virtual public TA
{ public: int One;
TB(void){ cout<<"Inside TBn";}
};
34

Пример множественного виртуального
наследования (2)
class TC:virtual private TA
{ public:
int Two;
TC() { cout<<"Inside TCn";}
};
class TD:public TB,public TC
{ public:
TD(int fix):TA(fix){cout<<"Inside TDn";}
void Out( ) {cout<};
main()
Inside TA int
{ TD Var(10);
Inside TB
Var.Out( );
Inside TC
return 0;
Inside TD
}
10
35

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

Пример приведения типов объектов
(Ex5_07)
#include "stdafx.h"
#include
#include
class TA
c
TA
TA()
func()
TB
{ protected:
char c;
S
public: TA(char ac):c(ac){}
TB()
virtual void func(){cout<func()
};
class TB:public TA
{ char S[10];
public: TB(char *aS):TA(aS[0]){strcpy(S,aS);}
void func(){cout<};
37

Пример приведения типов объектов(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"<38
return 0;}

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

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

Файл 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;}
41
};

Файл 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;
}
}
42

Файл 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;
}
}
43

Файл 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();}
44

Тестирующая программа
#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:");
45
N.ForEach(Show);

Тестирующая программа(2)
p=N.First(); k=0;
while (p!=NULL)
{ if (TNum *q=dynamic_cast(p)) k+=q->num;
// установить создание RTTI (/GR в ProjectSettings...)
p=N.Next();
}
printf("Summa= %dn",k);
p=N.Last();
i=0;
while (p!=NULL)
{if (TChar *q=dynamic_cast(p)) str[i++]=q->ch;
p=N.Previous();
}
str[i]='';
printf("String= %sn",str);
return 0;
}
46

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

Статические компоненты класса (Ex5_09)
Пример. Создать список объектов
first
last
next
next
Сегмент данных
Файл 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
o
48

Файл 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);
}
49

Тестирующая программа
#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
50

11.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;
// класс
51

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

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

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

Файл Tpoint.cpp
#include "stdafx.h"
#include "Tpoint.h"
TPoint& TPoint::operator+=(TPoint &p)
{ x+=p.x; y+=p.y;
cout<<"operator+=n";
return *this;
}
TPoint 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;
}
55

Тестирующая программа
#include "stdafx.h"
#include "Tpoint.h"
int main(int argc, char* argv[])
Constructor
{
TPoint p(2,3),q(4,5),r(7,8);
Constructor
p+=r;
Constructor
Operator +=
p.Out();
q=p+r;
TPoint pp(x,y);
Constructor (pp)
q.Out();
return 0;
}
Оperator +
Operator +=
Copy constructor
Destructor (pp)
Operator =
Destructor
Destructor
Destructor
Destructor
cout<<"operator+n";
pp+=p;
x+=p.x; y+=p.y;
return
}
cout<<"+=n";
return *this;
56

Пример 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)&&(nvoid print() { cout<<"Str: "<cout<String operator+(String &A);
String operator+(char c);
String& operator=(String &S);
};
57

Файл S.cpp
#include "stdafx.h"
#include "s.h"
String::String(int Len,char Name){ len=Len;
str=new char[len+1]; str[0]=''; name=Name;
cout<<"Constructor with length "<}
String::String(char *vs,char Name) { len=strlen(vs);
str=new char[len+1]; strcpy(str,vs); name=Name;
cout<<"Constructor "<}
58

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

Файл S.cpp (3)
String
String::operator+(String &A)
{ cout<<"Operation +"<<"n";
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]='';
cout<<"Operation +c"<<"n"; return S;
}
60

Файл S.cpp (3)
String& String::operator=(String &S)
{
cout<<"Operation ="<<"n";
len=S.Length();
if (str!=NULL) delete[]str;
str=new char[len+1];
strcpy(str,S.str);
cout<<"Operation ="<<"n";
return *this;
}
61

Тестирующая программа
#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;
}
62

Выполнение операций
Выполняемые операторы
C=A+B;
String operator+(String &A)
{ cout<<"Operation +"<<"n";
int j=len+A.Length();
String S(j,'S');
strcpy(S.str,str);
strcat(S.str,A.str);
cout<<"Operation +"<<"n";
return S;
}
String& operator=(String &S)
{ cout<<"Operation ="<<"n";
len=S.Length();
if (str!=NULL) delete[]str;
str=new char[len+1];
strcpy(str,S.str);
cout<<"Operation ="<<"n";
return *this;
}
Результаты
Operation +
Constructor with length S
Operation +
Copy from S to K
Destructor S
Operation =
Operation =
Destructor K
63

11.16 Параметризованные классы (шаблоны)
Формат описания шаблона класса:
template <Список параметров><Описание класса>
Формат объявления объектов:
<Имя класса> <Список аргументов>
<Имя объекта>(<Параметры конструктора>)
Пример. Динамический массив
(Ex5_12)
64

Файл 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];
}
};
65

Тестирующая программа
№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<5;i++)
{ int_a[i]=i*3+2*(i+1); char_a[i]='A'+i;}
puts("Massivs ");
for (i=0;i<5;i++)
{ printf("%5d
%2cn",int_a[i],char_a[i]);}
return 0;
}
66

11.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;}
67

Тестирующая программа
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;
}
68

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

Объявление шаблона класса
#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]; }
};
70

Объявление шаблона функции
template
arrayob ::~arrayob ()
{for(int i=0;idelete [] contents;
}
contents
st
num num
num
71

Файл N.h
#include
#include
class TNum
{ public:
int num;
TNum(int n):num(n) {}
virtual ~TNum(void) {cout<<"Destructor TNum "<virtual void 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]='';
}
~TStr(void)
{ cout<<"Destructor TStr."; delete [] st;}
void Print(void)
{TNum::Print(); cout<};
72

Тестирующая программа
#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;ireturn 0;
}
73

Свежие статьи
Популярно сейчас
Почему делать на заказ в разы дороже, чем купить готовую учебную работу на СтудИзбе? Наши учебные работы продаются каждый год, тогда как большинство заказов выполняются с нуля. Найдите подходящий учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
5259
Авторов
на СтудИзбе
421
Средний доход
с одного платного файла
Обучение Подробнее