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

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

Содержание

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

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


Слайд 1





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

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

Частина 1. Об'єктне програмування.
 
Лекція 2. Копіювання об'єктів 

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

Слайд 2





Повторення
Що має бути в класі
class T
{
private:
//	Тут розміщують атрибути
public:
//	Конструктори
	T(T1,…,Tn);
//	Деструктор
	~T();	//	далі селектори, модифікатори, …
};
Описание слайда:
Повторення Що має бути в класі class T { private: // Тут розміщують атрибути public: // Конструктори T(T1,…,Tn); // Деструктор ~T(); // далі селектори, модифікатори, … };

Слайд 3





Приклад класу. String
class String {
private:
	size_t _len;
	char* _allocator;
public:
	String();
	String(const char*);
	String(const char);
	~String();
	size_t length() const {return _len;}
	bool empty() const {return _len==0;}
	void clear() {*this=String();}
};
Описание слайда:
Приклад класу. String class String { private: size_t _len; char* _allocator; public: String(); String(const char*); String(const char); ~String(); size_t length() const {return _len;} bool empty() const {return _len==0;} void clear() {*this=String();} };

Слайд 4





Констуктори
Для чого у класі три різних конструктори?
class String {
private:
	size_t _len;
	char* _allocator;
public:
	String();
	String(const char*);
	String(const char);
	……………………………………………
};
Описание слайда:
Констуктори Для чого у класі три різних конструктори? class String { private: size_t _len; char* _allocator; public: String(); String(const char*); String(const char); …………………………………………… };

Слайд 5





Властивість інкапсуляції
Відокремлення реалізації класу від його визначення
String::String (const char c):
	_allocator( new char [2]),
	_len(1)
{
	_allocator [0]=c;
	_allocator [1]='\0';
	return;
}
Описание слайда:
Властивість інкапсуляції Відокремлення реалізації класу від його визначення String::String (const char c): _allocator( new char [2]), _len(1) { _allocator [0]=c; _allocator [1]='\0'; return; }

Слайд 6





Питання
Чому у визначенні класу розміщені реалізації?
class String
{
private:
	size_t _len;
	char* _allocator;
public:…………………………………………..
	size_t length() const {return _len;}
	bool empty() const {return _len==0;}
	void clear() {*this=String();}
};
Описание слайда:
Питання Чому у визначенні класу розміщені реалізації? class String { private: size_t _len; char* _allocator; public:………………………………………….. size_t length() const {return _len;} bool empty() const {return _len==0;} void clear() {*this=String();} };

Слайд 7





Питання
Чи коректний параметр замовчування? ― Ні. Чому?
class String
{
private:
	size_t _len;
	char* _allocator;
public:
	String ();
	String (const char* ps=0);
	String (const char);
	~String ();
};
Описание слайда:
Питання Чи коректний параметр замовчування? ― Ні. Чому? class String { private: size_t _len; char* _allocator; public: String (); String (const char* ps=0); String (const char); ~String (); };

Слайд 8





Конструктор копіювання
class T
{
	T(T1,…,Tn);
	~T();
//		конструктор копіювання
//		створює новий об'єкт, ідентичний
//		переданому параметром
	T(const T&);
//		Можливий варіант: T(T&);
//		але не Т(Т)
};
Описание слайда:
Конструктор копіювання class T { T(T1,…,Tn); ~T(); // конструктор копіювання // створює новий об'єкт, ідентичний // переданому параметром T(const T&); // Можливий варіант: T(T&); // але не Т(Т) };

Слайд 9





Використання
Конструктор копіювання викликається кожного разу, коли параметр або результат передаються значеннями
T1 f(T2 x)
{
	T1 y;
//	 тіло f… 
	return y;
}
a=f(b);	//	T2 x(b); T1 y; тіло f… ; a = T1(y);
Описание слайда:
Використання Конструктор копіювання викликається кожного разу, коли параметр або результат передаються значеннями T1 f(T2 x) { T1 y; // тіло f… return y; } a=f(b); // T2 x(b); T1 y; тіло f… ; a = T1(y);

Слайд 10





Облік об'єктів (Off top)
"Тьоркін на тім світі…“
			Олександр Твардовський
	– Як це так – без виробництва? –
	Теркін знову пристає, –
	І щоб тільки керівництво!..
	– Ні, ще облік у нас є...
Переклад Марка Кайдаша
Описание слайда:
Облік об'єктів (Off top) "Тьоркін на тім світі…“ Олександр Твардовський – Як це так – без виробництва? – Теркін знову пристає, – І щоб тільки керівництво!.. – Ні, ще облік у нас є... Переклад Марка Кайдаша

Слайд 11





Інвентаризація об'єктів
class Point
{
	static int _freeID;
	const int _pointID;
	double _x;
	double _y;
public:
	Point (double x=0, double y=0);
	Point (const Point &);
	~Point();
};
Описание слайда:
Інвентаризація об'єктів class Point { static int _freeID; const int _pointID; double _x; double _y; public: Point (double x=0, double y=0); Point (const Point &); ~Point(); };

Слайд 12





Конструктор Point
Point::Point (double x, double y):
		_x (x),
		_y (y),
		pointID (++_freeID)
{
#ifdef NDEBUG
	cout<<pointID<<": created "<<*this<<endl;
#endif
	return;
};
//	Де коректно розмістити замовчування параметру?
Описание слайда:
Конструктор Point Point::Point (double x, double y): _x (x), _y (y), pointID (++_freeID) { #ifdef NDEBUG cout<<pointID<<": created "<<*this<<endl; #endif return; }; // Де коректно розмістити замовчування параметру?

Слайд 13





Копіювальний конструктор Point
Point::Point (const Point & u):
		_x (u._x),
		_y (u._y),
		pointID(++_freeID)
{
#ifdef NDEBUG
	cout<<pointID<<": copied  "<<*this<<endl;
#endif
	return;
};
//	Чи може копіювання мати замовчуваний параметр?
Описание слайда:
Копіювальний конструктор Point Point::Point (const Point & u): _x (u._x), _y (u._y), pointID(++_freeID) { #ifdef NDEBUG cout<<pointID<<": copied "<<*this<<endl; #endif return; }; // Чи може копіювання мати замовчуваний параметр?

Слайд 14





Замовчування у копіювальному конструкторі
class Foo; 
int main() {
	Foo f1(10); 	// Створення нового об'єкту
	Foo f2(f1); 	// Копіювання існуючого об'єкту
	Foo f3; 	// Це що? Наперед невідомо
}
Описание слайда:
Замовчування у копіювальному конструкторі class Foo; int main() { Foo f1(10); // Створення нового об'єкту Foo f2(f1); // Копіювання існуючого об'єкту Foo f3; // Це що? Наперед невідомо }

Слайд 15





Перший варіант
class Foo {
private:
	int _k;
	static int _freeid;
	const int _id;
public:
	Foo(int k=0):_k(k), _id(++_freeid){
		cout<<"New Foo id="<<_id<<endl;}
	Foo(const Foo& foo=0):_k(foo._k), _id(++_freeid){
		cout<<"New copy Foo id="<<_id<<endl;}
}
warning C4520: 'Foo' : multiple default constructors specified
Чому все-таки це дозволено? Foo& foo=0 проігноровано
Описание слайда:
Перший варіант class Foo { private: int _k; static int _freeid; const int _id; public: Foo(int k=0):_k(k), _id(++_freeid){ cout<<"New Foo id="<<_id<<endl;} Foo(const Foo& foo=0):_k(foo._k), _id(++_freeid){ cout<<"New copy Foo id="<<_id<<endl;} } warning C4520: 'Foo' : multiple default constructors specified Чому все-таки це дозволено? Foo& foo=0 проігноровано

Слайд 16





Другий варіант
class Foo {
private:
	int _k;
	static int _freeid;
	const int _id;
	static Foo _static_foo;
public:
Foo(int k=0):_k(k), _id(++_freeid){
	cout<<"New Foo id="<<_id<<", _k="<<_k<<endl;}
Foo(const Foo& foo=_static_foo):_k(foo._k),_id(++_freeid){
	cout<<"New copy Foo id="<<_id<<", _k="<<_k<<endl;}
};
Тепер ігнорується int k=0
Описание слайда:
Другий варіант class Foo { private: int _k; static int _freeid; const int _id; static Foo _static_foo; public: Foo(int k=0):_k(k), _id(++_freeid){ cout<<"New Foo id="<<_id<<", _k="<<_k<<endl;} Foo(const Foo& foo=_static_foo):_k(foo._k),_id(++_freeid){ cout<<"New copy Foo id="<<_id<<", _k="<<_k<<endl;} }; Тепер ігнорується int k=0

Слайд 17





Експеримент
int Foo::_freeid = 0;
Foo Foo::_static_foo(100);
int main() {
	cout<<"START"<<endl;
	Foo f1(10);
	Foo f2; // Копія об'єкту _static_foo
}
Зверніть увагу на порядок виконання дій
New Foo id=1, _k=100
START
New Foo id=2, _k=10
New copy Foo id=3, _k=100
Описание слайда:
Експеримент int Foo::_freeid = 0; Foo Foo::_static_foo(100); int main() { cout<<"START"<<endl; Foo f1(10); Foo f2; // Копія об'єкту _static_foo } Зверніть увагу на порядок виконання дій New Foo id=1, _k=100 START New Foo id=2, _k=10 New copy Foo id=3, _k=100

Слайд 18





Інший експеримент
int Foo::_freeid = 0;
int main() {
	cout<<"START"<<endl;
	Foo f1(10);
	Foo f2; // Копія об'єкту _static_foo
}
Foo Foo::_static_foo(100);
// Щось зміниться, якщо визначення Foo::_static_foo
// перенести до іншого місця?
Описание слайда:
Інший експеримент int Foo::_freeid = 0; int main() { cout<<"START"<<endl; Foo f1(10); Foo f2; // Копія об'єкту _static_foo } Foo Foo::_static_foo(100); // Щось зміниться, якщо визначення Foo::_static_foo // перенести до іншого місця?

Слайд 19





Деструктор Point
Point::~Point()
{
#ifdef NDEBUG
	cout<<pointID<<": removed "<<*this<<endl;
#endif
	return;
};
Описание слайда:
Деструктор Point Point::~Point() { #ifdef NDEBUG cout<<pointID<<": removed "<<*this<<endl; #endif return; };

Слайд 20





Передача об'єктів параметрами
Значенням
Point operator+ (Point u, Point v)
{
	Point res(u.x()+v.x(), u.y()+v.y());
	return res;
}
Відсилками
ostream& operator<<(ostream &os, const Point& u)
{
	os<<'('<<u.x()<<','<<u.y()<<')';
	return os;
}
Описание слайда:
Передача об'єктів параметрами Значенням Point operator+ (Point u, Point v) { Point res(u.x()+v.x(), u.y()+v.y()); return res; } Відсилками ostream& operator<<(ostream &os, const Point& u) { os<<'('<<u.x()<<','<<u.y()<<')'; return os; }

Слайд 21





Протокол
int main()
{
	Point a(1,2);
	Point b(5);
	a+b;
	return 0;	
}
Описание слайда:
Протокол int main() { Point a(1,2); Point b(5); a+b; return 0; }

Слайд 22





Вправа до передачі об'єктів параметрами
Що зміниться в протоколі, якщо у виводі забрати сталу відсилку?
ostream& operator<<(ostream &os, Point u)
{
	os<<'('<<u.x()<<','<<u.y()<<')';
	return os;
}
Описание слайда:
Вправа до передачі об'єктів параметрами Що зміниться в протоколі, якщо у виводі забрати сталу відсилку? ostream& operator<<(ostream &os, Point u) { os<<'('<<u.x()<<','<<u.y()<<')'; return os; }

Слайд 23





Без локальної змінної
Point operator+ (Point u, Point v)
{
/*	Замість
	Point res(u.x()+v.x(), u.y()+v.y());
	return res; 
*/
	return Point ( u.x()+v.x(), u.y()+v.y() );
}
Описание слайда:
Без локальної змінної Point operator+ (Point u, Point v) { /* Замість Point res(u.x()+v.x(), u.y()+v.y()); return res; */ return Point ( u.x()+v.x(), u.y()+v.y() ); }

Слайд 24





Протокол 2
int main()
{
	Point a(1,2);
	Point b(5);
	a+b;
	return 0;	
}
Описание слайда:
Протокол 2 int main() { Point a(1,2); Point b(5); a+b; return 0; }

Слайд 25





Сталі відсилки
Point operator+ (const Point & u, const Point & v)
{
	return Point ( u.x()+v.x(), u.y()+v.y() );
}
Описание слайда:
Сталі відсилки Point operator+ (const Point & u, const Point & v) { return Point ( u.x()+v.x(), u.y()+v.y() ); }

Слайд 26





Протокол 3
int main()
{
	Point a(1,2);
	Point b(1);
	a+b;
	return 0;	
}
Описание слайда:
Протокол 3 int main() { Point a(1,2); Point b(1); a+b; return 0; }

Слайд 27





Урок  передачі параметрів
Передаючи параметр і одержуючи результат, усвідомлюйте, з чим маєте справу: з оригіналом чи копією
Описание слайда:
Урок передачі параметрів Передаючи параметр і одержуючи результат, усвідомлюйте, з чим маєте справу: з оригіналом чи копією

Слайд 28





Копіювання агрегатів
class WrappedVector
{
private:
	static const size_t n;
	double * v;
public:
	WrappedVector();
	WrappedVector(const WrappedVector&);
	~WrappedVector();
};
Описание слайда:
Копіювання агрегатів class WrappedVector { private: static const size_t n; double * v; public: WrappedVector(); WrappedVector(const WrappedVector&); ~WrappedVector(); };

Слайд 29





Копіювальний конструктор вектора
WrappedVector::
	WrappedVector (const WrappedVector& vec):
	_v (new double[_n])
{
	for (size_t i=0; i<_n; i++)
		_v[i] = vec._v[i];
	return;
}
//	Як бути з нестачею пам'яті?
Описание слайда:
Копіювальний конструктор вектора WrappedVector:: WrappedVector (const WrappedVector& vec): _v (new double[_n]) { for (size_t i=0; i<_n; i++) _v[i] = vec._v[i]; return; } // Як бути з нестачею пам'яті?

Слайд 30





Копіювальний конструктор за замовчуванням
WrappedVector::
	WrappedVector (const WrappedVector& vec):
	_v (vec._v)
{ };
//	Чим закінчиться виконання програми?
int main()
{
	WrappedVector u, v(u);
	return 64; //	катастрофою!!!
}
Описание слайда:
Копіювальний конструктор за замовчуванням WrappedVector:: WrappedVector (const WrappedVector& vec): _v (vec._v) { }; // Чим закінчиться виконання програми? int main() { WrappedVector u, v(u); return 64; // катастрофою!!! }

Слайд 31





Копіювання присвоєнням
class WrappedVector
{
private:
	static const size_t n;
	double * v;
public:
	WrappedVector();
	WrappedVector(const WrappedVector&);
	~WrappedVector();
	WrappedVector& operator= (const WrappedVector&);
};
Описание слайда:
Копіювання присвоєнням class WrappedVector { private: static const size_t n; double * v; public: WrappedVector(); WrappedVector(const WrappedVector&); ~WrappedVector(); WrappedVector& operator= (const WrappedVector&); };

Слайд 32





Реалізація копіювального присвоєння
WrappedVector& 
	WrappedVector::operator=
		(const WrappedVector& vec)
{
//Нам поталанило: vec і this мають одну й ту ж довжину
	for (size_t i=0; i<n; i++)
		v[i] = vec.v[i];
	return *this;
}
Описание слайда:
Реалізація копіювального присвоєння WrappedVector& WrappedVector::operator= (const WrappedVector& vec) { //Нам поталанило: vec і this мають одну й ту ж довжину for (size_t i=0; i<n; i++) v[i] = vec.v[i]; return *this; }

Слайд 33





Присвоєння за замовчуванням
WrappedVector& WrappedVector :: operator=
		(const WrappedVector& vec)
{
	v = vec;
	return *this;
} 
//	Чим закінчиться виконання програми?
int main()
{
	WrappedVector u, v;
	u=v;
	return 64;	//	знову катастрофою!!!
}
Описание слайда:
Присвоєння за замовчуванням WrappedVector& WrappedVector :: operator= (const WrappedVector& vec) { v = vec; return *this; } // Чим закінчиться виконання програми? int main() { WrappedVector u, v; u=v; return 64; // знову катастрофою!!! }

Слайд 34





Вектори різної довжини
class DissimilarVector
{
private:
	size_t _n;	//non static, non const(?)
	double * _v;
public:
	DissimilarVector(int);
	DissimilarVector(const DissimilarVector&);
	~DissimilarVector();
	DissimilarVector& operator=(const DissimilarVector&);
};
Описание слайда:
Вектори різної довжини class DissimilarVector { private: size_t _n; //non static, non const(?) double * _v; public: DissimilarVector(int); DissimilarVector(const DissimilarVector&); ~DissimilarVector(); DissimilarVector& operator=(const DissimilarVector&); };

Слайд 35





Конструктор вектора
DissimilarVector::
	DissimilarVector (size_t len) : 
		_n (len),
		_v (new double[n])
{
	for (size_t i=0; i<_n; i++)
		_v[i] = 0;
	return;
}
Описание слайда:
Конструктор вектора DissimilarVector:: DissimilarVector (size_t len) : _n (len), _v (new double[n]) { for (size_t i=0; i<_n; i++) _v[i] = 0; return; }

Слайд 36





Копіювальний конструктор
DissimilarVector::
	DissimilarVector (const DissimilarVector& vec):
		_n (vec._n),
		_v (new double[vec._n])
{
	for (size_t i=0; i<_n; i++)
		_v[i] = vec._v[i];
	return;
}
Описание слайда:
Копіювальний конструктор DissimilarVector:: DissimilarVector (const DissimilarVector& vec): _n (vec._n), _v (new double[vec._n]) { for (size_t i=0; i<_n; i++) _v[i] = vec._v[i]; return; }

Слайд 37





Чому атрибут _n не може бути сталим? 
Спробуйте присвоєння за замовчуванням
Навіть копіювальне присвоєння, взагалі кажучи, не працюватиме
Описание слайда:
Чому атрибут _n не може бути сталим? Спробуйте присвоєння за замовчуванням Навіть копіювальне присвоєння, взагалі кажучи, не працюватиме

Слайд 38





Копіювальне присвоєння
DissimilarVector& DissimilarVector::operator=
			(const DissimilarVector& vec)
{
//1. Видалити старий об'єкт
	if (this==&vec)
		return *this;
	delete [] _v;
//2. Створити новий об'єкт
	_n = vec._n;
	_v = new double[_n];
//3. Скопіювати значення	
	for (size_t i=0; i<_n; i++)
		_v[i] = vec._v[i];
	return *this;
}
Описание слайда:
Копіювальне присвоєння DissimilarVector& DissimilarVector::operator= (const DissimilarVector& vec) { //1. Видалити старий об'єкт if (this==&vec) return *this; delete [] _v; //2. Створити новий об'єкт _n = vec._n; _v = new double[_n]; //3. Скопіювати значення for (size_t i=0; i<_n; i++) _v[i] = vec._v[i]; return *this; }

Слайд 39





Рядки з копіюванням
class String
{
private:
	size_t _len;
	char* _allocator;
public:
	String();
	String(const char*);
	String(const char);
	String (const String & s); 
	~String();
};
Описание слайда:
Рядки з копіюванням class String { private: size_t _len; char* _allocator; public: String(); String(const char*); String(const char); String (const String & s); ~String(); };

Слайд 40





Копіювальний конструктор рядка
String::String(String& s)
	_len( s._len),
	_allocator( new char[_len+1])
{
	strcpy(_allocator, s._allocator);
	return;
};
Описание слайда:
Копіювальний конструктор рядка String::String(String& s) _len( s._len), _allocator( new char[_len+1]) { strcpy(_allocator, s._allocator); return; };

Слайд 41





Редагування оригіналу (без const)
class String
{
private:
	size_t _len;
	char* _allocator;
 	int _amountOfCopies;
public:
	String();
	String(const char*);
	String(const char);
	String (String & s); 
	~String();
};
Описание слайда:
Редагування оригіналу (без const) class String { private: size_t _len; char* _allocator; int _amountOfCopies; public: String(); String(const char*); String(const char); String (String & s); ~String(); };

Слайд 42





Копіювання з редагуванням
String::String(String& s)
	_amountOfCopies (0),
	_len( s._len),
	_allocator( new char[_len+1])
{
//	Кількість копій, зроблених з оригіналу
//	збільшується на одиницю
	s._amountOfCopies++;
	strcpy(_allocator, s._allocator);
	return;
};
Описание слайда:
Копіювання з редагуванням String::String(String& s) _amountOfCopies (0), _len( s._len), _allocator( new char[_len+1]) { // Кількість копій, зроблених з оригіналу // збільшується на одиницю s._amountOfCopies++; strcpy(_allocator, s._allocator); return; };

Слайд 43





Мультиконструктор копіювання
class String
{
public:
	String();
	String(const char*);
	String(const char);
	String(const String & s, int multiplayer=1); 
	~String();
};
Описание слайда:
Мультиконструктор копіювання class String { public: String(); String(const char*); String(const char); String(const String & s, int multiplayer=1); ~String(); };

Слайд 44





Реалізація мультиконструктора копіювання
String:: String(const String & s, int multiplayer):
	_len (s._len*multiplayer),
	_allocator (new char [_len+1])
{
	char * target = _allocator;
	for (int i=0; i<multiplayer; i++)
	{
		strcpy(target, s._allocator);
		target+=s._len;
	}
	return;
};
Описание слайда:
Реалізація мультиконструктора копіювання String:: String(const String & s, int multiplayer): _len (s._len*multiplayer), _allocator (new char [_len+1]) { char * target = _allocator; for (int i=0; i<multiplayer; i++) { strcpy(target, s._allocator); target+=s._len; } return; };

Слайд 45





Застосування копіювання
// Common constructor
String s(p);
// Copy version of multiplication constructor
String ss(s);
// Multiplication constructor
String s10(s,10);
Описание слайда:
Застосування копіювання // Common constructor String s(p); // Copy version of multiplication constructor String ss(s); // Multiplication constructor String s10(s,10);

Слайд 46





Проблема замовчуваного параметру
Що станеться, якщо замовчуваний параметр перенести до реалізації? ― Катастофа
class String
{
public:
	String(const String & s, int multiplayer); 
};
String:: String(const String & s, int multiplayer=1):…{…;}
Чому?
Описание слайда:
Проблема замовчуваного параметру Що станеться, якщо замовчуваний параметр перенести до реалізації? ― Катастофа class String { public: String(const String & s, int multiplayer); }; String:: String(const String & s, int multiplayer=1):…{…;} Чому?

Слайд 47





Некоректне копіювання
#include “String.h”
// Common constructor
String s(p);
// Default copy constructor
String ss(s);
// Multiplication constructor
String s10(s,10);
Описание слайда:
Некоректне копіювання #include “String.h” // Common constructor String s(p); // Default copy constructor String ss(s); // Multiplication constructor String s10(s,10);

Слайд 48





Сигнатури присвоєнь
Якій з сигнатур віддати перевагу?
void operator=( T&);
T     operator=( T&);
T&   operator=( T  );
T     operator=( T  );
T&   operator=( T&);
Описание слайда:
Сигнатури присвоєнь Якій з сигнатур віддати перевагу? void operator=( T&); T operator=( T&); T& operator=( T ); T operator=( T ); T& operator=( T&);

Слайд 49





Сигнатури присвоєнь
Якій з сигнатур віддати перевагу?
void operator=( T&);	//	Як бути з x=y=z;
T     operator=( T&);	//	чим копіювати результат?
T&   operator=( T  );	//	чим копіювати параметр?
T     operator=( T  );	//	див 2 і 3 разом	
T&   operator=( T&);	//	ОК!!!
Описание слайда:
Сигнатури присвоєнь Якій з сигнатур віддати перевагу? void operator=( T&); // Як бути з x=y=z; T operator=( T&); // чим копіювати результат? T& operator=( T ); // чим копіювати параметр? T operator=( T ); // див 2 і 3 разом T& operator=( T&); // ОК!!!

Слайд 50





Сигнатури присвоєнь
Якій з сигнатур віддати перевагу?
void operator=( T&);
T     operator=( T&);
T&   operator=( T  );
T     operator=( T  );
T&   operator=( T&);
Описание слайда:
Сигнатури присвоєнь Якій з сигнатур віддати перевагу? void operator=( T&); T operator=( T&); T& operator=( T ); T operator=( T ); T& operator=( T&);

Слайд 51





Що таке this?
class T
{
public:
	T(T1,…,Tn);
	~T();
	T(const T&);
	T& operator= (const T&);
};
this має тип T * const
Описание слайда:
Що таке this? class T { public: T(T1,…,Tn); ~T(); T(const T&); T& operator= (const T&); }; this має тип T * const

Слайд 52





Чому * const? 
this  не можна перемістити на інший об'єкт
this = anything; не коректно
Описание слайда:
Чому * const? this не можна перемістити на інший об'єкт this = anything; не коректно

Слайд 53





Повернення значення в присвоєнні
Point& Point::operator=(const Point & u)
{
	this ->_x = u._x;
	*this._y   = u._y;
	return *this;
}
Описание слайда:
Повернення значення в присвоєнні Point& Point::operator=(const Point & u) { this ->_x = u._x; *this._y = u._y; return *this; }

Слайд 54





Рядки з присвоєнням
class String
{
public:
	String();
	String(const char*);
	String(const char);
	String(const String & s, int multiplayer=1); 
 	String& operator=(const String&);
	~String();
};
Описание слайда:
Рядки з присвоєнням class String { public: String(); String(const char*); String(const char); String(const String & s, int multiplayer=1); String& operator=(const String&); ~String(); };

Слайд 55





Присвоєння рядків
String& String::operator=(const String& s)
{
	if (this==&s)
		return *this;
	delete [] _allocator;
	_len = s._len;
	_allocator = new char[_len+1];
	strcpy(_allocator, s._allocator);
	return *this;
}
Описание слайда:
Присвоєння рядків String& String::operator=(const String& s) { if (this==&s) return *this; delete [] _allocator; _len = s._len; _allocator = new char[_len+1]; strcpy(_allocator, s._allocator); return *this; }

Слайд 56





Висновки
Конструктор копіювання створює новий об'єкт
Присвоєння звичайно замінює існуючий об'єкт іншим об'єктом (навіть якщо не доводиться видаляти попередні значення)
Присвоєння не можна визначити поза класом
Присвоєння в класі T має тип T& (чому?)
Присвоєння повертає *this, конструктори не повертають нічого (чому?)
Описание слайда:
Висновки Конструктор копіювання створює новий об'єкт Присвоєння звичайно замінює існуючий об'єкт іншим об'єктом (навіть якщо не доводиться видаляти попередні значення) Присвоєння не можна визначити поза класом Присвоєння в класі T має тип T& (чому?) Присвоєння повертає *this, конструктори не повертають нічого (чому?)



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