
- •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. Узагальнені алгоритми та бібліотека стандартних шаблонів. Ітератори.
3. Парадигма модульности (локализации).
Акцент при разработке программ сместился от проэктирования процедур в сторону организации данных. Эта парадигма известна также как «принцип сокрытия данных»
Задачи: небольшая сложность, большая, сложная конструкция данных.
Модуль – программная единица, которая транслируется отдельно.
Я/п: Фортран 54, Борланд С++, Visual C++, Visual Basic. Паскаль не поддерживает, Turbo Pascal, Delphi поддерживают.
Языковые средства: отдельная трансляция различных единиц программы.
Пример: реализация стека. 1. Стек должен иметь унификационный интерфейс. 2. Предупредить попытки доступа к стеку в обход интерфейса стека. 3. Реализация такая, что до первого использования стек должен быть инициализирован.
//stack.h #define stack_size 100 #define stack_count 3 int stack_10 void push (char C); char pop ();
//stack.c #include “stack.h” static char[stack_size]; static char *sp=st+stack_size; void push(char C) {st[--sp]=C; } char pop() {return st[sp++];}
#include “stack.h” void main() {push(‘C’); if (‘C’=pop()) Error….}
«Принцип сокрытия данных» проявляется в след: имена переменных, констант, функций могут быть сделаны локальными в модуле.
Недостатки модульности: 1. Использование «типа» стек остается неизвестным для компилятора. 2. На этапе выполнения отсутствует контроль за инициализацией и присваиванием.
Ошибки, характерные для этого стиля программирования: 1. Забыли создать экземпляр. 2. Забыли удалить экземпляр. 3. Попытка использования после удаления. Например: T #pt; pt=new T; delete pt; *pt=…
С++ поддерживает раздельную компиляцию. Это можно использовать для организации программы в виде почти независимых частей.
Когда программа разработана в виде набора модулей, обработка ошибок должна рассматриваться в свете модулей. Какой модуль несет ответственность за обработку тех или иных ошибок? Часто модуль, обнаруживший ошибку, не знает, какие действия нужно предпринять. Например, переполнение стека.
Девиз: реши, какие требуются модули; разбей программу так, чтобы скрыть данные в модулях.
4. Парадигма атд.
В модульности невозможно тиражирование экземпляров типов данных, созданных в модуле. C++ - typedef, Pascal – type.
Тип данных: область - допустимых значений, множество допустимых операций. C++ - class{}, struct, Pascal – record;
В С++ эта проблема решается путем предоставления пользователю возможности непосредственно определять типы, которые ведут себя почти как встроенные. Такой тип часто называют абстрактным типом данных.
сlass complex{float Re, Im; public: friend complex operator + (complex a, complex b); complex ( ) {Re=0;Im=0;}//конструктор complex ( float r ) {Re=r; Im=0;} complex (float r, float i ) {Re=r; Im=i;} ~complex ( ) {}; //деструктор
ostream&operator<< (ostream&o, complex c);}
void f ( ) {complex a, complex b=1; complex c = complex (2,3); complex d=a+b; cout <<”d=”<<d;}
Метод представления знаний – фреймы.
Девиз: решить, какие требуются типы, связать с каждым типом данных множество операций, которые необходимы для обработки данных этого типа.обеспечить полный набор операций для каждого типа.
Языковые средства: оператор class, описатели ограничения доступа к классу, возможность перегрузки имен функций и символов операции.
Я/п: С++, Object Pascal. Поддерживают стиль: Turbo Pascal, C.
Девиз: определить, какие типы данных вам нужны, связать с каждым типом данных множество операций, которые необходимы для обработки этих типов данных.
Например, библиотека графических примитивов.
class shape {int x,y;int color;int hidden; pubic: shape();{…};…;shape{…}; void show(); void hide(); void drow(); void move (int x; int y); void shape::drow() shape circle; if(kind==1){drowcircle};else if(kind==2){drow dot;}; else {drow square}}} circle.show();
Недостаток примера: один раз определенный объект типа shape далее самостоятельно не адаптируется ко внешним переменам, например, в программу надо добавить еще один граф объект (star).
При превращении модуля в настоящий тип теряется одно свойство. Представление не отделено от пользовательского интерфейса, хотя и доступ к нему возможен только через функции-члены. Если представление сколь-нибудь значительно изменится, пользователь должен будет перекомпилировать программу. Если мы хотим полностью изолировать пользователей от изменений реализации типа, то необходимо отделить интерфейс от представления и отказаться от подлинных локальных переменных. Класс, обеспечивающий интерфейс для множества других классов, наз полиморфным типом.