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

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

Programowanie w C++ Wykład 8. Katarzyna Grzelak. 15 kwietnia K.Grzelak (Wykład 8) Programowanie w C++ 1 / 33

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

Programowanie w C++ Wykład 6. Katarzyna Grzelak. kwiecień K.Grzelak (Wykład 6) Programowanie w C++ 1 / 40

Programowanie w C++ Wykład 8. Katarzyna Grzelak. 7 maja K.Grzelak (Wykład 8) Programowanie w C++ 1 / 31

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

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

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

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

Wstęp do Programowania 2

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

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

Konstruktor kopiujacy

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

Programowanie w C++ Wykład 3. Katarzyna Grzelak. 12 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 35

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

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

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

Wstęp do Programowania 2

Programowanie komputerowe. Zajęcia 7

Programowanie obiektowe w C++ Wykład 12

Programowanie obiektowe

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

Programowanie obiektowe i C++ dla matematyków

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

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

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

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

Język C++ Różnice między C a C++

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Podstawy Programowania Obiektowego

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

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

Operacje wejścia/wyjścia odsłona pierwsza

PARADYGMATY PROGRAMOWANIA Wykład 3

Informatyka 2. Wykład nr 3 ( ) Politechnika Białostocka. - Wydział Elektryczny. dr inŝ. Jarosław Forenc

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.

wykład V uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C++ klasy i obiekty wykład V dr Jarosław Mederski Spis Język C++ - klasy

Operatory na rzecz typu TString

Wyliczanie wyrażenia obiekty tymczasowe

C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów

Plik klasy. h deklaracje klas

Programowanie w C++ Wykład 1. Katarzyna Grzelak. 26 luty K.Grzelak (Wykład 1) Programowanie w C++ 1 / 28

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 16 kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 27

Programowanie Obiektowe i C++

Wykład 8: klasy cz. 4

Wstęp do informatyki- wykład 12 Funkcje (przekazywanie parametrów przez wartość i zmienną)

TEMAT : KLASY DZIEDZICZENIE

Techniki programowania INP001002Wl rok akademicki 2017/18 semestr letni. Wykład 4. Karol Tarnowski A-1 p.

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

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

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

PARADYGMATY PROGRAMOWANIA Wykład 4

public: // interfejs private: // implementacja // składowe klasy protected: // póki nie będziemy dziedziczyć, // to pole nas nie interesuje

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

Projektowanie klas c.d. Projektowanie klas przykład

Zajęcia nr 4 Programowanie obiektowe konstruktory. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

Programowanie Obiektowe i C++

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

Programowanie obiektowe, wykład nr 7. Przegląd typów strukturalnych - klasy i obiekty - c.d.

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

Wykład 5: Klasy cz. 3

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

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

Wstęp do programowania

Przeciążenie operatorów

Techniki Programowania wskaźniki

Programowanie w C++ Wykład 4. Katarzyna Grzelak. 19 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 37

PARADYGMATY PROGRAMOWANIA Wykład 2

PROE wykład 3 klasa string, przeciążanie funkcji, operatory. dr inż. Jacek Naruniec

Język C++ wykład VIII

Wykład 1. Program przedmiotu. Programowanie Obiektowe (język C++) Literatura. Program przedmiotu c.d.:

Podstawy Programowania Obiektowego

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

C++ Przeładowanie operatorów i wzorce w klasach

Programowanie obiektowe i C++ dla matematyków

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

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

Mechanizm dziedziczenia

Zajęcia nr 2 Programowanie strukturalne. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

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

Programowanie w C++ Wykład 6. Katarzyna Grzelak. 1 kwietnia K.Grzelak (Wykład 6) Programowanie w C++ 1 / 43

Dziedziczenie jednobazowe, poliformizm

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

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 5

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy WSKAŹNIKI KLASOWE

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

Podstawy programowania skrót z wykładów:

Programowanie Obiektowo Zorientowane w języku c++ Konstruktory

Programowanie, część I

Programowanie w C++ Wykład 2. Katarzyna Grzelak. 5 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 41

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

Programowanie - wykład 4

Programowanie obiektowe. Dr hab. Inż. Marta Gładysiewicz-Kudrawiec Pokój 229 A1 Operatory new delete pliki-odczyt

Automatyczne tworzenie operatora = Integer2& operator=(const Integer& prawy) {

Programowanie w C++ Wykład 7. Katarzyna Grzelak. 23 kwietnia K.Grzelak (Wykład 7) Programowanie w C++ 1 / 40

Pola i metody statyczne

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM

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

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

Transkrypt:

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

Klasy cd K.Grzelak (Wykład 11) Programowanie w C++ 2 / 30

Klasy - powtórzenie Klasy typy definiowane przez użytkownika Klasy zawieraja dane składowe plus funkcje składowe (metody) K.Grzelak (Wykład 11) Programowanie w C++ 3 / 30

Podział na pliki.h i.cc Każda klasa w osobnym pliku (na ogół) W pliku nagłówkowym (rozszerzenie.h) definicja klasy W pliku.cc (lub.cpp,.cxx... ) definicje funkcji składowych K.Grzelak (Wykład 11) Programowanie w C++ 4 / 30

Plik nagłówkowy z definicja klasy Przykład: Wektor2D.h #ifndef WEKTOR2D_H #define WEKTOR2D_H class Wektor2D { public: Wektor2D(){} // konstruktor standardowy Wektor2D(double a1,double b1,double a2,double b2): x1(a1),y1(b1),x2(a2),y2(b2) { } // drugi konstr Wektor2D() { } // destruktor void ustaw(double a1, double b1, double a2, double b2); double dlugosc(); private: double x1,y1,x2,y2; }; #endif K.Grzelak (Wykład 11) Programowanie w C++ 5 / 30

Plik z definicjami funkcji składowych Przykład: Wektor2D.cc #include<cmath> #include "Wektor2D.h" void Wektor2D::ustaw(double a1, double b1, double a2, double b2){ x1=a1; y1=b1; x2=a2; y2=b2; } double Wektor2D::dlugosc(){ double d=sqrt((x2-x1)*(x2-x1) +(y2-y1)*(y2-y1)); return d; } K.Grzelak (Wykład 11) Programowanie w C++ 6 / 30

Główny program, użycie nowego typu zmiennej Przykład: prog.cc #include<iostream> #include "Wektor2D.h" using namespace std; int main(){ Wektor2D v1; v1.ustaw(0.5,0.2,1.5,0.8); Wektor2D v2(0.6,0.3,1.5,1.8); cout «v1.dlugosc() «endl; cout «v2.dlugosc() «endl; return 0; } K.Grzelak (Wykład 11) Programowanie w C++ 7 / 30

Przekazywanie obiektów danej klasy do funkcji...... w taki sam sposób jak w przypadku obiektów typu int, double,... : przez wartość (nie polecany sposób, bo kopiowanie potencjalnie dużych obiektów): void (Wektor2D v1); przez referencję (jeśli funkcja ma zmieniać obiekt): void (Wektor2D &v1); przez referencję (jeśli funkcja ma nie zmieniać obiektu): void (const Wektor2D &v1); K.Grzelak (Wykład 11) Programowanie w C++ 8 / 30

Funkcje składowe typu const Funkcja składowa z przydomkiem const gwarantuje, że jeśli będzie wywołana na rzecz jakiegoś obiektu, to go nie zmodyfikuje. Np. Funkcje zwracajace wartości danych składowych klasy powinny mieć przydomek const. double getx1() const; K.Grzelak (Wykład 11) Programowanie w C++ 9 / 30

Przyjaciele - Friends Klasa może zadeklarować kto jest jej przyjacielem = ma dostęp do prywatnych składników klasy. Konsystentniej deklarować przyjaciół w części publicznej. funkcje friend: class A{ //... friend double B::fun(const A& a); friend void globfun(const A& a); //... }; K.Grzelak (Wykład 11) Programowanie w C++ 10 / 30

Przyjaciele - Friends Klasa może zadeklarować kto jest jej przyjacielem = ma dostęp do prywatnych składników klasy. Konsystentniej deklarować przyjaciół w części publicznej. klasy friend: class A{ //... friend class B; }; K.Grzelak (Wykład 11) Programowanie w C++ 11 / 30

Konstruktor i destruktor Konstruktor to specjalna funkcja składowa wywoływana automatycznie przy tworzeniu obiektu, a destruktor funkcja składowa wywoływana przed likwidacja obiektu. Konstruktor nazywa się tak samo jak klasa Destruktor nazywa się tak samo jak klasa + falka przed nazwa. Przed nazwami konstruktora i destruktora nie ma żadnego typu wartości zwracanej; nie ma return K.Grzelak (Wykład 11) Programowanie w C++ 12 / 30

Konstruktor i destruktor Może być wiele konstruktorów, ale destruktor co najwyżej jeden. Konstruktor służy do inicjalizacji obiektu W treści programu nie widać że będzie wywoływany destruktor. Destruktor najczęściej używany gdy trzeba zwolnić pamięć ( operator delete ) K.Grzelak (Wykład 11) Programowanie w C++ 13 / 30

Konstruktor kopiujacy Konstruktor kopiujacy to specjalna funkcja składowa wywoływana gdy jest robiona kopia obiektu (jawnie lub niejawnie). Jawne kopiowanie: Wektor2D v1; Wektor2D v2(v1); Wektor2D v3=v1; Uwaga: W poniższej sytuacji NIE jest wywoływany konstruktor kopiujacy: Wektor2D v1(0.5,0.2,1.5,0.8); Wektor2D v2; v2=v1; K.Grzelak (Wykład 11) Programowanie w C++ 14 / 30

Konstruktor kopiujacy Konstruktor kopiujacy to specjalna funkcja składowa wywoływana gdy jest robiona kopia obiektu (jawnie lub niejawnie). Niejawne kopiowanie: w przypadku przesyłania argumentów do funkcji przez wartość, gdy funkcja zwraca obiekt przez wartość, wypełnianie vector a STL... K.Grzelak (Wykład 11) Programowanie w C++ 15 / 30

Konstruktor kopiujacy dla klasy Wektor2D } Wektor2D (const Wektor2D & source){ x1=source.x1; y1=source.y1; x2=source.x2; y2=source.y2; K.Grzelak (Wykład 11) Programowanie w C++ 16 / 30

Automatycznie generowany konstruktor, destruktor, konstruktor kopiujacy Jeżeli nie zdefiniujemy standardowego konstruktora, konstruktora kopiujacego lub destruktora na ogół zostana stworzone automatycznie. W wielu przypadkach jest to wystarczajace. Konstruktor kopiujacy jest najczęściej potrzebny gdy składnikiem klasy jest wskaźnik. K.Grzelak (Wykład 11) Programowanie w C++ 17 / 30

Przeładowanie operatorów K.Grzelak (Wykład 11) Programowanie w C++ 18 / 30

Przeładowanie operatorów Przeładowanie operatorów to przedefiniowanie standardowych operatorów: +,,, /,... tak, żeby działały dla obiektów danej klasy. Przykład Klasa Ulamek, reprezentujaca ułamek zwykły. Dodajemy dwa ułamki: Ulamek u3= dodaj(u1,u2); Lepiej zdefiniować własny (przeładowany) operator + Ulamek u3=u1+u2; K.Grzelak (Wykład 11) Programowanie w C++ 19 / 30

Przeładowanie operatora dodawania Definiowanie własnego operatora (np. dodawania) dla danej klasy = definiowanie nowej funkcji o nazwie operator+ Funkcja musi mieć nazwę operator+ Co najmniej jednym z argumentów nowej funkcji operator+ musi być obiekt danej klasy Gdy napiszemy Ulamek u=u1+u2; funkcja operator+ zostanie uruchomiona automatycznie Funkcja operator+ może być funkcja składowa klasy albo funkcja globalna K.Grzelak (Wykład 11) Programowanie w C++ 20 / 30

Fragmenty definicji klasy Ulamek gdy operator+ jest funkcja składowa klasy Ulamek: class Ulamek{ public: Ulamek(); Ulamek(int licznik, int mianownik); Ulamek operator+(const Ulamek& v1); void Wypisz(); private: int licznik; int mianownik; }; K.Grzelak (Wykład 11) Programowanie w C++ 21 / 30

Przeładowanie operatora dodawania klasy Ulamek gdy operator+ jest funkcja składowa klasy Ulamek: Ulamek Ulamek::operator+(const Ulamek & u1){ Ulamek u; u.licznik=licznik*u1.mianownik+u1.licznik*mianow u.mianownik=mianownik*u1.mianownik; return u; } Ulamek u1(1,2),u2(1,3); Od teraz: Ulamek u=u1+u2; Taka funkcję można też wywołać jak zwykła funkcję: Ulamek u = u1.operator+(u2); K.Grzelak (Wykład 11) Programowanie w C++ 22 / 30

Fragmenty definicji klasy Ulamek gdy operator+ jest funkcja globalna: class Ulamek{ public: Ulamek(); Ulamek(int licznik, int mianownik); void Wypisz(); friend Ulamek operator+(const Ulamek& u1, const Ulamek& u2); private: int licznik; int mianownik; }; K.Grzelak (Wykład 11) Programowanie w C++ 23 / 30

Przeładowanie operatora dodawania klasy Ulamek gdy operator+ jest funkcja globalna: Ulamek operator+(const Ulamek& u1, const Ulamek& u2){ Ulamek u; u.licznik=u1.licznik*u2.mianownik+u2.licznik*u1. u.mianownik=u1.mianownik*u2.mianownik; return u; } Ulamek u1(1,2),u2(1,3); Od teraz: Ulamek u=u1+u2; Taka funkcję można też wywołać jak zwykła funkcję: Ulamek u = operator+(u1,u2); K.Grzelak (Wykład 11) Programowanie w C++ 24 / 30

Jakie operatory można przedefiniować? Większość operatorów można przedefiniować Nie można przedefiniować:. :: Nie można przedefiniować symboli preprocesora # ## Nie można tworzyć nowych operatorów K.Grzelak (Wykład 11) Programowanie w C++ 25 / 30

Fragmenty definicji klasy Ulamek Jeśli ten sam operator jest zdefiniowany dwa razy : jako składowa klasy i jako funkcja globalna, to pierwszeństwo ma funkcja składowa klasy. class Ulamek{ public: Ulamek(); Ulamek(int licznik, int mianownik); void Wypisz(); Ulamek operator+(const Ulamek& v1); friend Ulamek operator+(const Ulamek& u1, const Ulamek& u2); friend ostream& operator«(ostream& os, const Ulamek& u1); friend istream& operator»(istream& is, Ulamek& u1); private: K.Grzelak (Wykład 11) Programowanie w C++ 26 / 30

Przeładowanie operatora «Wypisywanie zwykłego ułamka na ekran, dwie możliwości: 1) Zwykła funkcja Wypisz: void Wypisz(){ cout «licznik «/ «mianownik «endl; } 2) Przeładowany operator «ostream& operator«(ostream& os, const Ulamek& u1){ os «u1.licznik «/ «u1.mianownik «endl; return os; } K.Grzelak (Wykład 11) Programowanie w C++ 27 / 30

Przeładowanie operatora «Jeżeli operator «jest przeładowany, można napisać tak: Ulamek us3(5,4); cout «suma3= «us3 «endl; (Można też zawołać jak zwykła funkcję:) operator«(cout,us3); K.Grzelak (Wykład 11) Programowanie w C++ 28 / 30

Przeładowanie operatora» istream& operator»(istream& is, Ulamek& u1){ cout «Podaj ulamek «endl; cout «Licznik: ; is» u1.licznik; cout «Mianownik: ; is» u1.mianownik; if (!is) return is; } K.Grzelak (Wykład 11) Programowanie w C++ 29 / 30

Na koniec ciekawostka - cout Zapis którego standardowo używamy: int a=15; cout «a; Zapis funkcyjny: int a=15; cout.operator«(a); K.Grzelak (Wykład 11) Programowanie w C++ 30 / 30