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

Podobne dokumenty
Programowanie Obiektowe i C++

C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie C++ - DZIEDZICZENIE.

Wykład 8: klasy cz. 4

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

Język C++ Programowanie obiektowe

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

Dziedziczenie. Ogólna postać dziedziczenia klas:

PARADYGMATY PROGRAMOWANIA Wykład 4

PARADYGMATY PROGRAMOWANIA Wykład 2

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

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

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

Programowanie Obiektowe i C++

Kurs programowania. Wstęp - wykład 0. Wojciech Macyna. 22 lutego 2016

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

Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.

Podstawy Programowania Obiektowego

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

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

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

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

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

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

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

TEMAT : KLASY DZIEDZICZENIE

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

Dokumentacja do API Javy.

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

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

Dziedziczenie jednobazowe, poliformizm

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

Mechanizm dziedziczenia

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Programowanie obiektowe w języku

Zaawansowane programowanie w języku C++ Programowanie obiektowe

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

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

Dziedziczenie. dr Jarosław Skaruz

Materiały do zajęć VII

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

Wykład 4: Klasy i Metody

Polimorfizm, metody wirtualne i klasy abstrakcyjne

Automatyczne tworzenie operatora = Integer2& operator=(const Integer& prawy) { zdefiniuje. Integer::operator=(ri);

Zaawansowane programowanie w C++ (PCP)

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

Programowanie obiektowe

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

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

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy PRAWA PRZYJACIÓŁ KLASY. Dostęp z zewnątrz: Dostęp z wewnątrz:

Wykład 5: Klasy cz. 3

Programowanie komputerowe. Zajęcia 7

Podstawy programowania obiektowego

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

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

Zaawansowane programowanie w C++ (PCP)

EGZAMIN PROGRAMOWANIE II (10 czerwca 2010) pytania i odpowiedzi

Wstęp do Programowania 2

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy KONSTRUKTORY

Wprowadzenie do programowanie obiektowego w języku C++

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

Interfejsy i klasy wewnętrzne

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

> C++ dziedziczenie. Dane: Iwona Polak. Uniwersytet Śląski Instytut Informatyki

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

Programowanie obiektowe

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

Dziedziczenie. Tomasz Borzyszkowski

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

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

Aplikacje w środowisku Java

Rozdział 4 KLASY, OBIEKTY, METODY

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

Polimorfizm. dr Jarosław Skaruz

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

Programowanie obiektowe

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

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

Programowanie obiektowe - 1.

referencje Wykład 2. Programowanie (język C++) Referencje (1) int Num = 50; zdefiniowano zmienną Num (typu int) nadając jej wartość początkową 50.

Abstrakcyjny typ danych

C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie C++ - DZIEDZICZENIE.

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

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

Podstawy Programowania Obiektowego

Klasy abstrakcyjne, interfejsy i polimorfizm

Klasy. dr Anna Łazińska, WMiI UŁ Podstawy języka Java 1 / 13

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.

Programowanie, część I

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

Typy zmiennych proste i złożone. Programowanie komputerów. Tablica. Złożone typy zmiennych. Klasa. Struktura

Wykład 6: Dziedziczenie

Dziedziczenie. Streszczenie Celem wykładu jest omówienie tematyki dziedziczenia klas. Czas wykładu 45 minut.

Instrukcja do pracowni specjalistycznej z przedmiotu. Obiektowe programowanie aplikacji

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. Metody stałe w klasie

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

Programowanie obiektowe

Języki i paradygmaty programowania Wykład 2. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/18

Szablony klas, zastosowanie szablonów w programach

Enkapsulacja, dziedziczenie, polimorfizm

Podczas dziedziczenia obiekt klasy pochodnej może być wskazywany przez wskaźnik typu klasy bazowej.

Transkrypt:

Klasy Klasa jest nowym typem danych zdefiniowanym przez użytkownika Wartości takiego typu nazywamy obiektami Najprostsza klasa jest po prostu strukturą, np struct Zespolona { Klasy jako struktury z operacjami struct Zespolona { Zespolona dodaj(zespolona); double modul() ; Interfejs i implementacja Definicja klasy podaje tylko jej interfejs, trzeba jeszcze gdzieś podać jej implementację (definicje metod) Zespolona::modul() { return sqrt(re*re + im*im) ; Zespolona::dodaj(Zespolona z) { Zespolona w ; w.re = re + z.re ; w.im = im + z.im ; return z ; Ochrona prywatności Często chcemy chronić prywatne dane, a udostępniać tylko operacje z interfejsu 22

Mechanizm klas pozwala na to: class Zespolona { Zespolona dodaj(zespolona); double modul() ; W strukturze wszystkie składniki są dostępne; w klasie tylko te w części public. Metody w miejscu Proste metody możemy umieścić w samej definicji klasy, np class Zespolona { Zespolona dodaj(zespolona); double modul() {return sqrt(re*re + im *im); Zwykle kompilator wstawi treść takiej metody miejscu jej wywołania. Inicjalizacja Często chcemy aby stworzony obiekt miał od razu jakąś wartość. Dla prostych typów możemy napisać np. int i = 0; Dla klas rozwiązaniem są konstruktory: class Zespolona { //... Zespolona() {re = 0.0; im = 0.0; Zespolona(r,i) {re = r; im = i; Zespolona z1; Zespolona z2(2.0,3.0); Zespolona *z1 = new Zespolona(1.0,2.0); 23

Końcowe porzadki Zdarza się, że potrzebujemy, aby obiekt, zanim zniknie, posprzątał po sobie Np. w konstruktorze alokujemy pamięć: class Points { Point *t ; Points(int n){t = new Point[n]; //... Rozwiązaniem jest destruktor ~Point() {delete t[]; 24

Jeszcze o konstruktorach Konstruktor: ma nazwę taką jak klasa, nie ma typu wyniku, nie może przekazać wyniku instrukcją return, może wywoływać metody. Konstruktor bezargumentowy można go wywołać bez argumentów jest konieczny, jeśli chcemy mieć tablice elementów tej klasy jeśli nie zdefiniujemy żadnego konstruktora, kompilator wygeneruje domyślny konstruktor bezargumentowy konstruktor domyślny nie wykonuje żadnej inicjalizacji Uwaga: jeśli zdefiniujemy jakiś konstruktor, to konstruktor domyślny nie zostanie wygenerowany. Konstruktor domyślny przykład struct Error {char *what, *where, *why; class Zespolona { Zespolona(r,i) {re = r; im = i; Error e ; // Ok, konstruktor domyślny Zespolona z1; // Błąd, nie ma konstr. domyślnego Zespolona z2(2.0,3.0); // Ok Nie można teraz utworzyć niezainicjalizowanego obiektu klasy Zespolona. 25

Konstruktor kopiujacy ma jeden argument typu referencji do tej samej klasy, np. Zespolona(Zespolona&) ; jeśli go nie zdefiniujemy, kompilator go wygeneruje; wygenerowany konstruktor składowa po składowej, zatem zwykle nie nadaje się dla obiektów zawierających wskażniki; jest wywoływay niejawnie przy przekazywaniu argumentów i wyników funkcji. Obiekty tymczasowe Każde użycie konstruktora powoduje powstanie nowego obiektu. Można w ten sposób tworzyć obiekty tymczasowe. Np. jeśli mamy funkcję double policz(zespolona) ; możemy wywołać tak: Zespolona z(3,4); x = policz(z) ;...ale jeśli samo z nie jest nam potrzebne, to można i tak: x = policz(zespolona(3,4)) ; Utworzony obiekt tymczasowy będzie istniał tylko podczas wykonywania tej instrukcji. Ułatwianie sobie życia Jeśli chcemy zdefiniować liczby zespolone, które są w istocie rzeczywiste, możemy to uczynić tak: Zespolona jeden(1,0); Jeśli chcemy to robić często, warto dopisać konstruktor: class Zespolona {... Zespolona(double r) {re = r;im = 0; Prościej jednak użyć argumentu domyślnego: Zespolona(double r, double i=0)... 26

Konstruktor i Konwersja Istnienie konstruktora, który można wywołać z jednym argumentem ma dalsze konsekwencje. Poniższe wywołanie jest teraz poprawne: double policz(zespolona) ; x =policz(3) ; Innymi słowy zdefiniowanie w klasie K konstruktora, który można wywołać z jednym argumentem typu T, oznacza zdefiniowanie konwersji z T do K. Dziedziczenie Dziedziczenie jest jednym z najważniejszych elementów obiektowości Pozwala na pogodzenie dwóch sprzecznych dążeń: Hierarchie klas raz napisany i przetestowany program powinien pozostać w niezmienionej postaci programy wymagają stałego dostosowywania do zmieniających się wymagań użytkownika, sprzętowych itp. Dziedziczenie umożliwia tworzenie hierarchii klas. Klasy odpowiadają pojęciom w świecie modelowanym przez program. Hierarchie klas pozwalają tworzyć hierarchie pojęć, wyrażając w ten sposón zależności między pojęciami. Klasa pochodna dziedziczy po klasie bazowej; tworzymy ją by opisać bardziej wyspecjalizowane obiekty klasy bazowej. Każdy obiekt klasy pochodnej jest obiektem klasy bazowej. Zalety dziedziczenia Jawne wyrażanie zależności między klasami (pojęciami). Możemy np. jawnie zapisać, że każdy kwadrat jest prostokątem. Unikanie wielokrotnego pisania tych samych (lub podobnych) fragmentów kodu. 27

Przykładowa klasa bazowa class A { private: int m1; protected: int m2; int m3; Składowe zadeklarowane w sekcji protected są widoczne w podklasach (bezpośrednich i dalszych), nie są natomiast widoczne z zewnątrz. Przykładowa podklasa class B : public A { private: int m4; protected: int m5 ; int m6; void f(); Dziedziczenie jest oznaczane przy pomocy dwukropka. Występujące po nim public oznacza, że fakt dziedziczenia jest jawny (zwykle tego chcemy). Przykład użycia void B::f() { m1 = 1; // Błąd, składowa prywatna A m2 = 2; // OK, składowa chroniona A m3 = 3; // OK, składowa publiczna A m4=m5=m6 = 4; // OK, skladowe B main() { A a; B b; int i; 28

i = a.m1; // Błąd, składowa prywatna i = a.m2; // Błąd, składowa chroniona i = a.m3; // OK i = a.m6; // Nie ma takiej składowej i = b.m2; // Błąd, składowa chroniona i = b.m3; // OK (odziedziczone po A) i = b.m4; // Błąd, składowa prywatna i = b.m6; // OK Przyjaciele struct Z; // zapowiedź deklaracji struct Y { void f(x*) ; class X { int i ; // składowa prywatna friend void g(x*, int) // przyjaciel globalny friend void Y::f(X*) // zaprzyjaźniona metoda Y friend struct Z // Cała struktura jako przyjaciel Zaprzyjaźnione funkcje uzyskują dostęp do prywatnych skladowych danej klasy. Podsumowanie reguł dostępu Składowe prywatne są widoczne jedynie w swojej klasie i wśród przyjaciół Składowe chronione (protected) są ponadto widoczne w klasach pochodnych Składowe publiczne są widoczne wszędzie tam, gdzie jest widoczna sama klasa. Zastępowanie (overriding) W podklasach można deklarować składowe o takiej samej nazwie jak w nadklasach. W takim wypadku składowa podklasy zastępuje składową nadklasy. 29

class C { int a ; void f() ; class D: public C { int a ; void f() ; void C::f{ a=1; // Składowa C void D::f{ a=2; // Składowa D main { C c; D d; c.a = 3; // Składowa C d.a = 4 // Składowa D a.f() ; // Składowa C b.f() ; // Składowa D A *e = &d ; e->f() ; // Składowa C! Operator zasięgu Co zrobić, aby w podklasie odwołać się do zasłoniętej składowej nadklasy? Należy użyć operatora zasięgu (::), np. void D::f() { a = C::a; W podobny sposób można odwoływać się do zasłoniętych zmiennych globalnych: int i; void f(int i) { i = 3; // parametr ::i = 5; // zmienna globalna 30