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

На нашем сайте вы можете скачать и просмотреть онлайн доклад-презентацию на тему Об'єктне програмування. Копіювання об'єктів. (Частина 1. Лекція 2) абсолютно бесплатно. Урок-презентация на эту тему содержит всего 56 слайдов. Все материалы созданы в программе PowerPoint и имеют формат ppt или же pptx. Материалы и темы для презентаций взяты из открытых источников и загружены их авторами, за качество и достоверность информации в них администрация сайта не отвечает, все права принадлежат их создателям. Если вы нашли то, что искали, отблагодарите авторов - поделитесь ссылкой в социальных сетях, а наш сайт добавьте в закладки.
Презентации » Устройства и комплектующие » Об'єктне програмування. Копіювання об'єктів. (Частина 1. Лекція 2)



Оцените!
Оцените презентацию от 1 до 5 баллов!
  • Тип файла:
    ppt / pptx (powerpoint)
  • Всего слайдов:
    56 слайдов
  • Для класса:
    1,2,3,4,5,6,7,8,9,10,11
  • Размер файла:
    341.00 kB
  • Просмотров:
    60
  • Скачиваний:
    0
  • Автор:
    неизвестен



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

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

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

№3 слайд
Приклад класу. String class
Содержание слайда: Приклад класу. 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); …………………………………………… };

№5 слайд
Властив сть нкапсуляц В
Содержание слайда: Властивість інкапсуляції Відокремлення реалізації класу від його визначення 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();} };

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

№8 слайд
Конструктор коп ювання class
Содержание слайда: Конструктор копіювання 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);

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

№11 слайд
нвентаризац я об кт в class
Содержание слайда: Інвентаризація об'єктів 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
Содержание слайда: Конструктор 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; }; // Чи може копіювання мати замовчуваний параметр?

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

№15 слайд
Перший вар ант class Foo
Содержание слайда: Перший варіант 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
Содержание слайда: Другий варіант 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
Содержание слайда: Експеримент 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
Содержание слайда: Інший експеримент 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
Содержание слайда: Деструктор 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; }

№21 слайд
Протокол int main Point a ,
Содержание слайда: Протокол 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; }

№23 слайд
Без локально зм нно Point
Содержание слайда: Без локальної змінної 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 ,
Содержание слайда: Протокол 2 int main() { Point a(1,2); Point b(5); a+b; return 0; }

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

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

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

№28 слайд
Коп ювання агрегат в class
Содержание слайда: Копіювання агрегатів 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; } // Як бути з нестачею пам'яті?

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

№31 слайд
Коп ювання присво нням class
Содержание слайда: Копіювання присвоєнням 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; }

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

№34 слайд
Вектори р зно довжини class
Содержание слайда: Вектори різної довжини 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; }

№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; }

№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; }

№39 слайд
Рядки з коп юванням class
Содержание слайда: Рядки з копіюванням 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; };

№41 слайд
Редагування ориг налу без
Содержание слайда: Редагування оригіналу (без 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; };

№43 слайд
Мультиконструктор коп ювання
Содержание слайда: Мультиконструктор копіювання 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; };

№45 слайд
Застосування коп ювання
Содержание слайда: Застосування копіювання // 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):…{…;} Чому?

№47 слайд
Некоректне коп ювання include
Содержание слайда: Некоректне копіювання #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&);

№49 слайд
Сигнатури присво нь Як й з
Содержание слайда: Сигнатури присвоєнь Якій з сигнатур віддати перевагу? 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&);

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

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

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

№54 слайд
Рядки з присво нням class
Содержание слайда: Рядки з присвоєнням 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
Содержание слайда: Присвоєння рядків 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, конструктори не повертають нічого (чому?)

Скачать все slide презентации Об&apos;єктне програмування. Копіювання об&apos;єктів. (Частина 1. Лекція 2) одним архивом: