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

Podobne dokumenty
Programowanie Obiektowo Zorientowane w języku c++ Konstruktory

Programowanie Obiektowew języku C++ Zadania L4

Programowanie Obiektowew języku C++ Zadania L4

Wykład 8: klasy cz. 4

Podstawy programowania w języku C++ Zadania - dziedziczenie i polimorfizm

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

Programowanie Obiektowo Zorientowane w języku c++ Przestrzenie nazw

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

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

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

Wstęp do Programowania 2

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

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

Do czego służą klasy?

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

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

Wstęp do programowania obiektowego. Wykład 2

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

Programowanie Obiektowew języku C++ Zadania L2

TEMAT : KLASY DZIEDZICZENIE

Podstawy Programowania Obiektowego

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

Programowanie Obiektowew języku C++ Zadania L9

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

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

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

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

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

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

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

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

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

KLASY cz.1. Dorota Pylak

Podstawy programowania w języku C++ Zadania

Do czego służą klasy?

Programowanie Obiektowew języku C++ Zadania L2

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

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

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

Pola i metody statyczne. Klasy zawierające pola i metody statyczne

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

Język C++ Programowanie obiektowe

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

PARADYGMATY PROGRAMOWANIA Wykład 2

Programowanie Obiektowew języku C++ Zadania L8

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.

Języki i paradygmaty programowania

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

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

Wstęp do programowania

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

Dziedziczenie jednobazowe, poliformizm

Programowanie obiektowe w C++ Wykład 12

Rozdział 4 KLASY, OBIEKTY, METODY

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

dr inż. Jarosław Forenc

Programowanie Obiektowe i C++

Wykład 5: Klasy cz. 3

Materiały do zajęć VII

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:

PARADYGMATY PROGRAMOWANIA Wykład 4

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

EGZAMIN PROGRAMOWANIE II (10 czerwca 2010) pytania i odpowiedzi

Programowanie proceduralne w języku C++ Funkcje

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

tel Konsultacje www

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

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

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

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

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

Wyliczanie wyrażenia obiekty tymczasowe

Dziedziczenie. Ogólna postać dziedziczenia klas:

Nowe słowa kluczowe. Komentarze. Wskaźniki typu void. class, delete, new, friend,... /* Komentarz w C i C++ */ // Komentarz w C++ (do końca wiersza)

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

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

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.

Programowanie, część I

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

Programowanie Obiektowe i C++

Podstawy Programowania Obiektowego

Podstawy algorytmiki i programowania - wykład 4 C-struktury

Wstęp do Programowania 2

Język C++ zajęcia nr 2

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

Wykład 4: Klasy i Metody

Obsługa wyjątków. Język C++ WW12

Podstawy Programowania Obiektowego

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

Mechanizm dziedziczenia

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

Konstruktor kopiujacy

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

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

PARADYGMATY PROGRAMOWANIA Wykład 3

Programowanie obiektowe. Materiały przygotował: mgr inż. Wojciech Frohmberg

Laboratorium 1 - Programowanie proceduralne i obiektowe

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

Transkrypt:

Programowanie Obiektowo Zorientowane w języku C++ Klasy, pola, metody Mirosław Głowacki 1 1 Akademia Górniczo-Hutnicza im. Stanisława Staszica w Ktrakowie Wydział Inżynierii Metali i Informatyki Stosowanej Katedra Informatyki Stosowanej i Modelowania Grudzień 2015 / Lipiec 2018 Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2015/2018 1 / 39

Spis treści 1 Programowanie obiektowe, a język C++ 2 Pojęcie klasy i składniki klas 3 Pola klas 4 Metody klas 5 Konstruktory i destruktory 6 Dostęp do składników klas 7 Definiowanie obiektów klas 8 Przykładowy program obiektowo zorientowany Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2015/2018 2 / 39

Spis treści 1 Programowanie obiektowe, a język C++ 2 Pojęcie klasy i składniki klas 3 Pola klas 4 Metody klas 5 Konstruktory i destruktory 6 Dostęp do składników klas 7 Definiowanie obiektów klas 8 Przykładowy program obiektowo zorientowany Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2015/2018 3 / 39

Standarty języka C++ Podstawową cechą programowania obiektowo zorientowanego jest możliwość definiowania własnych typów, które czerpią zasoby z typów wcześniej zdefiniowanych. W języku C++ są to tzw. klasy, które charakteryzują się obecnością zmiennych i funkcji, które te zmienne obsługują. Język C++ jest językiem zarówno proceduralnym jak i obiektowo zorientowanym i podlegał w przeszłości modyfikacjom - możemy mówić o: pierwszej wersji języka - C++98, standarcie C++03, który stanowił pierwszą jego aktualizację, standarcie C++11 obecnie chętnie stosowanym ze względu na wprowadzone udogodnienia dla programistów, standarcie C++14 będący podstawą szeregu kompilatorów, standarcie C++17 będący podstawą nielicznych jeszcze kompilatorów, C++20, który jest na razie nieformalnym następcą C++17 Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2015/2018 4 / 39

Spis treści 1 Programowanie obiektowe, a język C++ 2 Pojęcie klasy i składniki klas 3 Pola klas 4 Metody klas 5 Konstruktory i destruktory 6 Dostęp do składników klas 7 Definiowanie obiektów klas 8 Przykładowy program obiektowo zorientowany Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2015/2018 5 / 39

Pojęcie klasy Na początek zapoznamy się ze standartem C++03, który jest pewnym kompromisem pomiędzy złożonością języka, a jego funkcjonalnością i przetrwał bez zmian przez niemal 10 lat. Definicja nowego typu rozpoczyna się słowem kluczowym class po którym następuje nazwa klasy i blok definicji klasy {}; class punkt{ double x, y; double fun(){return x*y;} }; Kolejność składników jest w zasadzie dowolna. Klasy zawierają dwa rodzaje składników: pola - zmienne deklarowane wewnątrz klasy, metody - funkcje deklarowane wewnątrz klasy. Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2015/2018 6 / 39

Spis treści 1 Programowanie obiektowe, a język C++ 2 Pojęcie klasy i składniki klas 3 Pola klas 4 Metody klas 5 Konstruktory i destruktory 6 Dostęp do składników klas 7 Definiowanie obiektów klas 8 Przykładowy program obiektowo zorientowany Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2015/2018 7 / 39

Pola zwykłe Pola zwykłe są składnikami klas o wartościach różnych dla poszczególnych obiektów klasy class punkt{ double x, y; int nrpunktu; int *wsk; float &ref; }; Składniki takie moga być definiowane przez: wartości, wskaźniki lub referencje W ostatnim przypadku musi nastapic inicjalizacja na liscie inicjalizacyjnej konstruktora Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2015/2018 8 / 39

Pola statyczne Innym rodzajem pól klasy są pola statyczne są składnikami klas o tych samych wartosciach dla poszczególnych obiektów klasy class punkt{ static int maxliczbapunktow; static int nrkolpunktu; static int lpunktow; }; int punkt::maxliczbapunktow = 50; int punkt::nrkolpunktu = 0; int punkt::lpunktow; Składniki takie są inicjalizowane w obszarze globalnym nawet jeśli są prywatne Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2015/2018 9 / 39

Pola typu const i volatile Niektóre klasy mogą być wyposażone w pola stałe lub pola typu volatile class punkt{ const double constliczbapi; volatile double volatemp; }; Specyfikacja const to obietnica niezmienności pola obiektu Słowo kluczowe volatile to konieczność każdorazowego pobierania obiektów z pamięci, nawet jeśli znajduje się jeszcze w pamięci podręcznej procesora. Metody (funkcje składowe) pracujące dla obiektów typu const i volatile muszą zadośćuczynić tym wymaganiom. Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2015/2018 10 / 39

Spis treści 1 Programowanie obiektowe, a język C++ 2 Pojęcie klasy i składniki klas 3 Pola klas 4 Metody klas 5 Konstruktory i destruktory 6 Dostęp do składników klas 7 Definiowanie obiektów klas 8 Przykładowy program obiektowo zorientowany Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2015/2018 11 / 39

Metody Metody to funkcje deklarowane w ciele klasy, które mają za zadanie pracę na rzecz obiektów danej klasy class punkt{ double getx(); int getnrp(); }; Metody mogą być nie tylko deklarowane w ciele klasy, ale również tam definiowane double getx(){return x;} int getnrp(){return nrpunktu;} W takim przypadku są one typu inline, a więc nie podlegają ogólnej konwencji wywołań funkcji, a ich kod jest wplatany w kod programu Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2015/2018 12 / 39

Metody zwykłe Innym sposobem jest definiowanie metod poza klasą - metody muszą mieć nazwy kwalifikowane nazwami klas, z których pochodzą double punkt::odl(punkt p){ double dx = p.x - x; double dy = p.y - y; return sqrt(dx*dx + dy*dy); } Metody zwykłe pracują zawsze na rzecz obiektów int main(){ punkt p1, p2(3., 4.); cout << "Odleglosc p1 i p2 " << p1.odl(p2) << endl; return 0; } Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2015/2018 13 / 39

Metody zwykłe W zamieszczonym przykładzie metoda odl pracowała na rzecz obiektu p1 typu punkt mając za argument obiekt p2 również typu punkt Gwoli ścisłości, to metodę tę należałoby zdefiniować następująco: double punkt::odl(punkt p){ double dx = p.x - this->x; double dy = p.y - this->y; return sqrt(dx*dx + dy*dy); } W powyższym kodzie this jest wskaźnikiem do obiektu, na rzecz którego metoda pracuje - jest to pierwszy, niejawny parametr metody. W ciele metody sekwencję this-> można opuścić (np. zamiast this->x napisać x ), a kompilator sam ją uzupełni. Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2015/2018 14 / 39

Metody typu const i volatile Metody pracujące dla obiektów typu const i volatile muszą zadośćuczynić wymaganiom tych obiektów i są definiowane jako: double metord(){return x;} double metconst() const {return y;} double metvola() volatile {return z;} Metoda metconst() może pracować zarówno na rzecz obiektu stałego jak i takiego, który stałym nie jest - metoda zwykła tylko na rzecz tego drugiego W analogiczny sposób zachowuje się metoda metvola() punkt p; const punkt cp; volatile punkt vp; double d1 = p.metconst() + cp.metconst(); double d2 = p.metvola() + vp.metvola(); double d3 = p.metord() + cp.metord() + vp.metord(); Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2015/2018 15 / 39

Metody statyczne Metody klasy mogą być zadeklarowane jako statyczne - można je wywołać nawet wtedy, gdy nie istnieje jeszcze żaden obiekt klasy. class punkt{ static int lpunktow; static int ilepunktow(){return lpunktow;} }; int punkt::lpunktow = 0; int main(){ int ilp = punkt::ilepunktow(); punkt p1; int ilpteraz = p1.ilepunktow() return 0; } Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2015/2018 16 / 39

Metody statyczne Do nazwy metody statycznej z zewnątrz klasy odwołujemy się poprzez: nazwę klasy za pomocą operatora zasięgu :: punkt::ilepunktow(); nazwę obiektu za pomocą operatora wyboru składowej. - wtedy nie ma znaczenia, jakiego obiektu tej klasy użyjemy. punkt p1; int ilpteraz = p1.ilepunktow() Ponieważ funkcja statyczna nie jest wywoływana na rzecz obiektu, ale na rzecz klasy nie można w niej odwoływać się do wskaźnika this ani do żadnych składowych niestatycznych. Funkcje statyczne klasy należą jednak do zakresu klasy i mają zatem bezpośredni dostęp do nazw z zakresu tej klasy (również prywatnych). Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2015/2018 17 / 39

Metody operatorowe Definicje tych metod, nie różnią się niczym szczególnym od definicji metod zwykłych poza szczególną nazwą. Składa się ona ze słowa kluczowego operator i nastepującego po nim symbolu operacji. class punkt{ double x, y; public: punkt operator+(punkt); }; punkt punkt::operator+(punkt p){ punkt rezultat; rezultat.x = this->x + p.x; rezultat.y = this->y + p.y; return rezultat; } Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2015/2018 18 / 39

Metody operatorowe Pozwala to na szczególny sposób używania tych metod (a także operatorowych funkcji globalnych), gdzie argumenty nie są przesyłane w nawiasach lecz stoją po lewej i/lub prawej stronie symbolu operacji: int main(){ punkt p1(1., -1.); punkt p2(2., 3.); punkt p = p1 + p2; return 0; } Przedostatnia linika kodu pokazuje, że ten typ wywołań przypomina wywołania znane dla typów wbudowanych. Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2015/2018 19 / 39

Spis treści 1 Programowanie obiektowe, a język C++ 2 Pojęcie klasy i składniki klas 3 Pola klas 4 Metody klas 5 Konstruktory i destruktory 6 Dostęp do składników klas 7 Definiowanie obiektów klas 8 Przykładowy program obiektowo zorientowany Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2015/2018 20 / 39

Konstruktory W klasie są deklarowane również szczególne metody zwane konstruktorami, które mają dwie charakterystyczne cechy: nazwę identyczną z nazwą klasy, brak specyfikacji wartości zwracanej. Wynika to z faktu, iż są one wywoływane w sposób automatyczny w momencie, kiedy powstaje nowy obiekt danej klasy. Przykład konstruktora klasy punkt przedstawia kod programu: punkt::punkt(): opis("konstruktor domyslny"){ x = 0.; y = 0.; lpunktow++; nrpunktu = ++nrkolpunktu; } Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2015/2018 21 / 39

Konstruktory Klasa musi mieć konstruktor - jeśli żaden nie został zdefiniowany, to system dostarczy własny konstuktor domyślny (inaczej domniemany), który: jest publiczny, nie ma żadnych parametrów, nie wykonuje żadnych czynności. Jeśli jakikolwiek konstruktor został w klasie zdefiniowany, to konstruktor domyślny nie będzie kreowany automatycznie. Konstruktor jest konstruktorem domyślnym wtedy i tylko wtedy gdy może być wywołany bez żadnych argumentów. Konstruktora domyślny może również posiadać parametry, ale wszystkie muszą być wyposażone w wartości domyślne punkt::punkt(double x0 = 0., double y0 = 0.); Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2015/2018 22 / 39

Konstruktor kopiujący W klasie będa deklarowane również konstruktory kopiujące, które charakteryzują się cechami: ich jedynym parametrem jawnym jest parametr własnego typu, parametr musi być referencją. Wynika to z faktu, iż są one wywoływane w sposób automatyczny w momencie, tworzona jest kopia obiektu danej klasy. Przykład konstruktora klasy punkt przedstawia kod programu: punkt(const punkt& wzor): opis("konstruktor kopiujacy"){ x = wzor.x; y = wzor.y; lpunktow++; nrpunktu = ++nrkolpunktu; } Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2015/2018 23 / 39

Destruktory Prócz konstruktorów można również zdefiniować w klasie destruktor. Destruktora można czasem w ogóle nie definiować. Jeśli jednak destruktor definiujemy, to jego nazwą jest nazwa klasy poprzedzona znakiem tyldy. punkt::~punkt(){ lpunktow--; } Tak jak to miało miejsce w przypadku konstruktorów, definiując destruktor nie podaje się żadnego typu zwracanego, nawet void. Destruktor musi być bezparametrowy, nie może być zatem przeciążany. Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2015/2018 24 / 39

Destruktory Destruktor jest wywoływany na rzecz obiektu automatycznie podczas destrukcji tego obiektu przez system Sam destruktor obiektu nie niszczy! Gdy sterowanie wychodzi z bloku, stos jest zwijany do stanu, w jakim był przy wejściu do danego bloku (funkcji) Usunięte zatem zostaną wszystkie zmienne utworzone na stosie w tym bloku, wśród nich również zmienne obiektowe. Obiekty lokalne funkcji main() są niszczone po wyjściu z tej funkcji - wtedy dopiero wywoływane są dla tych obiektów destruktory, w kolejności odwrotnej do tej, w jakiej były tworzone. Obiekty wykreowane za pomocą operatora new na stercie nie są niszczone automatycznie - programista musi pamiętać, aby wywołać operator delete podając jako argument wskaźnik do obiektu na stercie. Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2015/2018 25 / 39

Spis treści 1 Programowanie obiektowe, a język C++ 2 Pojęcie klasy i składniki klas 3 Pola klas 4 Metody klas 5 Konstruktory i destruktory 6 Dostęp do składników klas 7 Definiowanie obiektów klas 8 Przykładowy program obiektowo zorientowany Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2015/2018 26 / 39

Dostęp do składników klas Wszystkie składowe klasy są widoczne wewnątrz klasy, ale mogą mieć różny poziom dostępności z zewnątrz. Poziom dostępności jest określany jednym ze słów kluczowych: public - nazwy mogą być używane we wszystkich miejscach programu, gdzie widoczna jest definicja klasy, private - nazwy mogą być używane tylko przez metody tej samej klasy, lub funkcje z daną klasą zaprzyjaźnione protected - nazwy mogą być używane przez metody klasy i jej funkcje zaprzyjaźnione, a także metody i funkcje zaprzyjaźnione klas pochodnych danej klasy. Definicję klasy dzieli się na tzw. sekcje - każda sekcja rozpoczyna się od jednego z w/w słów kluczowych z następującym po nim :. Sekcja rozciąga się do końca definicji klasy lub do rozpoczęcia innej sekcji. Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2015/2018 27 / 39

Dostęp do składników klas Brak specyfikatora dostępu na początku definicji klasy oznacza dostęp prywatny. class MojaKlasa{ int privint; public: int publint; double publdbl; private: double privdbl; void privfun(int, double); public: bool publbl; char publchr; }; Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2015/2018 28 / 39

Funkcje zaprzyjaźnione Funkcja zaprzyjaźniona z klasą to funkcja, która: nie jest metodą klasy, ma dostęp do wszystkich - nawet prywatnych - składników klasy. Wewnątrz definicji klasy wystarczy umieścić deklarację tej funkcji poprzedzoną słowem friend. friend void mojafunkcjazaprzyjazniona(); Właśnie dzięki temu ta zwykła funkcja ma prawo dostępu do prywatnych składników klasy. Zwróćmy uwagę, że to nie funkcja się zaprzyjaźnia, tylko klasa deklaruje przyjaźń. Zatem słowo friend pojawia się tylko wewnątrz definicji klasy. Funkcja zaprzyjaźniona nie jest składnikiem klasy, dlatego też nie ma wskaźnika this. Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2015/2018 29 / 39

Funkcje zaprzyjaźnione Przykładowe zastosowanie funkcji zaprzyjaźnionej przedstawia następujący fragment kodu. class MojaKlasa{ friend void mojafunkcjazaprzyjazniona(); int privint; }; void mojafunkcjaglobalna(){ MojaKlasa obmojejklasy; cout << obmojejklasy.privint; // pole privint niedostepne w tej funkcji } void mojafunkcjazaprzyjazniona(){ MojaKlasa obmojejklasy; cout << obmojejklasy.privint; // OK } Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2015/2018 30 / 39

Spis treści 1 Programowanie obiektowe, a język C++ 2 Pojęcie klasy i składniki klas 3 Pola klas 4 Metody klas 5 Konstruktory i destruktory 6 Dostęp do składników klas 7 Definiowanie obiektów klas 8 Przykładowy program obiektowo zorientowany Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2015/2018 31 / 39

Definiowanie obiektów Definiując zmienne obiektowe klasy należy określić, jaki konstruktor ma być wywołany dla kreowanego obiektu. Robi się to podając (lub nie) argumenty dla konstruktora w nawiasach. punkt p1; punkt p2(1., 4.); punkt p3 = punkt(); punkt p4 = punkt(1., -1.); punkt p5 = p2; // konstruktor kopiajacy punkt p6(p4); punkt* wp1 = new punkt; // deklaracje dynamiczne punkt* wp2 = new punkt(); punkt* wp3 = new punkt(0.5, -7.5); Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2015/2018 32 / 39

Definiowanie obiektów Jeśli tworzymy obiekty przy użyciu konstruktora domyślnego, czyli bezargumentowego, to umieszczanie nawiasów jest: czasem dozwolone, punkt* wp = new punkt; punkt* wp = new punkt(); czasem konieczne, punkt p = punkt(); punkt p = punkt; a czasem zabronione. punkt p; punkt p(); Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2015/2018 33 / 39

Spis treści 1 Programowanie obiektowe, a język C++ 2 Pojęcie klasy i składniki klas 3 Pola klas 4 Metody klas 5 Konstruktory i destruktory 6 Dostęp do składników klas 7 Definiowanie obiektów klas 8 Przykładowy program obiektowo zorientowany Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2015/2018 34 / 39

Przykładowy program obiektowy A oto kod przykładowego programu obiektowegow języku C++: #include <iostream> using namespace std; class punkt{ static int nrkolpunktu; static int lpunktow; double x, y; int nrpunktu; public: const string opis; punkt(): opis("konstruktor domniemany"){ x = 0.; y = 0.; lpunktow++; nrpunktu = ++nrkolpunktu; } Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2015/2018 35 / 39

punkt(double xp, double yp): x(xp), y(yp), nrpunktu(++nrkolpunktu), opis("konstruktor dwuparametrowy") {lpunktow++;} punkt(const punkt& wzor): opis("konstruktor kopiujacy"){ x = wzor.x; y = wzor.y; lpunktow++; nrpunktu = ++nrkolpunktu; } ~punkt(){lpunktow--;} Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2015/2018 36 / 39

double getx(){return x;} double gety(){return y;} int getnrp(){return nrpunktu;} static void ilepunktow(){ cout << "Liczba istniejacych punktow: " << lpunktow << endl; } }; int punkt::nrkolpunktu = 0; int punkt::lpunktow = 0; ostream& operator<<(ostream& str, punkt& p){ str << p.opis << " - punkt nr " << p.getnrp() << ": (" << p.getx() << ", " << p.gety() << ")"; return str; } Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2015/2018 37 / 39

void fun(){ punkt p1(4., 5.); cout << p1 << endl; p1.ilepunktow(); } int main() { punkt::ilepunktow(); punkt p1, p2(1., -3.), p3 = p2; cout << p1 << endl; cout << p2 << endl; cout << p3 << endl; fun(); p3.ilepunktow(); return 0; } Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2015/2018 38 / 39

Strumień wyjściowy Program ten wygeneruje strumień wyjściowy: Liczba istniejacych punktow: 0 Konstruktor domniemany - punkt nr 1: (0, 0) Konstruktor dwuparametrowy - punkt nr 2: (1, -3) Konstruktor kopiujacy - punkt nr 3: (1, -3) Konstruktor dwuparametrowy - punkt nr 4: (4, 5) Liczba istniejacych punktow: 4 Liczba istniejacych punktow: 3 Żeby zrozumieć powstały strumień wyjściowy należy po kolei zanalizować przykładowy program Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2015/2018 39 / 39