- •2.Парадигми імперативного стилю.Парадигми процедур-ності.
- •3.Парадигма модульності.
- •4.Парадигма атд
- •5.Парадигма ооп.
- •7.Констуктори та деструктори.
- •8.Наслідування класів.
- •9.Обмеження доступу до базового кл.
- •10. Конструктор базового класу. Ініціалізація полів кл
- •11.”Покажчик на себе”. Статичні поля класу.
- •12.Конкретні і абстрактні типи. Віртуальні ф-ії.
- •13.Віртуальні конструктори та диструктори.Клонування.
- •14. Ефективний доступ до членів класу .Дружні ф-ії та дружні класи .
- •15.Множинне наслідування.
- •16.Віртуальні базові класи.
- •17.Перевантаження функцій.
- •18.Перевантаження унарних операцій.
- •22.Перетворення за допомогою конструкторів.
- •28.Елементи узагальненого програмування. Протеріччя з ооп. Поняття про ітератори та узагальнені алгоритми. Побудова узагальненої функції.
- •П алгоритми
- •30.Елементи узагальненого програмування. Контейнерно-ітераторна модель на основі шаблонних класів та шаблонних функцій.
- •Типи знань та методи їх представлення.
- •Парадигми імперативного стилю.Парадигми процедур-ності.
15.Множинне наслідування.
Приведення показчиків при множинному наслідуванні.
С
А В
L L
Неявні перетворення:
С*pc = newC;
L*pl ;
pl=pc ; //err! так як не зрозуміло до якого класу перетворювати
pl=(A*)pc ; // ok!
Pl=(L*)(A*)pc ; // ok!
Явні перетворення:
//"manageremployer"
// pm=(manager *)pl;
pc=pl ; // err!
a=(C*)pl ; //err!через неоднозначність
pc=(C*)(B*)pl ; //ok!
Усунення неоднозначності при визові ф-ій базового класу при множинному наслідуванні:
info{L,A,B,C}::f( );
info*C::f( )
{info*pi1=A::f( );
info*pi2=B::f( );
return merge(pi1,pi2);}
//info-інформація що повертає ф-ія,merge- злиття інформації
class employer
{ public : void f( );}
class manager:public
employer
{public : vod f( );}
void manager ::f( )
{ employer:: f( );
….};
Приклад змінної ієрархії:
class foreman :: public
employer
{ public : void f( );};
class manager:public
foreman
{ public : void f( );};
class foreman :public
employer
{ typedef employer
inherited;
public:
void f ( )
{interited :: f( );
……}};
class manager:public foreman
{ typedef employer
inherited;
public:
void f ( )
{interited :: f( );
……}};
interited введений для того щоб коли додасться ще один клас можна було змінити лише foreman
16.Віртуальні базові класи.
V
V A B
DC
Virtual -фактичний
class A:public virtual V;
class A:public virtual V;
class A:public virtual V;
Віртуальні базові класи потрібні для того щоб можна було спільну інформацію для класів А і В розділяти не використовуючи
virtual .Це можна зробити так:
class A
{ friend class V ;};
class V
{ friend class A ;};
Або використати глобальні змінні.
Завдяки віртуальності можна добитися того щоб базовий клас входив один раз
17.Перевантаження функцій.
Для будь-якого типу Т,типи Т, constT,T& мають одну і ту саму мн-ну ініціалізуючих значень.
Int i; void f (int i) ;
Const int i; void f(int &i ); int f i –винекне помилка або не мож-ливість відрізнити.
Для будь-якого типу Т,типи Т&,const T&,volatile T& є різними.У ланцюжку наслідува-ння класів одне і те саме ім’я ф. в різних кл. не перевантажуєть-ся,а перекривається.
Class X1
{void f(int f);}
classX9:public X8
{void f(double);}
void q(X9*p)
{p->f(2);}
18.Перевантаження унарних операцій.
Перевантаження операцій:+,-,*,/,%,==,=, &&,...,new,delete.Не можна перевантажувати: .,.*,::, ?:,#,##.На перевантаження на-кладаються обмеження:
1.Не можна перевантажувати операції для не классових ти-пів.Треба щоб або операція була членом якогось кл.,або принайм-ні один операнд має класов тип.
2.Можна змінити ассоціативні-сть,приоритет,кількість операн-дів.
3.Ніяких обмежень на тип,який повертає перевантаження опера-цій,немає.
Унарні операції:
operator @( )передається через this;
operator @(X)не є членом кл.
Наприклад: ++,--
TElem operator++( );
TElem operator – (TElem,int);
T operator / ( );//Error
Операції =,[ ],-> мають бути не статичними функціями-членами.
Перевантаження.
Operator ( )(P1..PN)
Перевантаження [ ]
Class vector
Int *v;
Int count;
Public:
Int f operator[ ](int i)
{...return vc1..}
void f(vector v1)
{count<<v1[1];};
1,1[2]=3;
Асоціативний масив.
Class NameList
{struct TItem
{char *name;
int id;}
TItem *List; int size;
Public: int append (char*,int);
Int& operator[ ](char*); ...}
NameList NL;
Int code;
.................
code=NL[“Gates”];
NL[“Bock”]=777;
Int& operator(char*hm)
{int i;
for (i=0; i<size; i++)}
if(stramp (hm.List[i].name)==0)
break
if (i==size)
i=append(hm,0)
return List[i].id;}
Як перевантажити?
Int i;
Class c {int m;}
c a; c*pa;
pa->m=2;
cout<<pa->m;
class c class cptr
p ublic: {c*pa;public:
int m; c*operator->();
cptr(c*ptr)
{pc=ptr};}
c C;
cptr P=&C
. . . . . . . . .
P->m=2;//(p.operator-> //( ))->m=2
Cout<<p->m<<endl;
c*cptr::operator->( )
{//......
return pc;}
19.Перевантаженя бінарних операцій.
Перевантаження операцій:+,-,*, /,%,==,=, &&,...,new,delete.Не можна перевантажувати: .,.*,::, ?:,#,##.На перевантаження накладаються обмеження:
1.Не можна перевантажувати операції для не кл. типів.Треба щоб або операція була членом якогось кл.,або принаймні один операнд має кл. тип.
2.Можна змінити ассоціатив-ність,приоритет,кількість опера-ндів.
3.Ніяких обмежень на тип,який повертає перевантаження опера-цій,немає.
Бінарні операції.
X @ Y
Operator @(Y);член кл. (X*this)
Operator @(X,Y)
Int operator +(intx,int y)
{return x+y;}//error
class C
{public:
c operator +(c,double);
void f(c,b)
{c a;
a=b+1;//b.operator+ (1)
a=b+1.0;//a=::operator +(b,1.0)
a=b+1L;}//error
20.Параметирзація типів за допомогою шаблонів.
Шаблони кл.
template<Список пара метрів>
Class . . .{. . . }
template<class T>
class vector
{T*v; public: vector (int i);
T&operator[ ](int index);}
Vector<int>v1(10);
Vector<complex>v2 (30
Typedet vector<comp lex>cvec;
cvec v3(40);// v2 i v3 одного типу
v1[1]=7;
v2[3]=7;//треба мати конструк-тор.
v2[4]=v3[3];//побітове копіювання або перевантажити =class vector<shape*>;//попереджуюче оголошення.
vector<mindow> *current_widow;
class svector: public: vector<shape*>;
Еквівалентність шаблонних ти-пів. Якщо вони походять від од-ного шаблона і значення шаб-лонів співпадають.
template<
class bufer
{T v[i];
. . . . . . . . . }
bufer <char.10*2>b1;
bufer <int,20>b2;
bufer <chape.20>b3;
b3 i b2 еквівалентні.
21.Параметризація функції за допомогою шаблонів.
template <список форм пара-метрів>//оголошення.
template <class T>
void sort(vector<T>&)
void f(vector<complex>CV;
vector<int>iv)
{ sort(cv);//sort(vector <complex>&)
sort(iv);}//sort(vector<int>&)
Сумісне використання шаблон-них і нешаблонних функцій.
template<classT>
T max(T&xT&y)
{return x>y?x :y;}
void f(int a,int b,char c,char d)
{int e,char f;
c=max(a,b);//max(int&,
int&)
f=max(c,d);//max(char&,char&)
e=max(a,c);}//error
int max(int&,int&) // прототип.
Правило оголошення функції с шаблонами.
Якщо виклик ф. повністю спів-падає з прототипом,то відбуває-ться генерація.
Пошук шаблонної ф.,яку можна отримати з визовом. Робиться спроба шляхом неявних пере-творень пар-рів у визові ф-ції привести типи шаблоні до типів прототипі нешаблонної ф-ції. Шаблонній функції,приходиться зустрічатися серед формальних параметрів шаблонної функції.
template <class T>T x creator( ); //error
template <class f( )> void T//error
{T*a;....}
template<class T>
class c
{public:
void f( ){T x a;};}