
- •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. Узагальнені алгоритми та бібліотека стандартних шаблонів. Ітератори.
5. Парадигма ооп.
class shape {int x,y; int boolean; int color, kind;public: shape ( ) {}; void show ();void hide (); void drow ();} void shape:: drow( ) {if (kind==1){//drow circle}if (kind==2) {//нарис точку} else {// нарис квадрат } void main ( ) { shope circle( )circle.show ( ); dot.hide (); circle.drow(); dot.drow();}. Недостаток – не адаптируется к внешним переменам. Требуется добавить элемент, а фн drow() никак на это не отреагирует.
ООП дает возможность добавлять элементы, не изменяя исходный текст.
Я/п: C++, Object Pascal, SmallTalk.
Поддержка: 1. Инкапсуляция. (АТД) 2. Полиморфизм. 3. Наследование (базовый тип <- производный тип (создается на основе базового).
class shape {int x,y, color,hidden; public: void drow ();} #include “shape.h” class circle: public shape{int radius;public: virtual void drow();}void main(){ circle c1,c2;star s1,s2,s3;c1.drow(); s1.drow(); s1.move(k,l);} void shape:: move (int x1, int y1){hide( ); x=x1;y=y1; drow();}
Девиз: Реши, какие требуются классы, опиши их свойства, обеспечь полный набор операций для каждого класса, явно вырази общность через наследование и полиморфизм.
В случаях, когда такой общности нет, достаточно абстракции данных. Иерархии классов и абстрактные классы дополняют, а не исключают друг друга.
6. Поняття про класи в С++. Класи та принципи ООП. Обмеження доступу до членів класу. Покажчик на себе.
Класс в С++ - это тип, сконструированный пользователем.
Пример: struct Date{ int d,m,y;}; void init (Date&d,int d,int m,int y); viod add_year(Date&d,int n); Здесь нет явной связи между типом данных и функциями. Такую связь можно установить, объявив функции в качестве членов структуры: struct Date{ int d,m,y; void init (int d,int m,int y); viod add_year(int n);
Функции, объявленные внутри определения класса, наз функциями-членами и их можно вызвать только для переменной соотв типа, используя стандартный синтаксис доступа к членам структуры. Например: Date my; void f() {Date today; today.init(1,1,1); my.init(1,2,1); Date tomorrow=today; tomorrow.add_day (1);…}
Т.к. различные структуры могут иметь функции-члены с одинаковыми именами, при определении функции-члена мы должны указать имя тсруктуры: void Date::init(int..) {d=dd;…}
В теле функции-члена имена членов этого же класса можно использовать без явного указания объекта.Конструкция class X{}; наз определением (объявлением) класса.
1. Все, что существует в предметной области, это объекты. 2. Объекты выполняют какие-то взаимодействия друг с другом посредством сообщений. 3. Каждый объект имеет собственную память (независимую), которая состоит из других объектов. 4. Каждый класс задает поведение объектов своего типа с помощью методов или функций этого класса. 5. Каждый объект является представителем (экземпляром) класса. Класс отображает свойства своих экземпляров. 6. Классы могут объединяться в иерархию, т.е. в деревовидную структуру, которая наз иерархией наследования.
Основной смысл наследования состоит в том, что свой ства и поведение классов, которые принадлежат иерархии наследования, являются доступными для классов, которые расположены ниже в иерархии наследования.
Объявление экземпляров класса: Date d1,d2,d3; Обращение к полям класса: d1.m; Date *d; d->m; *d.m; d1.assign(…).
3 вида доступа: public – имеют публичный доступ, т.е. к переменной может получить доступ любой пользователь, protected – доступ запрещен для всех кроме производных классов, private – доступ могут получить только члены этого класса, published. Пользователь класса – это функция, которая обращается к полям или методам класса.
Пример: class C {int l; private: int i; protected: int j; public: int k;} void f(void) {C c; c.k=0;c.l=0; //Err c.i=0;//Err c.j=0;//Err } void C::cf(void) {C c; c.l=0; c.i=0; c.k=0; c.j=0;} Пусть функция df – член класса D, кот явл производным от С: void D::df(void) {C c; c.j=0; j=0; }
Преимущества ограничения доступа: Первая стадия отладки – локализация ошибки – может быть завершена еще до запуска программы. Если мы изменим представление класса, нам потребуется только изменить функции-члены, чтобы воспользоваться новым представлением. Код пользователя непосредственно зависит только от открытого интерфейса, и код не потребуется переписывать (хотя может понадобиться его перекомпиляция). Другое преимущество: чтобы научиться пользоваться классом, его потенциальному пользователю потребуется ознакомиться только с определениями функций-членов.
THIS. Функции add_year(),… были определены как не возвращающие значения. Иногда возникает необходимость выстроить функции в цепочку. Для этого требуется, чтобы функции возвращали ссылку на измененный объект. Void f (Date&d){d.add_day(1).add_month(1).add_year(1);} class Date{… Date&add_yaer(int n);…};
Каждая нестатическая функция-член знает, для какого объекта она вызвана, и может явно на него ссылаться. Date&Date::add_year(int n) {if (d==29&&m==2&&!leapyear(y+n)) {d=1; m=3;} y+=n; return *this; }
return *this – возвращение самого экземпляра.
Выражение *this означает объект, для которого вызвана функция-член. В нестатической фн-члене ключевое слово this является указателем, для которого вызвана фн-член. В нест ф-ч класса Х this имеет тип Х*. Однако, это не обычная переменная; невозможно получить ее адрес или присвоить ей что-нибудь. В константной фн-ч класса Х this имеет тип const X* для предотвращения модификации самого объекта. this стоит на первом месте в списке формальных параметров (неявно).
class C {int a,b; public: int readA();} int C::readA(//this){return a;} void f(void) { C c1,c2; int x; x=c1.readA(); x=c2.readA();…} – неявное использование. Можно явное: int C::readA() {return this->a; или return *this.a; }
В большинстве случаев использование this является неявным. В частности, каждое обращение к нестат члену внутри класса неявно использует this для доступа к члену соотв объекта. Примером явного использования this являются операции со связанным двунапрвленным списком.