Язык программирования C++_5 (Лекции по С++)

2013-10-10СтудИзба

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

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

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

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

Глава 5.
Объектная модель С++
МГТУ им. Н.Э. Баумана
Факультет Информатика и системы управления
Кафедра Компьютерные системы и сети
Лектор: д.т.н., проф.
Иванова Галина Сергеевна
1

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

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

Пример описания методов (файл 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)
{
std::cout<}
4

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

Тестирующая программа
Использует
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
6

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

Пример наследования 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
9

5.4 Полиморфизм
Полиморфизм – «многоформие», т.е. свойство изменения формы. В
программировании встречаются следующие виды полиморфизма:
В языках
высокого
уровня не
встречается
«Чистый»
Параметрическая
Полиморфизм
Перегрузка
функций
Переопределение
методов в иерархии
В пространствах
имен
Простой
полиморфизм
Настройка
шаблонов
Сложный
полиморфизм
10

Полиморфизм
В Паскале:
простой полиморфизм
сложный полиморфизм
В С++:
переопределение методов
виртуализация методов
Пример использования сложного полиморфизма (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;
}
11

Использование пространств имен для
перегрузки методов класса (Ex5_111)
#include "stdafx.h"
#include
class A
{
public:
void func(int ch);
};
class B : public A
{
public:
void func(char *str);
using A::func; // перегрузить B::func
};
void A::func(int ch)
// метод базового класса
{ std::cout<<"Symboln"; }
void B::func(char *str) // метод производного класса
{ std::cout<<"Stringn"; }
int main()
{
B b;
b.func(25);
// вызов A::func()
b.func("ccc"); // вызов B::func()
getch();
return 0;}
A
func(int)
B
func(char*)
12

5.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}};
...
}
13

5.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
? ? ? ? ? ?
14

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

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

5.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;}
17

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

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

Вызов конструкторов и деструкторов для
объектов производных классов (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
~TNum
{TNum2 A(1);
return 0;}
20

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

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

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

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

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

Пример множественного виртуального
наследования
#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";}
};
23

Пример множественного виртуального
наследования (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<};
Inside TA int
main()
Inside TB
{ TD Var(10);
Inside TC
Var.Out( );
Inside TD
return 0;
10
}
24

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

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

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

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

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

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

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

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

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

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

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

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

Статические компоненты класса (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
37

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

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

5.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;
// класс
40

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

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

Пример 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;
};
43

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

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

Пример 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);
};
46

Файл 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 "<}
47

Файл 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 "<}
48

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

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

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

Выполнение операций
Выполняемые операторы
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
52

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

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

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

5.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;}
56

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

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

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

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

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

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

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