Programowanie Obiektowe i C++

Podobne dokumenty
Operator przypisania. Jest czym innym niż konstruktor kopiujący!

Programowanie Obiektowe i C++

Klasa jest nowym typem danych zdefiniowanym przez użytkownika. Najprostsza klasa jest po prostu strukturą, np

Programowanie obiektowe w języku

Programowanie 2. Język C++. Wykład 3.

Składnia C++ Programowanie Obiektowe Mateusz Cicheński

Składnia C++ Programowanie Obiektowe Mateusz Cicheński

Programowanie w C++ Wykład 14. Katarzyna Grzelak. 3 czerwca K.Grzelak (Wykład 14) Programowanie w C++ 1 / 27

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi

Wstęp do Programowania 2

Programowanie obiektowe

Programowanie w C++ Wykład 12. Katarzyna Grzelak. 28 maja K.Grzelak (Wykład 12) Programowanie w C++ 1 / 27

1 Atrybuty i metody klasowe

Programowanie w C++ Wykład 11. Katarzyna Grzelak. 13 maja K.Grzelak (Wykład 11) Programowanie w C++ 1 / 30

Dziedziczenie. Ogólna postać dziedziczenia klas:

Wykład 8: klasy cz. 4

PROGRAMOWANIE OBIEKTOWE W C++ cz. 2. Dziedziczenie, operacje wej cia-wyj cia, przeładowanie operatorów.

Programowanie obiektowe w C++ Wykład 12

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016

Wykład 4: Klasy i Metody

Język C++ wykład VII. uzupełnienie notatek: dr Jerzy Białkowski. Programowanie C/C++ Język C++ wykład VII. dr Jarosław Mederski. Spis.

Podstawy Programowania Obiektowego

Programowanie w C++ Wykład 13. Katarzyna Grzelak. 4 czerwca K.Grzelak (Wykład 13) Programowanie w C++ 1 / 26

Język C++ Programowanie obiektowe

Paradygmaty programowania. Paradygmaty programowania

Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static),

Polimorfizm, metody wirtualne i klasy abstrakcyjne

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Konstruktor kopiujacy

Zaawansowane programowanie w C++ (PCP)

Plik klasy. h deklaracje klas

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;

Wstęp do programowania obiektowego. WYKŁAD 3 Dziedziczenie Pola i funkcje statyczne Funkcje zaprzyjaźnione, this

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

Programowanie obiektowe

Wykład V. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

Konstruktory. Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut.

PARADYGMATY PROGRAMOWANIA Wykład 3

Programowanie obiektowe i C++ dla matematyków

Programowanie Obiektowo Zorientowane w języku C++ Klasy, pola, metody

Definicje klas i obiektów. Tomasz Borzyszkowski

2. Klasy cz. 2 - Konstruktor kopiujący. Pola tworzone statycznie i dynamicznie - Funkcje zaprzyjaźnione - Składowe statyczne

Programowanie współbieżne Wykład 8 Podstawy programowania obiektowego. Iwona Kochaoska

TEMAT : KLASY DZIEDZICZENIE

Programowanie obiektowe Wykład 3. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/21

Programowanie obiektowe - Przykładowe zadania egzaminacyjne (2005/2006)

Programowanie, część I

Programowanie i struktury danych

Materiały do zajęć VII

PARADYGMATY PROGRAMOWANIA Wykład 4

W2 Wprowadzenie do klas C++ Klasa najważniejsze pojęcie C++. To jest mechanizm do tworzenia obiektów. Deklaracje klasy :

2.4 Dziedziczenie. 2.4 Dziedziczenie Przykłady programowania w C - kurs podstawowy

Podstawy Programowania Obiektowego

dr inż. Jarosław Forenc

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Wstęp do programowania obiektowego, wykład 7

Laboratorium nr 12. Temat: Struktury, klasy. Zakres laboratorium:

Referencje do zmiennych i obiektów

Programowanie 2. Język C++. Wykład 9.

Mechanizm dziedziczenia

Programowanie, część I

Kurs programowania. Wykład 3. Wojciech Macyna. 22 marca 2019

EGZAMIN 2 (14 WRZEŚNIA 2015) JĘZYK C++

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Wstęp do Programowania 2

Programowanie obiektowe w języku C++ dr inż. Jarosław Forenc

Programowanie w C++ Wykład 12. Katarzyna Grzelak. 20 maja K.Grzelak (Wykład 12) Programowanie w C++ 1 / 32

Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta Strona 1 z 26. Powrót. Full Screen. Zamknij.

Stos liczb całkowitych

Wprowadzenie w dziedziczenie. Klasa D dziedziczy klasę B: Klasa B klasa bazowa (base class), klasa D klasa pochodna (derived class).

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 3. Karol Tarnowski A-1 p.

KLASY cz4. Dorota Pylak. destruktory składowe statyczne przeciążanie operatorów. wskaźniki

Zaawansowane programowanie w C++ (PCP)

Programowanie Obiektowew języku C++ Zadania L4

PROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec

Definiowanie własnych klas

Szablony klas, zastosowanie szablonów w programach

Rozdział 4 KLASY, OBIEKTY, METODY

ZASADY PROGRAMOWANIA KOMPUTERÓW

Przeciążenie operatorów

Projektowanie obiektowe. Roman Simiński Wzorce projektowe Wybrane wzorce strukturalne

Dziedziczenie & W slajdach są materiały zapożyczone z

Java. język programowania obiektowego. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

Różne właściwości. Różne właściwości. Różne właściwości. C++ - klasy. C++ - klasy C++ - KLASY

Polimorfizm. dr Jarosław Skaruz

Programowanie obiektowe, wykład nr 6. Klasy i obiekty

Programowanie obiektowe Wykład 6. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/14

Zaawansowane programowanie w języku C++ Programowanie obiektowe

Zaawansowane programowanie w języku C++ Klasy w C++

Enkapsulacja, dziedziczenie, polimorfizm

Język C++ zajęcia nr 2

Instytut Mechaniki i Inżynierii Obliczeniowej Wydział Mechaniczny Technologiczny Politechnika Śląska

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

wykład IV uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C, a C++. wykład IV dr Jarosław Mederski Spis Język C++ - wstęp

Przypomnienie o klasach i obiektach

Programowanie obiektowe w języku C++ Zarządzanie procesami. dr inż. Jarosław Forenc. Przeładowanie (przeciążanie) operatorów

Abstrakcyjny typ danych

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy INNE SPOSOBY INICJALIZACJI SKŁADOWYCH OBIEKTU

Transkrypt:

Programowanie Obiektowe i C++ Marcin Benke Instytut Informatyki UW 6.11.2006 Marcin Benke (IIUW) Programowanie Obiektowe i C++ 6.11.2006 1 / 138

Operator przypisania Jest czym innym niż konstruktor kopiujacy! Domyślnie jest zdefiniowany jako przypisanie składowa po składowej (zatem niekoniecznie bajt po bajcie). Dla klasy X definiuje się jako X& operator=(const X&); Uwaga na przypisania x = x. Jeśli chcemy dla danej klasy zablokować przypisania, najlepiej zdefiniować operator= w części prywatnej (jako pusty). Marcin Benke (IIUW) Programowanie Obiektowe i C++ 6.11.2006 2 / 138

Przykład struct napis { char *p; int rozmiar; // rozmiar tablicy napis(int r){p = new char[rozmiar=r];}; ~napis(){delete p;}; }; void f() { napis n1(10); napis n2(20); n1 = n2; } Pamięć n2 nie zostanie zwolniona (wyciek pamięci). Pamięć n1 zostanie zwolniona dwukrotnie (groźne). Zmiana zawartości n1 automatycznie zmieni zawartość n2. Marcin Benke (IIUW) Programowanie Obiektowe i C++ 6.11.2006 3 / 138

Rozwiazanie Musimy zdefiniować operator przypisania napis& operator=(const napis& n) { if(this!= &n) { // uważaj na n=n delete p; p = new char[rozmiar=n.rozmiar]; strcpy(p, n.p); } return *this; } Marcin Benke (IIUW) Programowanie Obiektowe i C++ 6.11.2006 4 / 138

Przypisanie vs inicjalizacja Rozważmy drobna modyfikację funkcji f void f() { napis n1(10); napis n2 = n1; } Wbrew pozorom n2=n1 nie oznacza tu przypisania, lecz inicjalizację. Tutaj wykona się konstruktor kopiujacy. Inaczej zwalnialibyśmy niezaalokowana pamięć. Marcin Benke (IIUW) Programowanie Obiektowe i C++ 6.11.2006 5 / 138

Operator indeksowania Wyrażenie wyrażenie1[wyrażenie2] interpretuje się jako operator dwuargumentowy. Zatem wyrażenie x[y] interpretuje się jako Na przykład x.operator[ ](y) char napis::operator[](int i) { if(i<rozmiar) return p[i] ; else return 0 ; } Marcin Benke (IIUW) Programowanie Obiektowe i C++ 6.11.2006 6 / 138

Jeszcze o operatorze indeksowania Argument operatora indeksowania nie musi być typu liczbowego, np. int napis::operator[](const char *n) { // Znajdź pierwsze wystąpienie n i daj jego indek // Jeśli n nie występuje, daj -1 } Marcin Benke (IIUW) Programowanie Obiektowe i C++ 6.11.2006 7 / 138

Operator wywołania funkcji Wyrażenie wyrażenie(lista wyrażeń] interpretuje się jako operator dwuargumentowy, gdzie wyrażenie jest pierwszym argumentem, a lista wyrażeń drugim. Zatem wyrażenie x(y) interpretuje się jako x.operator( )(y) W praktyce używa się tylko operator()(), dla klas z jedna operacja. Marcin Benke (IIUW) Programowanie Obiektowe i C++ 6.11.2006 8 / 138

Przykład struct K { int operator()() {return 1 ;}; int operator()(int a1) {return a1 ;}; int operator()(int a1,int a2) {return a1+a2 ;}; } ; main() { K k ; cout << k() << endl; cout << k(k()) << endl ; cout << k(k(),k(k())) << endl ; } Marcin Benke (IIUW) Programowanie Obiektowe i C++ 6.11.2006 9 / 138

Iteratory Rozważmy klasę reprezentujac a listy: class Elem { int glowa ; Elem* ogon ; public: Elem(int g,elem* o):glowa(g),ogon(o){}; friend class Iterator ; }; Chcielibyśmy móc przechodzić po liście tak łatwo, jak po tablicy... Marcin Benke (IIUW) Programowanie Obiektowe i C++ 6.11.2006 10 / 138

Iteratory Wygodnym rozwiazaniem jest iterator: struct Iterator { Elem* lista; Iterator(Elem* el):lista(el){}; int operator()(){ if(!lista) return 0; int g=lista->glowa; lista=lista->ogon; return g; } }; for(i=iterator(el);k=i();)... Marcin Benke (IIUW) Programowanie Obiektowe i C++ 6.11.2006 11 / 138

Operatory konwersji Sa metodami o nazwie operator nazwa_typu nie deklarujemy typu wyniku, bo musi być taki sam jak w nazwie operatora, musi instrukcja return przekazywać obiekt odpowiedniego typu Marcin Benke (IIUW) Programowanie Obiektowe i C++ 6.11.2006 12 / 138

Dziedziczenie public, protected i private Sposób dziedziczenia określa gdzie dziedziczenie jest widoczne Wpływa na możliwość użycia obiektu podklasy jako nadklasy oraz Determinuje widoczność składowych nadklasy. public widoczne wszędzie (zwykle tego chcemy) protected tylko w podklasach private nigdzie Dla klas domyślne jest private Marcin Benke (IIUW) Programowanie Obiektowe i C++ 6.11.2006 13 / 138

Przykład... ilustrujacy również co się stanie jeśli zapomnimy public: class X { public: int a; }; class Y : X // Domyślne dziedziczenie: private int f() { return a; } // BŁĄD! ; X *px = new X; Y *py = new Y; cout << px->a; // OK cout << py->a; // BŁĄD! px = new Y; // BŁĄD! Marcin Benke (IIUW) Programowanie Obiektowe i C++ 6.11.2006 14 / 138

Przykład class X { public: int a; }; class Z : protected X { public: int f() { return a; } // OK X* asx { return (X*) this; } }; X *px = new X; Z *pz = new Z; cout << px->a; // OK cout << py->a; // BŁĄD! px = pz; // BŁĄD! px = pz->asx(); // OK Marcin Benke (IIUW) Programowanie Obiektowe i C++ 6.11.2006 15 / 138

Wielodziedziczenie W C++ klasa może mieć więcej niż jedna klasę podstawowa. Konstrukcję taka nazywamy wielodziedziczeniem. Często jest to użyteczne, czasem prowadzi do problemów. Wiele innych języków (np. Java, Smalltalk) nie dopuszcza wielodziedziczenia (lub tylko jego okrojona formę). Marcin Benke (IIUW) Programowanie Obiektowe i C++ 6.11.2006 16 / 138

Klasa Square reprezentujaca kwadrat: zna swoje położenie, wymiary i kolor umie się narysować w danym oknie class Square { public: Square(int x, int y, int a, Rgb col) : m_x(x),m_y(y),m_a(a),m_col(col) {}; void draw(mwindow& win) ; protected: int m_x, m_y, m_a; Rgb m_col ; }; Marcin Benke (IIUW) Programowanie Obiektowe i C++ 6.11.2006 17 / 138

Klasa Gadget: reaguje na kliknięcie mysza umie (potencjalnie) się narysować umie zmienić swoje położenie może zawierać inne Gadgety class Gadget { Gadget(); virtual void onclick(int x, int y); virtual void paint(mwindow& win) ; virtual void move(int dx,int dy); Gadget& operator+=(gadget* c); Gadget& operator+=(gadget& c); }; Marcin Benke (IIUW) Programowanie Obiektowe i C++ 6.11.2006 18 / 138

Kwadrat reagujacy na kliknięcie: class GSquare : public Square, public Gadget { public: GSquare(int x, int y, int a, Rgb col) : Square(x,y,a,col),Gadget(){} void paint(mwindow& w) {draw(w);} void move(int dx,int dy){m_x+=dx;m_y+=dy;} }; Klasa GSquare dziedziczy po klasach Square oraz Gadget. Gadget allgadgets; allgadgets += new GSquare(0,0,20,red); Marcin Benke (IIUW) Programowanie Obiektowe i C++ 6.11.2006 19 / 138

Problem class Scrollbar { private: int x; int y; public: void scroll(units n); }; class HorizontalScrollbar : public Scrollbar {}; class VerticalScrollbar : public Scrollbar {}; class ScrollWindow : public VerticalScrollbar, public HorizontalScrollbar {}; ScrollWindow w; w.scroll(5); // BŁĄD! Marcin Benke (IIUW) Programowanie Obiektowe i C++ 6.11.2006 20 / 138

Przykład class Scrollbar { private: int x; int y; public: void scroll(units n); }; class HorizontalScrollbar : public Scrollbar {}; class VerticalScrollbar : public Scrollbar {}; class ScrollWindow : public VerticalScrollbar, public HorizontalScrollbar {}; ScrollWindow w; w.horizontalscrollbar::scroll(5); // w prawo w.verticalscrollbar::scroll(12); //...i w dół Marcin Benke (IIUW) Programowanie Obiektowe i C++ 6.11.2006 21 / 138

Składowe klasowe (statyczne) Każdy obiekt klasy posiada własny zestaw atrybutów. Metody używaja atrybutów odpowiedniego obiektu. Czasem potrzeba atrybutów wspólnych dla wszystkich obiektów danej klasy (i ew. odpowiednich metod). Do tego celu służa atrybuty i metody statyczne (klasowe). Marcin Benke (IIUW) Programowanie Obiektowe i C++ 6.11.2006 22 / 138

Przykład struct Licznik { static int ile; // Ile aktywnych obiektów klasy Licznik(){ ile++; } ~Licznik(){ ile--; } }; int Licznik::ile=0; main() { Licznik l ; Licznik* l2 = new Licznik(); cout << Licznik::ile <<endl; cout << l.ile <<endl; } Marcin Benke (IIUW) Programowanie Obiektowe i C++ 6.11.2006 23 / 138

Zauważmy, że: Zmienna ile jest wspólna dla wszystkich obiektów klasy licznik. Jej deklaracja jest wewnatrz klasy, ale definicja jest globalna. Dostęp jest możliwy zarówno przez operator zasięgu, jak i dowolny obiekt klasy. Marcin Benke (IIUW) Programowanie Obiektowe i C++ 6.11.2006 24 / 138

Metody klasowe class Licznik { static int licz; // Ile aktywnych obiektów klas public: Licznik(){ licz++; } ~Licznik(){ licz--; } static int ile() { return licz; } }; int Licznik::licz=0; main(){ Licznik l ; Licznik* l2 = new Licznik(); } cout << Licznik::ile() <<endl; cout << l.ile() <<endl; Marcin Benke (IIUW) Programowanie Obiektowe i C++ 6.11.2006 25 / 138