Оцените презентацию от 1 до 5 баллов!
Тип файла:
ppt / pptx (powerpoint)
Всего слайдов:
56 слайдов
Для класса:
1,2,3,4,5,6,7,8,9,10,11
Размер файла:
341.00 kB
Просмотров:
60
Скачиваний:
0
Автор:
неизвестен
Слайды и текст к этой презентации:
№1 слайд![Бублик Володимир Васильович](/documents_6/17f4b2e41ed5e0d8adac82b9885c5f8d/img0.jpg)
Содержание слайда: Бублик Володимир Васильович
Об'єктно-орієнтоване
програмування
Частина 1. Об'єктне програмування.
Лекція 2. Копіювання об'єктів
Лекції для студентів 2 курсу
№2 слайд![Повторення Що ма бути в клас](/documents_6/17f4b2e41ed5e0d8adac82b9885c5f8d/img1.jpg)
Содержание слайда: Повторення
Що має бути в класі
class T
{
private:
// Тут розміщують атрибути
public:
// Конструктори
T(T1,…,Tn);
// Деструктор
~T(); // далі селектори, модифікатори, …
};
№3 слайд![Приклад класу. String class](/documents_6/17f4b2e41ed5e0d8adac82b9885c5f8d/img2.jpg)
Содержание слайда: Приклад класу. 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 слайд![Констуктори Для чого у клас](/documents_6/17f4b2e41ed5e0d8adac82b9885c5f8d/img3.jpg)
Содержание слайда: Констуктори
Для чого у класі три різних конструктори?
class String {
private:
size_t _len;
char* _allocator;
public:
String();
String(const char*);
String(const char);
……………………………………………
};
№5 слайд![Властив сть нкапсуляц В](/documents_6/17f4b2e41ed5e0d8adac82b9885c5f8d/img4.jpg)
Содержание слайда: Властивість інкапсуляції
Відокремлення реалізації класу від його визначення
String::String (const char c):
_allocator( new char [2]),
_len(1)
{
_allocator [0]=c;
_allocator [1]='\0';
return;
}
№6 слайд![Питання Чому у визначенн](/documents_6/17f4b2e41ed5e0d8adac82b9885c5f8d/img5.jpg)
Содержание слайда: Питання
Чому у визначенні класу розміщені реалізації?
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 слайд![Питання Чи коректний параметр](/documents_6/17f4b2e41ed5e0d8adac82b9885c5f8d/img6.jpg)
Содержание слайда: Питання
Чи коректний параметр замовчування? ― Ні. Чому?
class String
{
private:
size_t _len;
char* _allocator;
public:
String ();
String (const char* ps=0);
String (const char);
~String ();
};
№8 слайд![Конструктор коп ювання class](/documents_6/17f4b2e41ed5e0d8adac82b9885c5f8d/img7.jpg)
Содержание слайда: Конструктор копіювання
class T
{
T(T1,…,Tn);
~T();
// конструктор копіювання
// створює новий об'єкт, ідентичний
// переданому параметром
T(const T&);
// Можливий варіант: T(T&);
// але не Т(Т)
};
№9 слайд![Використання Конструктор коп](/documents_6/17f4b2e41ed5e0d8adac82b9885c5f8d/img8.jpg)
Содержание слайда: Використання
Конструктор копіювання викликається кожного разу, коли параметр або результат передаються значеннями
T1 f(T2 x)
{
T1 y;
// тіло f…
return y;
}
a=f(b); // T2 x(b); T1 y; тіло f… ; a = T1(y);
№10 слайд![Обл к об кт в Off top quot](/documents_6/17f4b2e41ed5e0d8adac82b9885c5f8d/img9.jpg)
Содержание слайда: Облік об'єктів (Off top)
"Тьоркін на тім світі…“
Олександр Твардовський
– Як це так – без виробництва? –
Теркін знову пристає, –
І щоб тільки керівництво!..
– Ні, ще облік у нас є...
Переклад Марка Кайдаша
№11 слайд![нвентаризац я об кт в class](/documents_6/17f4b2e41ed5e0d8adac82b9885c5f8d/img10.jpg)
Содержание слайда: Інвентаризація об'єктів
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](/documents_6/17f4b2e41ed5e0d8adac82b9885c5f8d/img11.jpg)
Содержание слайда: Конструктор Point
Point::Point (double x, double y):
_x (x),
_y (y),
pointID (++_freeID)
{
#ifdef NDEBUG
cout<<pointID<<": created "<<*this<<endl;
#endif
return;
};
// Де коректно розмістити замовчування параметру?
№13 слайд![Коп ювальний конструктор](/documents_6/17f4b2e41ed5e0d8adac82b9885c5f8d/img12.jpg)
Содержание слайда: Копіювальний конструктор Point
Point::Point (const Point & u):
_x (u._x),
_y (u._y),
pointID(++_freeID)
{
#ifdef NDEBUG
cout<<pointID<<": copied "<<*this<<endl;
#endif
return;
};
// Чи може копіювання мати замовчуваний параметр?
№14 слайд![Замовчування у коп ювальному](/documents_6/17f4b2e41ed5e0d8adac82b9885c5f8d/img13.jpg)
Содержание слайда: Замовчування у копіювальному конструкторі
class Foo;
int main() {
Foo f1(10); // Створення нового об'єкту
Foo f2(f1); // Копіювання існуючого об'єкту
Foo f3; // Це що? Наперед невідомо
}
№15 слайд![Перший вар ант class Foo](/documents_6/17f4b2e41ed5e0d8adac82b9885c5f8d/img14.jpg)
Содержание слайда: Перший варіант
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](/documents_6/17f4b2e41ed5e0d8adac82b9885c5f8d/img15.jpg)
Содержание слайда: Другий варіант
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](/documents_6/17f4b2e41ed5e0d8adac82b9885c5f8d/img16.jpg)
Содержание слайда: Експеримент
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](/documents_6/17f4b2e41ed5e0d8adac82b9885c5f8d/img17.jpg)
Содержание слайда: Інший експеримент
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](/documents_6/17f4b2e41ed5e0d8adac82b9885c5f8d/img18.jpg)
Содержание слайда: Деструктор Point
Point::~Point()
{
#ifdef NDEBUG
cout<<pointID<<": removed "<<*this<<endl;
#endif
return;
};
№20 слайд![Передача об кт в параметрами](/documents_6/17f4b2e41ed5e0d8adac82b9885c5f8d/img19.jpg)
Содержание слайда: Передача об'єктів параметрами
Значенням
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 ,](/documents_6/17f4b2e41ed5e0d8adac82b9885c5f8d/img20.jpg)
Содержание слайда: Протокол
int main()
{
Point a(1,2);
Point b(5);
a+b;
return 0;
}
№22 слайд![Вправа до передач об кт в](/documents_6/17f4b2e41ed5e0d8adac82b9885c5f8d/img21.jpg)
Содержание слайда: Вправа до передачі об'єктів параметрами
Що зміниться в протоколі, якщо у виводі забрати сталу відсилку?
ostream& operator<<(ostream &os, Point u)
{
os<<'('<<u.x()<<','<<u.y()<<')';
return os;
}
№23 слайд![Без локально зм нно Point](/documents_6/17f4b2e41ed5e0d8adac82b9885c5f8d/img22.jpg)
Содержание слайда: Без локальної змінної
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 слайд![Протокол int main Point a ,](/documents_6/17f4b2e41ed5e0d8adac82b9885c5f8d/img23.jpg)
Содержание слайда: Протокол 2
int main()
{
Point a(1,2);
Point b(5);
a+b;
return 0;
}
№25 слайд![Стал в дсилки Point operator](/documents_6/17f4b2e41ed5e0d8adac82b9885c5f8d/img24.jpg)
Содержание слайда: Сталі відсилки
Point operator+ (const Point & u, const Point & v)
{
return Point ( u.x()+v.x(), u.y()+v.y() );
}
№26 слайд![Протокол int main Point a ,](/documents_6/17f4b2e41ed5e0d8adac82b9885c5f8d/img25.jpg)
Содержание слайда: Протокол 3
int main()
{
Point a(1,2);
Point b(1);
a+b;
return 0;
}
№27 слайд![Урок передач параметр в](/documents_6/17f4b2e41ed5e0d8adac82b9885c5f8d/img26.jpg)
Содержание слайда: Урок передачі параметрів
Передаючи параметр і одержуючи результат, усвідомлюйте, з чим маєте справу: з оригіналом чи копією
№28 слайд![Коп ювання агрегат в class](/documents_6/17f4b2e41ed5e0d8adac82b9885c5f8d/img27.jpg)
Содержание слайда: Копіювання агрегатів
class WrappedVector
{
private:
static const size_t n;
double * v;
public:
WrappedVector();
WrappedVector(const WrappedVector&);
~WrappedVector();
};
№29 слайд![Коп ювальний конструктор](/documents_6/17f4b2e41ed5e0d8adac82b9885c5f8d/img28.jpg)
Содержание слайда: Копіювальний конструктор вектора
WrappedVector::
WrappedVector (const WrappedVector& vec):
_v (new double[_n])
{
for (size_t i=0; i<_n; i++)
_v[i] = vec._v[i];
return;
}
// Як бути з нестачею пам'яті?
№30 слайд![Коп ювальний конструктор за](/documents_6/17f4b2e41ed5e0d8adac82b9885c5f8d/img29.jpg)
Содержание слайда: Копіювальний конструктор за замовчуванням
WrappedVector::
WrappedVector (const WrappedVector& vec):
_v (vec._v)
{ };
// Чим закінчиться виконання програми?
int main()
{
WrappedVector u, v(u);
return 64; // катастрофою!!!
}
№31 слайд![Коп ювання присво нням class](/documents_6/17f4b2e41ed5e0d8adac82b9885c5f8d/img30.jpg)
Содержание слайда: Копіювання присвоєнням
class WrappedVector
{
private:
static const size_t n;
double * v;
public:
WrappedVector();
WrappedVector(const WrappedVector&);
~WrappedVector();
WrappedVector& operator= (const WrappedVector&);
};
№32 слайд![Реал зац я коп ювального](/documents_6/17f4b2e41ed5e0d8adac82b9885c5f8d/img31.jpg)
Содержание слайда: Реалізація копіювального присвоєння
WrappedVector&
WrappedVector::operator=
(const WrappedVector& vec)
{
//Нам поталанило: vec і this мають одну й ту ж довжину
for (size_t i=0; i<n; i++)
v[i] = vec.v[i];
return *this;
}
№33 слайд![Присво ння за замовчуванням](/documents_6/17f4b2e41ed5e0d8adac82b9885c5f8d/img32.jpg)
Содержание слайда: Присвоєння за замовчуванням
WrappedVector& WrappedVector :: operator=
(const WrappedVector& vec)
{
v = vec;
return *this;
}
// Чим закінчиться виконання програми?
int main()
{
WrappedVector u, v;
u=v;
return 64; // знову катастрофою!!!
}
№34 слайд![Вектори р зно довжини class](/documents_6/17f4b2e41ed5e0d8adac82b9885c5f8d/img33.jpg)
Содержание слайда: Вектори різної довжини
class DissimilarVector
{
private:
size_t _n; //non static, non const(?)
double * _v;
public:
DissimilarVector(int);
DissimilarVector(const DissimilarVector&);
~DissimilarVector();
DissimilarVector& operator=(const DissimilarVector&);
};
№35 слайд![Конструктор вектора](/documents_6/17f4b2e41ed5e0d8adac82b9885c5f8d/img34.jpg)
Содержание слайда: Конструктор вектора
DissimilarVector::
DissimilarVector (size_t len) :
_n (len),
_v (new double[n])
{
for (size_t i=0; i<_n; i++)
_v[i] = 0;
return;
}
№36 слайд![Коп ювальний конструктор](/documents_6/17f4b2e41ed5e0d8adac82b9885c5f8d/img35.jpg)
Содержание слайда: Копіювальний конструктор
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 не може бути](/documents_6/17f4b2e41ed5e0d8adac82b9885c5f8d/img36.jpg)
Содержание слайда: Чому атрибут _n не може бути сталим?
Спробуйте присвоєння за замовчуванням
Навіть копіювальне присвоєння, взагалі кажучи, не працюватиме
№38 слайд![Коп ювальне присво ння](/documents_6/17f4b2e41ed5e0d8adac82b9885c5f8d/img37.jpg)
Содержание слайда: Копіювальне присвоєння
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](/documents_6/17f4b2e41ed5e0d8adac82b9885c5f8d/img38.jpg)
Содержание слайда: Рядки з копіюванням
class String
{
private:
size_t _len;
char* _allocator;
public:
String();
String(const char*);
String(const char);
String (const String & s);
~String();
};
№40 слайд![Коп ювальний конструктор](/documents_6/17f4b2e41ed5e0d8adac82b9885c5f8d/img39.jpg)
Содержание слайда: Копіювальний конструктор рядка
String::String(String& s)
_len( s._len),
_allocator( new char[_len+1])
{
strcpy(_allocator, s._allocator);
return;
};
№41 слайд![Редагування ориг налу без](/documents_6/17f4b2e41ed5e0d8adac82b9885c5f8d/img40.jpg)
Содержание слайда: Редагування оригіналу (без const)
class String
{
private:
size_t _len;
char* _allocator;
int _amountOfCopies;
public:
String();
String(const char*);
String(const char);
String (String & s);
~String();
};
№42 слайд![Коп ювання з редагуванням](/documents_6/17f4b2e41ed5e0d8adac82b9885c5f8d/img41.jpg)
Содержание слайда: Копіювання з редагуванням
String::String(String& s)
_amountOfCopies (0),
_len( s._len),
_allocator( new char[_len+1])
{
// Кількість копій, зроблених з оригіналу
// збільшується на одиницю
s._amountOfCopies++;
strcpy(_allocator, s._allocator);
return;
};
№43 слайд![Мультиконструктор коп ювання](/documents_6/17f4b2e41ed5e0d8adac82b9885c5f8d/img42.jpg)
Содержание слайда: Мультиконструктор копіювання
class String
{
public:
String();
String(const char*);
String(const char);
String(const String & s, int multiplayer=1);
~String();
};
№44 слайд![Реал зац я мультиконструктора](/documents_6/17f4b2e41ed5e0d8adac82b9885c5f8d/img43.jpg)
Содержание слайда: Реалізація мультиконструктора копіювання
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 слайд![Застосування коп ювання](/documents_6/17f4b2e41ed5e0d8adac82b9885c5f8d/img44.jpg)
Содержание слайда: Застосування копіювання
// Common constructor
String s(p);
// Copy version of multiplication constructor
String ss(s);
// Multiplication constructor
String s10(s,10);
№46 слайд![Проблема замовчуваного](/documents_6/17f4b2e41ed5e0d8adac82b9885c5f8d/img45.jpg)
Содержание слайда: Проблема замовчуваного параметру
Що станеться, якщо замовчуваний параметр перенести до реалізації? ― Катастофа
class String
{
public:
String(const String & s, int multiplayer);
};
String:: String(const String & s, int multiplayer=1):…{…;}
Чому?
№47 слайд![Некоректне коп ювання include](/documents_6/17f4b2e41ed5e0d8adac82b9885c5f8d/img46.jpg)
Содержание слайда: Некоректне копіювання
#include “String.h”
// Common constructor
String s(p);
// Default copy constructor
String ss(s);
// Multiplication constructor
String s10(s,10);
№48 слайд![Сигнатури присво нь Як й з](/documents_6/17f4b2e41ed5e0d8adac82b9885c5f8d/img47.jpg)
Содержание слайда: Сигнатури присвоєнь
Якій з сигнатур віддати перевагу?
void operator=( T&);
T operator=( T&);
T& operator=( T );
T operator=( T );
T& operator=( T&);
№49 слайд![Сигнатури присво нь Як й з](/documents_6/17f4b2e41ed5e0d8adac82b9885c5f8d/img48.jpg)
Содержание слайда: Сигнатури присвоєнь
Якій з сигнатур віддати перевагу?
void operator=( T&); // Як бути з x=y=z;
T operator=( T&); // чим копіювати результат?
T& operator=( T ); // чим копіювати параметр?
T operator=( T ); // див 2 і 3 разом
T& operator=( T&); // ОК!!!
№50 слайд![Сигнатури присво нь Як й з](/documents_6/17f4b2e41ed5e0d8adac82b9885c5f8d/img49.jpg)
Содержание слайда: Сигнатури присвоєнь
Якій з сигнатур віддати перевагу?
void operator=( T&);
T operator=( T&);
T& operator=( T );
T operator=( T );
T& operator=( T&);
№51 слайд![Що таке this? class T public](/documents_6/17f4b2e41ed5e0d8adac82b9885c5f8d/img50.jpg)
Содержание слайда: Що таке this?
class T
{
public:
T(T1,…,Tn);
~T();
T(const T&);
T& operator= (const T&);
};
this має тип T * const
№52 слайд![Чому const? this не можна](/documents_6/17f4b2e41ed5e0d8adac82b9885c5f8d/img51.jpg)
Содержание слайда: Чому * const?
this не можна перемістити на інший об'єкт
this = anything; не коректно
№53 слайд![Повернення значення в присво](/documents_6/17f4b2e41ed5e0d8adac82b9885c5f8d/img52.jpg)
Содержание слайда: Повернення значення в присвоєнні
Point& Point::operator=(const Point & u)
{
this ->_x = u._x;
*this._y = u._y;
return *this;
}
№54 слайд![Рядки з присво нням class](/documents_6/17f4b2e41ed5e0d8adac82b9885c5f8d/img53.jpg)
Содержание слайда: Рядки з присвоєнням
class String
{
public:
String();
String(const char*);
String(const char);
String(const String & s, int multiplayer=1);
String& operator=(const String&);
~String();
};
№55 слайд![Присво ння рядк в String amp](/documents_6/17f4b2e41ed5e0d8adac82b9885c5f8d/img54.jpg)
Содержание слайда: Присвоєння рядків
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 слайд![Висновки Конструктор коп](/documents_6/17f4b2e41ed5e0d8adac82b9885c5f8d/img55.jpg)
Содержание слайда: Висновки
Конструктор копіювання створює новий об'єкт
Присвоєння звичайно замінює існуючий об'єкт іншим об'єктом (навіть якщо не доводиться видаляти попередні значення)
Присвоєння не можна визначити поза класом
Присвоєння в класі T має тип T& (чому?)
Присвоєння повертає *this, конструктори не повертають нічого (чому?)