Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву
Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Віртуальні конструктори та диструктори.Клонування.Содержание книги
Поиск на нашем сайте П-д: class array_stack {char *V; array_stack (int size); { V=new char [size];} ~array_stack () { delete V;}}; Приклад віртуального деструктора: Class emploee{…} Class manager:public emploee {..} //уфігурни дужках може бути наприклад int level;i nt*Listofsub. Void f() {emploee *p=new manager; delete p; //size of (*p)} class emploee {public:virtual ~emploee(){};} Це був приклад з порожнім деструктором. Void manager::~manager() {delete Listofsub;} Приклад віртуального конструктора: Class A{…} Class B: public A{…}; A*p;
B Маємо покажчик,але не знаємо на об”єкт якого типу-в цьому полягає віртуальність. Постановка задачі для віртуал.конструкторів.Е-покажчик на якийсь об”кт,не відомо на який,треба створити екзкмпляр такого самого типу.Конструктор така ф-ція,що брати адресу чи застосовувати до нього операцію & компілятор не дозволяє. Приклад: Class A {public: A(); virtual A*New obj ();}; class B: public A {public: B(); virtual B*Newobj() {return NewB};}; A*p; P=New B; A*g=p->Newobj(); B*pb; … … pa=pb; Клонування: Це створення ідентичної копії,для цього можна використовувати віртиальніконструктори. Приклад: Е-екземпляр якогось типу,треба не зная покажчика створити екземпляр цього ж самого типу та скопіювати його. Схема: Class C: public B {public: C(); virtual C*Newobj() {return New(c);} virtual C*clone(); private: void copi(B*); A*pa=NewC(p1,p2,…,pn); ....... A*pc=pa->clone(); //не знаємо тип ра} Приклад клонування бынарного дерева Це э загальнасхема клонування:эекземпляр типу с,треба незнаючи типу обьэкта створити ще один екземпляр,скопыювати в нього змыст попереднього обьэкту. Class BinTree {BinTree *left ,* right; public: BinTree (); BinTree (BinTree*l, BinTree*r); Void copy(BinTree*t);virtual BinTree (); Typedef int Tinfo; Class BinTreeInfo: public BinTree {Tinfo*info; public: BinTree Info(); BinTree Info (BinTree Info*l; BinTree Info*r; Tinfo*int);} Void copy (BinTree *t); Virtual BinTree Info*clone();}; Використання: BinTree * BinTree::clone() { BinTree*tmp; //Тимчасовий tmp=New BinTree; //tmp->left=left; //не скопіювали
Ефективний доступ до членів класу.Дружні ф-ії та дружні класи. Якщо тіло ф-ії оголошується в тілі класа то така ф-ія називається вбудованною.Від звичайного описання ф-ії вбудована відрізняється тим що в головній програмі: - компілятор має більшу змогу оптимізації; -вбудована ф-ія не використовує стек; Замість вбудованої ф-ії вставляється її тіло при копмпіляції,тому що при потребі відкомппілювати головну програму повинно бути тіло вбудованної ф-ії. Прототип вбудованної ф-ії - inline.Описання ф-ії можно не вносити в описання класу,але треба додати специфікатор inline. П-д: Void main () {g(par1,par2,…parN);} Порядок обчислення параметрів справа наліво перед викликом ф-ії. Ф-ії члени класу та не члени класу. П-д: class complex { public: complex operator +(complex b);};//не дружня ф-ія Розглянемо використання: Void f() { complex a,b,c; …. c=a+b;//ok! c=a+2;//треба конструктор який 2 перетворює в class complex c=2+a;//треба змінювати тип першого операнда В останньому прикладі треба зробити так: Class complex { float Re,Im; public: complex operator += (complex b); { Re+=b.Re; Im+=b.Im; return *this;}}; Якщо всеж нам потрібно виконати: 2+complex треба використати не члени класу. Complex operator + (complex a, complex b); Complex operator + (complex, double); Complex operator + (double, complex); Дружні ф-ії та дружні класи. Дружня ф-ія -це така ф-ія,яка оголошується в оголошенні класу з0 описувачем friend П-д:class C { public: ….. friend void f();} friend вказує на те що ф-ія має доступ до всіх полів класу на рівні з ф-ми-членами класу. Дружні ф-ії потрібні для того щоб дозволити доступ іншим ф-ям(не зовсім Довільний доступ)до полів класу.Якщо хтось змінить тіло дружньої ф-ії то треба перекомпілювати всі модулі які використовують члени класу.П-д: class Vector { int *V; int size; public: Vector (…) //конструктор Int elem(int i); Class matrix {Vector *m; int size2; public: int elem(int x,int y); void f() { matrix M; Vector V,V2; ….. V2=M*V; Дружні ф-ії має сенс описувати для зручносту доступу.Дружня ф-ія може бути дружня для декількох класів.Може Бути декілька дружніх ф-ій для одного класу.Навіть можна для одного класу оголосити дружнім інший клас.
Множинне наслідування. Приведення показчиків при множинному наслідуванні. С ¯ ¯ А В ¯ ¯ 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
Віртуальні базові класи. V V A B D¾C 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;}; Або використати глобальні змінні. Завдяки віртуальності можна добитися того щоб базовий клас входив один раз
Перевантаження функцій. Для будь-якого типу Т,типи Т, 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);}
|
||
|
Последнее изменение этой страницы: 2016-08-14; просмотров: 227; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 216.73.217.21 (0.009 с.) |