🗊Презентация Об'єктно-орієнтоване програмування. Принцип інкапсуляції. (Лекція 1)

Нажмите для полного просмотра!
Об'єктно-орієнтоване програмування. Принцип інкапсуляції. (Лекція 1), слайд №1Об'єктно-орієнтоване програмування. Принцип інкапсуляції. (Лекція 1), слайд №2Об'єктно-орієнтоване програмування. Принцип інкапсуляції. (Лекція 1), слайд №3Об'єктно-орієнтоване програмування. Принцип інкапсуляції. (Лекція 1), слайд №4Об'єктно-орієнтоване програмування. Принцип інкапсуляції. (Лекція 1), слайд №5Об'єктно-орієнтоване програмування. Принцип інкапсуляції. (Лекція 1), слайд №6Об'єктно-орієнтоване програмування. Принцип інкапсуляції. (Лекція 1), слайд №7Об'єктно-орієнтоване програмування. Принцип інкапсуляції. (Лекція 1), слайд №8Об'єктно-орієнтоване програмування. Принцип інкапсуляції. (Лекція 1), слайд №9Об'єктно-орієнтоване програмування. Принцип інкапсуляції. (Лекція 1), слайд №10Об'єктно-орієнтоване програмування. Принцип інкапсуляції. (Лекція 1), слайд №11Об'єктно-орієнтоване програмування. Принцип інкапсуляції. (Лекція 1), слайд №12Об'єктно-орієнтоване програмування. Принцип інкапсуляції. (Лекція 1), слайд №13Об'єктно-орієнтоване програмування. Принцип інкапсуляції. (Лекція 1), слайд №14Об'єктно-орієнтоване програмування. Принцип інкапсуляції. (Лекція 1), слайд №15Об'єктно-орієнтоване програмування. Принцип інкапсуляції. (Лекція 1), слайд №16Об'єктно-орієнтоване програмування. Принцип інкапсуляції. (Лекція 1), слайд №17Об'єктно-орієнтоване програмування. Принцип інкапсуляції. (Лекція 1), слайд №18Об'єктно-орієнтоване програмування. Принцип інкапсуляції. (Лекція 1), слайд №19Об'єктно-орієнтоване програмування. Принцип інкапсуляції. (Лекція 1), слайд №20Об'єктно-орієнтоване програмування. Принцип інкапсуляції. (Лекція 1), слайд №21Об'єктно-орієнтоване програмування. Принцип інкапсуляції. (Лекція 1), слайд №22Об'єктно-орієнтоване програмування. Принцип інкапсуляції. (Лекція 1), слайд №23Об'єктно-орієнтоване програмування. Принцип інкапсуляції. (Лекція 1), слайд №24Об'єктно-орієнтоване програмування. Принцип інкапсуляції. (Лекція 1), слайд №25Об'єктно-орієнтоване програмування. Принцип інкапсуляції. (Лекція 1), слайд №26Об'єктно-орієнтоване програмування. Принцип інкапсуляції. (Лекція 1), слайд №27Об'єктно-орієнтоване програмування. Принцип інкапсуляції. (Лекція 1), слайд №28Об'єктно-орієнтоване програмування. Принцип інкапсуляції. (Лекція 1), слайд №29Об'єктно-орієнтоване програмування. Принцип інкапсуляції. (Лекція 1), слайд №30Об'єктно-орієнтоване програмування. Принцип інкапсуляції. (Лекція 1), слайд №31Об'єктно-орієнтоване програмування. Принцип інкапсуляції. (Лекція 1), слайд №32Об'єктно-орієнтоване програмування. Принцип інкапсуляції. (Лекція 1), слайд №33Об'єктно-орієнтоване програмування. Принцип інкапсуляції. (Лекція 1), слайд №34Об'єктно-орієнтоване програмування. Принцип інкапсуляції. (Лекція 1), слайд №35Об'єктно-орієнтоване програмування. Принцип інкапсуляції. (Лекція 1), слайд №36Об'єктно-орієнтоване програмування. Принцип інкапсуляції. (Лекція 1), слайд №37Об'єктно-орієнтоване програмування. Принцип інкапсуляції. (Лекція 1), слайд №38Об'єктно-орієнтоване програмування. Принцип інкапсуляції. (Лекція 1), слайд №39Об'єктно-орієнтоване програмування. Принцип інкапсуляції. (Лекція 1), слайд №40Об'єктно-орієнтоване програмування. Принцип інкапсуляції. (Лекція 1), слайд №41Об'єктно-орієнтоване програмування. Принцип інкапсуляції. (Лекція 1), слайд №42Об'єктно-орієнтоване програмування. Принцип інкапсуляції. (Лекція 1), слайд №43Об'єктно-орієнтоване програмування. Принцип інкапсуляції. (Лекція 1), слайд №44Об'єктно-орієнтоване програмування. Принцип інкапсуляції. (Лекція 1), слайд №45Об'єктно-орієнтоване програмування. Принцип інкапсуляції. (Лекція 1), слайд №46Об'єктно-орієнтоване програмування. Принцип інкапсуляції. (Лекція 1), слайд №47Об'єктно-орієнтоване програмування. Принцип інкапсуляції. (Лекція 1), слайд №48Об'єктно-орієнтоване програмування. Принцип інкапсуляції. (Лекція 1), слайд №49Об'єктно-орієнтоване програмування. Принцип інкапсуляції. (Лекція 1), слайд №50Об'єктно-орієнтоване програмування. Принцип інкапсуляції. (Лекція 1), слайд №51Об'єктно-орієнтоване програмування. Принцип інкапсуляції. (Лекція 1), слайд №52

Содержание

Вы можете ознакомиться и скачать презентацию на тему Об'єктно-орієнтоване програмування. Принцип інкапсуляції. (Лекція 1). Доклад-сообщение содержит 52 слайдов. Презентации для любого класса можно скачать бесплатно. Если материал и наш сайт презентаций Mypresentation Вам понравились – поделитесь им с друзьями с помощью социальных кнопок и добавьте в закладки в своем браузере.

Слайды и текст этой презентации


Слайд 1





Бублик Володимир Васильович

Об'єктно-орієнтоване
програмування 

Частина 1. Об'єктне програмування.

 Лекція 1. Принцип інкапсуляції 
Лекції для студентів 2 курсу
Описание слайда:
Бублик Володимир Васильович Об'єктно-орієнтоване програмування Частина 1. Об'єктне програмування. Лекція 1. Принцип інкапсуляції Лекції для студентів 2 курсу

Слайд 2





Парадигми програмування (повторення)
Описание слайда:
Парадигми програмування (повторення)

Слайд 3





Погляд в майбутнє
Програмувати, думаючи про нові застосування (reuse)
Узагальнене програмування дає нові застосування програмних текстів
Об'єктне і ієрархічне − нові застосування об'єктних кодів (об'єктів і класів)
Описание слайда:
Погляд в майбутнє Програмувати, думаючи про нові застосування (reuse) Узагальнене програмування дає нові застосування програмних текстів Об'єктне і ієрархічне − нові застосування об'єктних кодів (об'єктів і класів)

Слайд 4





Інкапсуляція
Під інкапсуляцією розумітимемо спосіб збирання певних елементів в одне ціле з метою утворення нової сутності (або абстракції нового рівня)
Команди інкапсульовані в функцію
Поля інкапсульовані в структуру
struct Point
{
	double _x;
	double _y;
}
Описание слайда:
Інкапсуляція Під інкапсуляцією розумітимемо спосіб збирання певних елементів в одне ціле з метою утворення нової сутності (або абстракції нового рівня) Команди інкапсульовані в функцію Поля інкапсульовані в структуру struct Point { double _x; double _y; }

Слайд 5





Дані і функції в структурах (як С моделює С++)
Чи можна інкапсулювати функцію в структуру?
Так, можна за допомогою указника функції
struct QuasiPoint
{
	double _x;
	double _y;
//	інкапсуляція указника на функцію
	double (*f)(QuasiPoint, QuasiPoint);
};
Як викликати f?
Описание слайда:
Дані і функції в структурах (як С моделює С++) Чи можна інкапсулювати функцію в структуру? Так, можна за допомогою указника функції struct QuasiPoint { double _x; double _y; // інкапсуляція указника на функцію double (*f)(QuasiPoint, QuasiPoint); }; Як викликати f?

Слайд 6





Ініціалізація та виклик інкапсульованої функції
double distance (QuasiPoint, QuasiPoint);
	
QuasiPoint u={0, 1, distance};
cout<<u.f(u,v)<<endl;
Описание слайда:
Ініціалізація та виклик інкапсульованої функції double distance (QuasiPoint, QuasiPoint); QuasiPoint u={0, 1, distance}; cout<<u.f(u,v)<<endl;

Слайд 7





Ініціалізація та виклик інкапсульованої функції
double phi (QuasiPoint, QuasiPoint);
	
QuasiPoint v={1, 1, phi}; 
cout<<v.f(u,v)<<endl;
Описание слайда:
Ініціалізація та виклик інкапсульованої функції double phi (QuasiPoint, QuasiPoint); QuasiPoint v={1, 1, phi}; cout<<v.f(u,v)<<endl;

Слайд 8





Інкапсуляція в об'єкті
Це добре чи зле, що в одній і тій же структурі функція-член структури в різних екземплярах позначає різні дії?
u.f(a,b) відстань від a до b
v.f(a,b) кут між векторами 0a і 0b
Як засобами С зробити так, щоб для всіх екземплярів QuasiPoint указник показував завжди одну й ту ж функцію?
Описание слайда:
Інкапсуляція в об'єкті Це добре чи зле, що в одній і тій же структурі функція-член структури в різних екземплярах позначає різні дії? u.f(a,b) відстань від a до b v.f(a,b) кут між векторами 0a і 0b Як засобами С зробити так, щоб для всіх екземплярів QuasiPoint указник показував завжди одну й ту ж функцію?

Слайд 9





Статичний указник на функцію
struct QuPoStaPtr
{
	double _x;
	double _y;
//	інкапсуляція указника на функцію в класі
	static double (*f)(QuPoStaPtr, QuPoStaPtr);
};
//	Один указник для всіх об’єктів
double (* QuPoStaPtr ::f)
           (QuPoStaPtr, QuPoStaPtr) = distance;
cout<< QuPoStaPtr::f(u,v)<<endl;
Описание слайда:
Статичний указник на функцію struct QuPoStaPtr { double _x; double _y; // інкапсуляція указника на функцію в класі static double (*f)(QuPoStaPtr, QuPoStaPtr); }; // Один указник для всіх об’єктів double (* QuPoStaPtr ::f) (QuPoStaPtr, QuPoStaPtr) = distance; cout<< QuPoStaPtr::f(u,v)<<endl;

Слайд 10





Інкапсуляція указника на функцію в класі
Діаграма класу, а не об'єкта
Описание слайда:
Інкапсуляція указника на функцію в класі Діаграма класу, а не об'єкта

Слайд 11





Створення і видалення екземпляру структури
struct PreWrappedVector
{
	static const int _n;
	double * _v;
};
//	Функція створення вектора a._v
void construct (PreWrappedVector& a);
//	Функція видалення вектора a._v
void destroy (PreWrappedVector& a);
Описание слайда:
Створення і видалення екземпляру структури struct PreWrappedVector { static const int _n; double * _v; }; // Функція створення вектора a._v void construct (PreWrappedVector& a); // Функція видалення вектора a._v void destroy (PreWrappedVector& a);

Слайд 12





Створення і видалення екземпляру структури
//	Типовий сценарій обробки
PreWrappedVector v;
//	Хто гарантує наявність конструктора і
//	 створення вектора до першого вживання? 
construct(v);
…………………………
destroy(v);
//	Хто гарантує наявність деструктора і видалення
//	вектора після завершення його обробки?
Описание слайда:
Створення і видалення екземпляру структури // Типовий сценарій обробки PreWrappedVector v; // Хто гарантує наявність конструктора і // створення вектора до першого вживання? construct(v); ………………………… destroy(v); // Хто гарантує наявність деструктора і видалення // вектора після завершення його обробки?

Слайд 13





Конструктор і деструктор
struct WrappedVector
{
	static const int _n;
	double * _v;
//	Це конструктор, він створює об'єкт
//	при його визначенні
	WrappedVector();
//	Це деструктор, він автоматично видаляє об'єкт
	~WrappedVector();
};
Описание слайда:
Конструктор і деструктор struct WrappedVector { static const int _n; double * _v; // Це конструктор, він створює об'єкт // при його визначенні WrappedVector(); // Це деструктор, він автоматично видаляє об'єкт ~WrappedVector(); };

Слайд 14





Реалізація конструктора
WrappedVector::WrappedVector()
{
	cout<<"Constructor WrappedVector"<<endl;
//	1. Виділити пам'ять
	_v = new double[_n]; 
//	2. Можливо обробити аварійну ситуацію
//	3. Ініціалізувати масив		
	for (int i=0; i<_n; i++)
		_v[i] = 0;
	return;
}
Описание слайда:
Реалізація конструктора WrappedVector::WrappedVector() { cout<<"Constructor WrappedVector"<<endl; // 1. Виділити пам'ять _v = new double[_n]; // 2. Можливо обробити аварійну ситуацію // 3. Ініціалізувати масив for (int i=0; i<_n; i++) _v[i] = 0; return; }

Слайд 15





Реалізація деструктора
WrappedVector::~WrappedVector()
{
	cout<<"Destructor WrappedVector"<<endl;
	delete [] _v;
//	Чи варто обнулити указник _v?
	return;
}
Описание слайда:
Реалізація деструктора WrappedVector::~WrappedVector() { cout<<"Destructor WrappedVector"<<endl; delete [] _v; // Чи варто обнулити указник _v? return; }

Слайд 16





Головне правило об'єктного програмування
Кожній структурі надаються конструктор і деструктор
Описание слайда:
Головне правило об'єктного програмування Кожній структурі надаються конструктор і деструктор

Слайд 17





Автоматичний виклик конструктора і деструктора
int main()
{
//	Визначення об'єктів приводить
//	до виклику конструкторів.
//	Ось він:
	WrappedVector w1, w2;	
……………………………………………
//	Життя об'єктів завжди закінчується
//	автоматичним викликом їх деструкторів
//	ост тут:
	return 0;			
}
Описание слайда:
Автоматичний виклик конструктора і деструктора int main() { // Визначення об'єктів приводить // до виклику конструкторів. // Ось він: WrappedVector w1, w2; …………………………………………… // Життя об'єктів завжди закінчується // автоматичним викликом їх деструкторів // ост тут: return 0; }

Слайд 18





Хто викликає конструктор і деструктор?
Це робить система програмування
// new: конструктор; delete: деструктор 
int main()
{
	WrappedVector *pw = new WrappedVector;
//	Створення об'єкту: неявний виклик конструктора	
…………………………………………………
//	Видалення об'єкту: неявний виклик деструктора	
	delete pw;
	return 0;			
}
Описание слайда:
Хто викликає конструктор і деструктор? Це робить система програмування // new: конструктор; delete: деструктор int main() { WrappedVector *pw = new WrappedVector; // Створення об'єкту: неявний виклик конструктора ………………………………………………… // Видалення об'єкту: неявний виклик деструктора delete pw; return 0; }

Слайд 19





Конструктор і деструктор за замовчуванням
Чи мала б структура PreWrappedVector конструктора і деструктора, якщо їх не визначити явно?
struct PreWrappedVector
{
	static const int _n;
	double * _v;
};
Описание слайда:
Конструктор і деструктор за замовчуванням Чи мала б структура PreWrappedVector конструктора і деструктора, якщо їх не визначити явно? struct PreWrappedVector { static const int _n; double * _v; };

Слайд 20





Конструктор і деструктор за замовчуванням
Так! Компілятор генерує порожні конструктор і деструктор для кожної структури, яка не має власних
//	Конструктор за замовчуванням
PreWrappedVector:: PreWrappedVector(){ };
//	Деструктор за замовчуванням
PreWrappedVector:: ~PreWrappedVector(){ };
//	Краще б їх не було, але так досягається
//	сумісність С і С++
Описание слайда:
Конструктор і деструктор за замовчуванням Так! Компілятор генерує порожні конструктор і деструктор для кожної структури, яка не має власних // Конструктор за замовчуванням PreWrappedVector:: PreWrappedVector(){ }; // Деструктор за замовчуванням PreWrappedVector:: ~PreWrappedVector(){ }; // Краще б їх не було, але так досягається // сумісність С і С++

Слайд 21





Друге правило об'єктного програмування
Ніколи не користується конструкторами за замовчуванням, згенерованими системою програмування
Чому?
ВВ поставить двійку
Визначивши власні конструктор і деструктор ви повністю контролюєте створення і видалення ваших об'єктів, а не передоручаєте це комусь (віддаєте дітей в дитячий будинок)
Описание слайда:
Друге правило об'єктного програмування Ніколи не користується конструкторами за замовчуванням, згенерованими системою програмування Чому? ВВ поставить двійку Визначивши власні конструктор і деструктор ви повністю контролюєте створення і видалення ваших об'єктів, а не передоручаєте це комусь (віддаєте дітей в дитячий будинок)

Слайд 22





Дані-члени структур (атрибути) і функції(методи)
struct Point
{
//		Атрибути
	double _x, _y;
//		Методи
	Point (double x=0, double y=0): _x(x),_y(y) { };	
	~Point(){ }; 
//		Функції доступу до атрибутів
	double& x()	{return _x;}
	double& y()	{return _y;}
};
Описание слайда:
Дані-члени структур (атрибути) і функції(методи) struct Point { // Атрибути double _x, _y; // Методи Point (double x=0, double y=0): _x(x),_y(y) { }; ~Point(){ }; // Функції доступу до атрибутів double& x() {return _x;} double& y() {return _y;} };

Слайд 23





Виклик конструктора з параметрами
//		Замість
	Point a = Point(1,2);
//		пишемо скорочено
	Point a1(1,2);
	
	Point b = Point(1);
	Point b1(1);
	
	Point c = Point();
	Point c1;
Описание слайда:
Виклик конструктора з параметрами // Замість Point a = Point(1,2); // пишемо скорочено Point a1(1,2); Point b = Point(1); Point b1(1); Point c = Point(); Point c1;

Слайд 24





Навіщо потрібні функції доступу?
Для того щоб контролювати всі випадки використання атрибутів у кожному об'єкті
Описание слайда:
Навіщо потрібні функції доступу? Для того щоб контролювати всі випадки використання атрибутів у кожному об'єкті

Слайд 25





Виклик методів
Виклик методів відрізняється від виклику звичайних функцій
//		Застосувати до екземпляру а структури Point
//		функцію х()

a.x() = 10;
cout<<a.x()<<endl;
Описание слайда:
Виклик методів Виклик методів відрізняється від виклику звичайних функцій // Застосувати до екземпляру а структури Point // функцію х() a.x() = 10; cout<<a.x()<<endl;

Слайд 26





Варіант функцій доступу: утиліти
struct Point
{
//		Атрибути
	double _x, _y;
//		Конструктор
	Point (double x=0, double y=0): _x(x),_y(y) { };
//		Деструктор
	~Point(){};
}
//		Утиліти доступу до атрибутів
	double& x(Point & a)	{return a._x;}
	double& y(Point & a)	{return a._y;}
Описание слайда:
Варіант функцій доступу: утиліти struct Point { // Атрибути double _x, _y; // Конструктор Point (double x=0, double y=0): _x(x),_y(y) { }; // Деструктор ~Point(){}; } // Утиліти доступу до атрибутів double& x(Point & a) {return a._x;} double& y(Point & a) {return a._y;}

Слайд 27





Виклик утиліти
Виклик утиліт є звичайним викликом функцій
//		Передати до функції x() параметр a

x(a) = 10;
cout<<x(a)<<endl;
Описание слайда:
Виклик утиліти Виклик утиліт є звичайним викликом функцій // Передати до функції x() параметр a x(a) = 10; cout<<x(a)<<endl;

Слайд 28





Прямий доступ
Замість функкції x(a) або методу a.x() можна було б напряму звертатися до члена структури _x
a._x = 10;
cout<<a._x<<endl;
Описание слайда:
Прямий доступ Замість функкції x(a) або методу a.x() можна було б напряму звертатися до члена структури _x a._x = 10; cout<<a._x<<endl;

Слайд 29





Для чого потрібні методи доступу?
struct Point
{
private:	//закрили прямий доступ до атрибутів
	double _x;
	double _y;
public:	//відкрили доступ до методів
	Point (double x=0, double y=0): _x(x),_y(y) { };
	~Point(){};
	double& x()	{return _x;}
	double& y()	{return _y;}
};
Описание слайда:
Для чого потрібні методи доступу? struct Point { private: //закрили прямий доступ до атрибутів double _x; double _y; public: //відкрили доступ до методів Point (double x=0, double y=0): _x(x),_y(y) { }; ~Point(){}; double& x() {return _x;} double& y() {return _y;} };

Слайд 30





Права доступу
Як і раніше, кожен, хто бачить об'єкт може скористатися його відкритим методом
//	Застосувати до екземпляру а структури Point
//	відкритий метод х()

a.x() = 10;
cout<<a.x()<<endl;
Описание слайда:
Права доступу Як і раніше, кожен, хто бачить об'єкт може скористатися його відкритим методом // Застосувати до екземпляру а структури Point // відкритий метод х() a.x() = 10; cout<<a.x()<<endl;

Слайд 31





Права доступу
Сам метод, завдяки своїй належності до структури сам бачить її закриту частину
// Як і раніше, ім'я _х в тексті функції
double& x() {return _x;}
//	позначає поле _х того екземпляру,
//	 до якого застосовано функцію
Описание слайда:
Права доступу Сам метод, завдяки своїй належності до структури сам бачить її закриту частину // Як і раніше, ім'я _х в тексті функції double& x() {return _x;} // позначає поле _х того екземпляру, // до якого застосовано функцію

Слайд 32





Права доступу
Але для сторонніх атрибути стали невидимими
int main ()
{
	Point a;
	a._x = 10;
	cout<<a._x<<endl;
	return 0;
}
double& x(Point & a)	{return a._x;}
double& y(Point & a)	{return a._y;}
Описание слайда:
Права доступу Але для сторонніх атрибути стали невидимими int main () { Point a; a._x = 10; cout<<a._x<<endl; return 0; } double& x(Point & a) {return a._x;} double& y(Point & a) {return a._y;}

Слайд 33





Клас
class Point
{
private:	//закрита частина класу
	double _x;
	double _y;
public:	//відкрита частина класу
	Point (double x=0, double y=0): _x(x),_y(y) { };
	~Point(){};
	double& x() 	{return _x;}
	double& y()	{return _y;}
};
Описание слайда:
Клас class Point { private: //закрита частина класу double _x; double _y; public: //відкрита частина класу Point (double x=0, double y=0): _x(x),_y(y) { }; ~Point(){}; double& x() {return _x;} double& y() {return _y;} };

Слайд 34





Структури і класи
Структуру, яку поділено на відкриту і закриту частини називатимемо класом. 
Структуру розглядатимемо як архаїзм від С. В структурі все звичайно вважається відкритим.
Екземпляри структур і класів називатимемо об'єктами. Кожен об'єкт створюється в результаті виклику конструктора, а видаляється деструктором.
Структура може не мати власних конструктора і деструктора. Ваші класи завжди повинні мати власні конструктори (можливо декілька) і деструктор (не забудьте про ВВ).
Описание слайда:
Структури і класи Структуру, яку поділено на відкриту і закриту частини називатимемо класом. Структуру розглядатимемо як архаїзм від С. В структурі все звичайно вважається відкритим. Екземпляри структур і класів називатимемо об'єктами. Кожен об'єкт створюється в результаті виклику конструктора, а видаляється деструктором. Структура може не мати власних конструктора і деструктора. Ваші класи завжди повинні мати власні конструктори (можливо декілька) і деструктор (не забудьте про ВВ).

Слайд 35





Клас vs. структура
Правила доступу ― це поділ класу на відкриту (public) і закриту (private) частини. Закрита частина доступна лише з середини класу, відкрита ― звідусіль.
Формально клас відрізняється від структури лише правилом замовчування прав доступу:
Все, що явно не відкрите в класі, вважається закритим
Все, що явно не закрите в структурі, вважається відкритим
Структури звичайно вживають як сукупність даних, класи ― як сукупність даних (атрибутів) і функцій-членів класу (методів)
Описание слайда:
Клас vs. структура Правила доступу ― це поділ класу на відкриту (public) і закриту (private) частини. Закрита частина доступна лише з середини класу, відкрита ― звідусіль. Формально клас відрізняється від структури лише правилом замовчування прав доступу: Все, що явно не відкрите в класі, вважається закритим Все, що явно не закрите в структурі, вважається відкритим Структури звичайно вживають як сукупність даних, класи ― як сукупність даних (атрибутів) і функцій-членів класу (методів)

Слайд 36





Повторення. Два способи запису ініціалізації
double x = 1.0;
double y = x;
double u = 2.0;
//	але можна й так
double v(u);
//	це те ж саме, що
//	double v = u;
Описание слайда:
Повторення. Два способи запису ініціалізації double x = 1.0; double y = x; double u = 2.0; // але можна й так double v(u); // це те ж саме, що // double v = u;

Слайд 37





Ініціалізація атрибутів в конструкторі
class Complex
{
private:
	double _re;
	double _im;
public:
	Complex (double re, double im):
//		ініціалізація атрибутів (добра!)
		_re(re), _im(im) { };
}
Описание слайда:
Ініціалізація атрибутів в конструкторі class Complex { private: double _re; double _im; public: Complex (double re, double im): // ініціалізація атрибутів (добра!) _re(re), _im(im) { }; }

Слайд 38





Ініціалізація атрибутів в конструкторі
class Complex
{
private:
	double _re;
	double _im;
public:
	Complex (double re, double im):
//		ініціалізація атрибутів (погана!)
	{ 
		_re = re; _im = im;
	};
Описание слайда:
Ініціалізація атрибутів в конструкторі class Complex { private: double _re; double _im; public: Complex (double re, double im): // ініціалізація атрибутів (погана!) { _re = re; _im = im; };

Слайд 39





Приклад 1. Person.h
class Person
{
private:
	const int _len;
	char * _name;
public:
//		реалізація винесена в срр-файл
	Person(int, char []);
	~Person();
};
Описание слайда:
Приклад 1. Person.h class Person { private: const int _len; char * _name; public: // реалізація винесена в срр-файл Person(int, char []); ~Person(); };

Слайд 40





Приклад 1. Person.cpp (конструктор)
Person::Person (int len, char name[]): 
	_len(len),
	_name (new char[_len+1]);
{
	for (int i=0; i<_len; i++)
		_name[i] = name[i];
	_name[_len]='\0';
	cout<<"A person "<<_name<<" was created"<<endl;
	return;
}
Описание слайда:
Приклад 1. Person.cpp (конструктор) Person::Person (int len, char name[]): _len(len), _name (new char[_len+1]); { for (int i=0; i<_len; i++) _name[i] = name[i]; _name[_len]='\0'; cout<<"A person "<<_name<<" was created"<<endl; return; }

Слайд 41





Приклад 1. Person.cpp (деструктор)
Person::~Person()
{
	cout<<"A person "<<_name<<" was deleted"<<endl;
	delete [] _name;
//		_name = 0; зайве, оскільки сам об'єкт,
//		а значить і його атрибут _name,
//		припиняють своє існування
	return;
}
Описание слайда:
Приклад 1. Person.cpp (деструктор) Person::~Person() { cout<<"A person "<<_name<<" was deleted"<<endl; delete [] _name; // _name = 0; зайве, оскільки сам об'єкт, // а значить і його атрибут _name, // припиняють своє існування return; }

Слайд 42





Приклад 2. WrappedVector.h
class WrappedVector
{
private:
	static const int _n;
	double * _v;
public:
	WrappedVector();
	~WrappedVector();
};
Описание слайда:
Приклад 2. WrappedVector.h class WrappedVector { private: static const int _n; double * _v; public: WrappedVector(); ~WrappedVector(); };

Слайд 43





Приклад 2. WrappedVector.cpp
const int WrappedVector::_n = 100;
WrappedVector::WrappedVector():
	_v (new double[_n];)
{
	cout<<"Constructor WrappedVector"<<endl;
	
	for (int i=0; i<_n; i++)
		_v[i] = 0;
	return;
}
Описание слайда:
Приклад 2. WrappedVector.cpp const int WrappedVector::_n = 100; WrappedVector::WrappedVector(): _v (new double[_n];) { cout<<"Constructor WrappedVector"<<endl; for (int i=0; i<_n; i++) _v[i] = 0; return; }

Слайд 44





Приклад 2. WrappedVector.cpp
WrappedVector::~WrappedVector()
{
	cout<<"Destructor WrappedVector"<<endl;
	delete [] _v;
	return;
}
Описание слайда:
Приклад 2. WrappedVector.cpp WrappedVector::~WrappedVector() { cout<<"Destructor WrappedVector"<<endl; delete [] _v; return; }

Слайд 45





Селектори і модифікатори
Як добратися до атрибутів, якщо вони закриті? ― За допомогою методів доступу: селекторів і модифікаторів
	Два в одному
	double& x() { return _x;}
2а.		Селектор
	double getX() { return _x; };
2b.		Модифікатор
	void setX (double x) { _x = x;}
Описание слайда:
Селектори і модифікатори Як добратися до атрибутів, якщо вони закриті? ― За допомогою методів доступу: селекторів і модифікаторів Два в одному double& x() { return _x;} 2а. Селектор double getX() { return _x; }; 2b. Модифікатор void setX (double x) { _x = x;}

Слайд 46





Приклад 2. WrappedVector. Селектор-модифікатор
class WrappedVector
{
private:
	static const int _n;
	double * _v;
public:
	class BadIndex { };
	double& getSet (int i);
	WrappedVector();
	~WrappedVector();
};
Описание слайда:
Приклад 2. WrappedVector. Селектор-модифікатор class WrappedVector { private: static const int _n; double * _v; public: class BadIndex { }; double& getSet (int i); WrappedVector(); ~WrappedVector(); };

Слайд 47





Приклад 2. WrappedVector. Селектор-модифікатор
double& WrappedVector::getSet (int i)
{
	if ((i<0) !! (i>=_len))
		throw BadIndex;
	return _v[i];
}
WrappedVector u;
u.getSet(0) = 500;
cout<<u.getSet(0)<<endl;
//А хотілося б u[i]. ― Далі буде
Описание слайда:
Приклад 2. WrappedVector. Селектор-модифікатор double& WrappedVector::getSet (int i) { if ((i<0) !! (i>=_len)) throw BadIndex; return _v[i]; } WrappedVector u; u.getSet(0) = 500; cout<<u.getSet(0)<<endl; //А хотілося б u[i]. ― Далі буде

Слайд 48





Приклад 2. WrappedVector. Селектор і модифікатор
double WrappedVector::get (int i)
{
	if ((i<0) !! (i>=_len)) throw BadIndex;
	return _v[i];
}
void WrappedVector::set (int i, double x)
{
	if ((i<0) !! (i>=_len)) throw BadIndex;
	_v[i] = x;
	return;
}
Описание слайда:
Приклад 2. WrappedVector. Селектор і модифікатор double WrappedVector::get (int i) { if ((i<0) !! (i>=_len)) throw BadIndex; return _v[i]; } void WrappedVector::set (int i, double x) { if ((i<0) !! (i>=_len)) throw BadIndex; _v[i] = x; return; }

Слайд 49





Чому віддавати перевагу
Окремий модифікатор дозволяє контролювати кожну спробу зміни значення атрибуту, а селектор ― кожне використання його значення.
Модифікатор-селектор
не відрізняє зміну значення від читання;
порушує інкапсуляцію (як?)
Але кожна мова програмування пропонує оператор індексування [ ] ― по суті селектор-модифікатор.
Описание слайда:
Чому віддавати перевагу Окремий модифікатор дозволяє контролювати кожну спробу зміни значення атрибуту, а селектор ― кожне використання його значення. Модифікатор-селектор не відрізняє зміну значення від читання; порушує інкапсуляцію (як?) Але кожна мова програмування пропонує оператор індексування [ ] ― по суті селектор-модифікатор.

Слайд 50





Що вживати: клас чи структуру?
Слідкуємо за створенням і видаленням об'єктів, регламентуємо доступ до його частин ― вживаємо клас.
Обов'язкові конструктор(и) і деструктор, модифікатори і селектори для кожного призначеного для використання зовні атрибуту.
Правило доступу: Атрибути, як правило, закриті; методи можуть бути відкриті.
В інших випадках можна обходитися структурами
Описание слайда:
Що вживати: клас чи структуру? Слідкуємо за створенням і видаленням об'єктів, регламентуємо доступ до його частин ― вживаємо клас. Обов'язкові конструктор(и) і деструктор, модифікатори і селектори для кожного призначеного для використання зовні атрибуту. Правило доступу: Атрибути, як правило, закриті; методи можуть бути відкриті. В інших випадках можна обходитися структурами

Слайд 51





Об'єкт – екземпляр класу 
Об'єкт характеризується ідентичністю, станом і поведінкою.
Ідентичність ― це властивість, що відрізняє об'єкт від усіх інших об'єктів. Об'єкт набуває ідентичності при створенні його конструктором і втрачає її при видаленні його деструктором.
Стан визначається набором значень атрибутів об'єкту.
Поведінка визначається набором методів.
Описание слайда:
Об'єкт – екземпляр класу Об'єкт характеризується ідентичністю, станом і поведінкою. Ідентичність ― це властивість, що відрізняє об'єкт від усіх інших об'єктів. Об'єкт набуває ідентичності при створенні його конструктором і втрачає її при видаленні його деструктором. Стан визначається набором значень атрибутів об'єкту. Поведінка визначається набором методів.

Слайд 52





Висновок
Вивчили
Як створити об'єкт в заданому початковому стані
Як змінити стан об'єкту
Як визначити стан об'єкту
Як видалити об'єкт
Наступна задача:
наділити об'єкти поведінкою
Описание слайда:
Висновок Вивчили Як створити об'єкт в заданому початковому стані Як змінити стан об'єкту Як визначити стан об'єкту Як видалити об'єкт Наступна задача: наділити об'єкти поведінкою



Похожие презентации
Mypresentation.ru
Загрузить презентацию