Скачать презентацию Методы программирования Хуторова Ольга Германовна Лекция 8 Скачать презентацию Методы программирования Хуторова Ольга Германовна Лекция 8

MP_L8.ppt

  • Количество слайдов: 36

Методы программирования © Хуторова Ольга Германовна Лекция 8 Методы программирования © Хуторова Ольга Германовна Лекция 8

Темы лекции n объектно-ориентированное программирование q q q Инкапсуляция Наследование Полиморфизм Темы лекции n объектно-ориентированное программирование q q q Инкапсуляция Наследование Полиморфизм

ООП n n n Класс в С++ включает в себя не только данные, но ООП n n n Класс в С++ включает в себя не только данные, но и методы (функции) для работы с этими данными. Конструкторы и деструкторы позволяют правильно создавать и уничтожать представителей классов. Благодаря операторам new и delete, конструкторы и деструкторы вызываются даже при работе с динамической памятью.

три основных свойства ООП n Инкапсуляция - сведение кода и данных воедино в одном три основных свойства ООП n Инкапсуляция - сведение кода и данных воедино в одном объекте, реализация которого скрыта от пользователя

Инкапсуляция class file { void print () void delete() … } void main() { Инкапсуляция class file { void print () void delete() … } void main() { … file. print() ; file. delete(); } // печатает копию файла // удаляет файл

#include <iostream. h> #include <string. h> class dog { char breed[64]; int average_weight; int #include #include class dog { char breed[64]; int average_weight; int average_height; void show_dog(void) ; public: dog(); ~dog }; void dogs: : show_breed(void) { cout << "Порода: " << breed << endl; cout << "Средний вес: " << average_weight << endl; cout << "Средняя высота: " << average_height << endl; } void main(void) { dog happy, matt; strcpy(happy. breed, "Долматин") ; happy. average_weight = 58; happy. average_height = 24; strcpy(matt. breed, "Колли"); matt. average_weight =22; matt. average_height = 15; happy. show_breed() ; matt. show_breed(); }

интерфейсные функции Пример Часть1 #include <iostream. h> #include <string. h> class employee { public: интерфейсные функции Пример Часть1 #include #include class employee { public: int assign_values(char *, long, float); void show_employee(void); int change_salary(float); long get_id(void); private: char name [64]; long employee_id; float salary; );

интерфейсные функции Пример Часть2 int employee: : assign_values (char *emp_name, long emp_id, float emp_salary) интерфейсные функции Пример Часть2 int employee: : assign_values (char *emp_name, long emp_id, float emp_salary) { strcpy(name, emp_name); employee_id = emp_id; if (emp_salary < 50000. 0) { salary = emp_salary; return(0); // Успешно } else return(-1); // Недопустимый оклад }

интерфейсные функции Пример Часть3 int employee: : change_salary(float new_salary) { if (new_salary < 50000. интерфейсные функции Пример Часть3 int employee: : change_salary(float new_salary) { if (new_salary < 50000. 0) { salary = new_salary; return(0); // Успешно } else return(-1); // Недопустимый оклад } long employee: : get_id(void) { return(employee_id) ; }

интерфейсные функции Пример Часть4 void main(void) { employee worker; if (worker. assign_values( интерфейсные функции Пример Часть4 void main(void) { employee worker; if (worker. assign_values("Happy Jamsa", 10101. 0) == 0) { cout << "Служащему назначены следующие значения" << endl; } worker. show_employee(); if (worker. change_salary(35000. 00) == 0) { cout << "Назначен новый оклад" << endl; worker. show_employee(); } } else cout << "Указан недопустимый оклад" << endl; }

Друзья классов n friend С++ позволяет классу объявлять друзей (friends) - функции и классы, Друзья классов n friend С++ позволяет классу объявлять друзей (friends) - функции и классы, у которых есть полный доступ к начинке класса (такой же доступ, как у его собственных функций).

Друзья классов class book { public: book (char *, char *); void show_book(void); friend Друзья классов class book { public: book (char *, char *); void show_book(void); friend librarian; private: char title [64] ; char author[64]; char catalog[64]; };

три основных свойства ООП q Наследование - наличие в языке ООП механизма, позволяющего объектам три основных свойства ООП q Наследование - наличие в языке ООП механизма, позволяющего объектам класса наследовать характеристики более простых и общих типов. Наследование обеспечивает как требуемый уровень общности, так и необходимую специализацию.

Наследование n Объект производного класса является объектом базового класса. Наследование - это процесс добавления Наследование n Объект производного класса является объектом базового класса. Наследование - это процесс добавления полей данных и методов-членов. В С++ производный класс может рассматриваться как механизм добавления полей данных и МЕТОДОВ к существующему определению класса - к базовому классу.

ПРОСТОЕ НАСЛЕДОВАНИЕ class manager : public class employee { { public: employee(char *, char ПРОСТОЕ НАСЛЕДОВАНИЕ class manager : public class employee { { public: employee(char *, char public: manager(char *, *, float); char *, float, int); void show_manager(void); show_employee(void); private: float annual_bonus; char name[64]; char company_car[64]; char position[64]; int stock_options; float salary; };

НАСЛЕДОВАНИЕ. Пример. Часть 1 #include <iostream. h> #include <string. h> class book { public: НАСЛЕДОВАНИЕ. Пример. Часть 1 #include #include class book { public: book(char *, int); void show_book(void); private: char title [64]; char author[64]; int pages; };

НАСЛЕДОВАНИЕ. Пример. Часть 2 book: : book(char *title, char *author, int pages) { strcpy(book: НАСЛЕДОВАНИЕ. Пример. Часть 2 book: : book(char *title, char *author, int pages) { strcpy(book: : title, title); strcpy(book: : author, author); book: : pages = pages; }

НАСЛЕДОВАНИЕ. Пример. Часть 3 void book: : show_book(void) { cout << НАСЛЕДОВАНИЕ. Пример. Часть 3 void book: : show_book(void) { cout << "Название: " << title << endl; cout << "Автор: " << author << endl; cout << "Страниц: " << pages << endl; }

НАСЛЕДОВАНИЕ. Пример. Часть 4 // производный класс class library_card : public book { public: НАСЛЕДОВАНИЕ. Пример. Часть 4 // производный класс class library_card : public book { public: library_card(char *, int, char *, int); void show_card(void) ; private: char catalog[64]; int checked_out; };

НАСЛЕДОВАНИЕ. Пример. Часть 5 library_card: : library_card(char *title, char *author, int pages, char *catalog, НАСЛЕДОВАНИЕ. Пример. Часть 5 library_card: : library_card(char *title, char *author, int pages, char *catalog, int checked_out) : book(title, author, pages) { strcpy(library_card: : catalog, catalog) ; library_card: : checked_out = checked_out; }

НАСЛЕДОВАНИЕ. Пример. Часть 6 void library_card: : show_card(void) { show_book() ; cout << НАСЛЕДОВАНИЕ. Пример. Часть 6 void library_card: : show_card(void) { show_book() ; cout << "Каталог: " << catalog << endl; if (checked_out) cout << "Статус: проверена" << endl; else cout << "Статус: свободна" << endl; }

НАСЛЕДОВАНИЕ. Пример. Часть 7 void main(void) { library_card( НАСЛЕДОВАНИЕ. Пример. Часть 7 void main(void) { library_card( "программирование на языке C++", “Дейтел", 272, "101 СРР", 1); card. show_card(); }

Защищенные члены класса n Члены и функции объявленные в защищенном (protected) разделе класса доступны Защищенные члены класса n Члены и функции объявленные в защищенном (protected) разделе класса доступны только для функций производных классов. Обычно в этом возникает необходимость тогда, когда разрабатываемый класс является базовым классом для других классов. В этом случае он ограничивает доступ к данным внешним пользователям и разрешает доступ для классов наследников.

Защищенные члены класса class A { protected: int val; }; class B: public A Защищенные члены класса class A { protected: int val; }; class B: public A { public: void fb(); }; void B: : fb() { val = 0; } class C: public B { public: void fc(); }; void C: : fc() {val = 10; } //наследуется от A //доступ разрешен //наследуется от B //доступ разрешен

Защищенные члены класса class book { public: book(char *, int) ; void show_book(void) ; Защищенные члены класса class book { public: book(char *, int) ; void show_book(void) ; protected: char title [64]; char author[64]; int pages; };

Множественное наследование class My. Class 1 {…}; class My. Class 2 {…}; class My. Множественное наследование class My. Class 1 {…}; class My. Class 2 {…}; class My. Class 12: public My. Class 1, public My. Class 2 {…}

ПОСТРОЕНИЕ ИЕРАРХИИ КЛАССОВ Класс11 Класс123 Класс21 Класс223 ПОСТРОЕНИЕ ИЕРАРХИИ КЛАССОВ Класс11 Класс123 Класс21 Класс223

РАЗРЕШЕНИЕ КОНФЛИКТА ИМЕН class book … float price; … class library_card : public book РАЗРЕШЕНИЕ КОНФЛИКТА ИМЕН class book … float price; … class library_card : public book float price; … cout << "Библиотечная цена: " << price << endl; cout << "Продажная цена: " << book: : price << endl;

три основных свойства ООП n Полиморфизм - способность объекта изменять форму во время выполнения три основных свойства ООП n Полиморфизм - способность объекта изменять форму во время выполнения программы. Т. е. в рамках всей иерархии классов можно иметь несколько версий одной и той же функции. Решение о том, какая именно версия должна выполняться в данный момент, определяется на этапе выполнения программы и носит название позднего связывания.

Полиморфизм n n Для создания полиморфных объектов ваши программы должны использовать виртуальные (virtual) функции. Полиморфизм n n Для создания полиморфных объектов ваши программы должны использовать виртуальные (virtual) функции. Виртуальная (virtual) функция — это функция базового класса, перед именем которой стоит ключевое слово virtual. Любой производный от базового класс может использовать или перегружать виртуальные функции. Для создания полиморфного объекта вам следует использовать указатель на объект базового класса.

Полиморфизм. Пример. Часть 1 class Color{}; class GBase { public: GBase(const Color &c): color_i(c) Полиморфизм. Пример. Часть 1 class Color{}; class GBase { public: GBase(const Color &c): color_i(c) {} virtual ~GBase() {} virtual void set. Color(const Color &c){ color=c; } const Color& color()const{ return color_i; } protected: virtual void draw() const = 0; virtual void rotate() = 0; virtual void move(int dx, int dy) = 0; Color color_i; };

Полиморфизм. Пример. Часть 2 class GRectangle : public GBase { public: GRectangle(int x_, int Полиморфизм. Пример. Часть 2 class GRectangle : public GBase { public: GRectangle(int x_, int y_, int w_, int h_, const Color &c) : GBase(c), x(x_), y(y_), w(w_), h(h_){} virtual void set. Width(int w_){ if(w!=w_){ w=w_; draw(); } } int width()const{ return w; } virtual void set. Height(int h_){ if(h!=h_){ h=h_; draw(); } } int height()const{ return h; } protected: virtual void draw()const{ /*рисуем картинку исходя из координат*/ } virtual void rotate(){ /*. . . */ draw(); } virtual void move(int dx, int dy){ x+=dx; y+=dy; draw(); } int x, y; //координаты левого верхнего угла int w, h; //ширина и высота };

Полиморфизм. Пример. Часть 3 class GSquare : public GRectangle { public: GSquare(int x_, int Полиморфизм. Пример. Часть 3 class GSquare : public GRectangle { public: GSquare(int x_, int y_, int w_, const Color &c) : GRectangle(x_, y_, w_, c){} virtual void rotate(){} //ничего не поворачиваем virtual void set. Width(int w_) { if(w!=w_) { h=w=w_; draw(); } } virtual void set. Height(int h_) { if(h!=h_) { w=h=h_; draw(); } } };

Полиморфизм. Пример. Часть 4 int main() { Color cl; /*ошибка компиляции, присутствуют абстрактные классы*/ Полиморфизм. Пример. Часть 4 int main() { Color cl; /*ошибка компиляции, присутствуют абстрактные классы*/ GRectangle grec(0, 0, 10, 20, cl); //правильно GSquare gsquare(20, 30, 10, cl); //правильно //ошибка компиляции, - не определен конструктор по умолчанию GRectangle grec 1; return 0; }

Гибкость ООП n n n Перегрузка функций и операторов и добавление в язык ссылок Гибкость ООП n n n Перегрузка функций и операторов и добавление в язык ссылок дают возможность использовать в выражениях объекты наравне с переменными встроенных типов. Наследование позволяет расширять функциональность уже имеющихся базовых классов, создавая на их основе производные классы. Полиморфизм позволяет при необходимости работать с производными классами так же, как с базовыми.

Список литературы n n n Х. Дейтел, П. Дейтел Как программировать на С++ Бьярн Список литературы n n n Х. Дейтел, П. Дейтел Как программировать на С++ Бьярн Страустрап, Введение в язык С++ Джефф Элджер C++