
- •1. Типи знань і методи їх представлення.
- •2. Парадигми імперативного стилю. Підтримка в мовах програмування. Парадигма процедурності.
- •3. Парадигма модульности (локализации).
- •4. Парадигма атд.
- •5. Парадигма ооп.
- •7. Ефективний доступ до членів класу. Дружні функції та дружні класи.
- •8. Конструкторы и деструкторы.
- •9. Инициализация полей класса. Статические члены класса.
- •10. Наследование классов. Конструкторы базового класса.
- •11. Обмеження доступу до базового класу.
- •12. Множинне наслідування.
- •13. Виртуальные базовые классы.
- •14. Конкретные и абстрактные типы. Виртуальные функции.
- •15. Виртуальные деструкторы и «витруальные» конструкторы. Клонирование.
- •16. Посилання. Ініціалізація, використання, порівняння з покажчиками.
- •17. Перевантаження функцій.
- •18. Перевантаження унарних операцій.
- •19. Перевантаження бінарних операцій.
- •20. Параметризація типів за допомогою шаблонів.
- •21. Параметризація функцій за допомогою шаблонів.
- •22. Перетворення за допомогою конструкторів. Обмеження.
- •23. Перетворення за допомогою перетворюючих функцій.
- •24. Область видимости.
- •25. Пространства имен. Директива using.
- •27. Потоки. Віртуальні операції введення та виведення.
- •29. Узагальнені алгоритми та бібліотека стандартних шаблонів. Ітератори.
15. Виртуальные деструкторы и «витруальные» конструкторы. Клонирование.
class employee{} class manager:public employee {int level;} void f(){ employee *p=new manager; delete p;}
Если рассмотреть размер объекта *p, то он будет равен размеру объекта employee, хотя память выделялась для manager.
Class employee{…public: virtual ~employee(){}} – освобождается память размера employee. Т.к. функция виртуальна,то обращение delete *p приводит к удалению того экземпляра объекта, к которому принадлежит p (employee).
При работе с производными классами лучше использовать виртуальные деструкторы.
«Виртуальные конструкторы».
Для того, чтобы создать объект, конструктор должен знать его точный тип. Следовательно, конструктор не м/б виртуальным. Конструктор является не совсем обычной функцией: он взаимодействует с процедурами управления памятью способом, недоступным обычным функциям-членам. Как следствие, вы не можете получить указатель на конструктор.
Оба ограничения можно обойти, определив функцию, которая вызывает конструктор и возвращает созданный объект. Такие функции явл виртуальными, и они (косвенно) создают объекты, их часто наз «виртуальными конструкторами». На самом деле. Каждая просто использует конструктор для создания подходящего объекта.
Пример использования пустой вирт фн, кот вызывает конструктор:
class A {public: A(); virtual A* newObj() {return new A;} class B:public A {public: B(); virtual B* newObj(){ return new B;} main(){ A *p; B *pb; p=new B; A *q=p->newObj(); pa=pb;}
Клонирование – это создание единичной копии объекта не совсем известного типа.
Создадим идентичную копию объекта с пом виртуалььного конструктора.
class C:public B{public: C(); virtual C* NewObj(){return new C;}; virtual C* clone(); private: void copy(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 *clone();}; class BinTreeInfo^public BinTree {Tinfo *info; public: typedef int Tinfo; BinTreeInfo(); BinTreeInfo(BinTreeInfo *l,BinTreeInfo *r,Tinfo *int); void copy(BinTreeInfo *t); virtual BinTreeInfo *clone();}; BinTree *BinTree::clone(){BinTree *tmp; tmp=new BinTree; tmp->left=left; tmp->right=right; if(left) tmp->copy(left); if (right) return tmp;};
16. Посилання. Ініціалізація, використання, порівняння з покажчиками.
Ссылка явл альтернативным именем объекта. Указатель – это перменная, сохраняющая адрес объекта некоторого типа.
При объявлении указателя или ссылки исп символы: * и &. & - операция взятия
адреса. Реализацией ссылки явл константный указатель, при каждом использовании которого происходит разыменование. void f(){int i=1; intr=i; int x=r;//x=1 r=2;// i=2;
Чтобы быть уверенными, что ссылка явл именем чего-нибудь (т.е. привязана к объекту), мы должны инициализировать ее. 1. int &ri=i; 2. class C {int &ri;…public: с(int i); ri(i);…};
Ни один оператор, несмотря на форму записи, не производит действия над ссылкой. Чтобы получить указатель на объект, именем кот явл ссылка ri, мы можем написать &ri.
Использование ссылок. 1. Передача параметров через имена (адрес). Переданный ссылкой аргумент не может быть изменен, т.к. это только копия. Void assign (int i; int value) {i=value;} void main (){int x=0; assign (x,1); cout<<x;//(выдаст 0)}
2. Псевдопеременная – это функция, указатель на которую можно ставить в левой части оператора присваивания. int f(int i); f(3)=2;//Err int &f(int i); f(3)=2;//Ok