KLASY cz.1. Dorota Pylak

Podobne dokumenty
Do czego służą klasy?

Do czego służą klasy?

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

Podstawy Programowania Obiektowego

TEMAT : KLASY DZIEDZICZENIE

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

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

Technologie i usługi internetowe cz. 2

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

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

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

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

Wykład 8: klasy cz. 4

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

Definiowanie własnych klas

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

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

Programowanie obiektowe - 1.

C-struktury wykład. Dorota Pylak

Wstęp do programowania obiektowego. Wykład 2

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

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

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

Programowanie komputerowe. Zajęcia 7

Wstęp do Programowania 2

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

C-struktury wykład. Dorota Pylak

Wykład 5: Klasy cz. 3

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

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

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

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

Materiały do zajęć VII

Rozdział 4 KLASY, OBIEKTY, METODY

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 w Javie 1 Wykład i Ćwiczenia 3 Programowanie obiektowe w Javie cd. Płock, 16 października 2013 r.

Technologie obiektowe

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

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

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

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

Struktury Struktura polami struct struct struct struct

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

Wstęp do programowania

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

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

Podstawy Języka Java

Dziedziczenie. Ogólna postać dziedziczenia klas:

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

Laboratorium 1 - Programowanie proceduralne i obiektowe

Informatyka I. Dziedziczenie. Nadpisanie metod. Klasy abstrakcyjne. Wskaźnik this. Metody i pola statyczne. dr inż. Andrzej Czerepicki

Programowanie, część I

PARADYGMATY PROGRAMOWANIA Wykład 2

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

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

Typy klasowe (klasy) 1. Programowanie obiektowe. 2. Założenia paradygmatu obiektowego:

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

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

Język C++ zajęcia nr 2

Definiowanie własnych klas

Podstawy Programowania Obiektowego

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

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 8. Katarzyna Grzelak. 15 kwietnia K.Grzelak (Wykład 8) Programowanie w C++ 1 / 33

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

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

Wstęp do programowania

Mechanizm dziedziczenia

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

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

Wprowadzenie do szablonów szablony funkcji

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

PARADYGMATY PROGRAMOWANIA Wykład 4

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Dziedziczenie jednobazowe, poliformizm

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 4: Klasy i Metody

Wprowadzenie do szablonów szablony funkcji

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

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

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

Szablony funkcji i szablony klas

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

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

Kurs WWW. Paweł Rajba.

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

Programowanie obiektowe

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

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

Wprowadzenie do programowanie obiektowego w języku C++

Obiektowy PHP. Czym jest obiekt? Definicja klasy. Składowe klasy pola i metody

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

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

Programowanie obiektowe

Programowanie w języku C++

Podstawy algorytmiki i programowania - wykład 5 C-struktury cd.

Programowanie obiektowe

Wstęp do informatyki- wykład 9 Funkcje

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

Czym są właściwości. Poprawne projektowanie klas

Transkrypt:

KLASY cz.1 Dorota Pylak

Do czego służą klasy? 2 W programowaniu obiektowym posługujemy się obiektami. Obiekty charakteryzują się: cechami (inaczej - atrybutami lub stanami) operacjami, które na nich można wykonywać (inaczej - usługami, które są obowiązane świadczyć; inaczej - poleceniami czy komunikatami, które można im wydawać czy do nich posyłać) Obiekty w programie odzwierciedlają rzeczywiste obiekty, które mogą być konkretne (fizyczne) lub abstrakcyjne.

3 Do czego służą klasy? Na przykład, gdyby nasz program symulował ruch uliczny, to potrzebowalibyśmy takich obiektów jak samochody. Każdy z obiektów- samochodów ma jakieś cechy (atrybuty, stany) np. ciężar, wysokość, aktualną prędkość jazdy oraz udostępnia jakieś usługi, wykonanie których możemy mu zlecić za pomocą odpowiednich poleceń np. włącz się do ruchu, zatrzymaj się, zwiększ prędkość skręć w lewo itp. Skąd wiemy jakie atrybuty mają obiekty-samochody? Skąd wiemy jakie polecenia możemy do nich posyłać? O tym decyduje definicja klasy samochodów, którą nasz program musi albo skądś pobrać albo sam dostarczyć.

4 Do czego służą klasy? Klasa - to opis takich cech grupy podobnych obiektów, które są dla nich niezmienne (np. zestaw atrybutów i usług(funkcji), które mogą świadczyć, wykonywać) Można by więc symbolicznie zapisać coś takiego: Klasa Samochod atrybuty: ciężar wysokość aktualna prędkość usługi - operacje: włącz_się_do_ruchu zatrzymaj_się zwiększ_prędkość skręć_w_lewo

Do czego służą klasy? 5 Dopiero teraz będziemy wiedzieć co charakteryzuje każdy obiektsamochód w naszym programie i co możemy z każdym takim obiektem robić w programie. Warto zwrócić uwagę, że dzięki zastosowaniu klas mamy możliwość programowania w języku problemu (np. symulacji ruchu samochodów). Klasy pozwalają nam wprowadzać do języka nowe typy danych (takie jak Samochod) z właściwymi dla nich zestawami dopuszczalnych wartości (tu: możliwe wartości atrybutów, takich jak ciężar, wysokość, aktualna prędkość jazdy) i dopuszczalnymi operacjami. Klasa jest uogólnieniem typu: w zasadzie klasa zachowuje się dokładnie jak typ wbudowany

Do czego służą klasy? 6 Nie należy myśleć, że np. definicja klasy samochodów jest ustalona i jedyna. Konkretne obiekty samochody możemy przecież w naszych programach opisywać bardzo różnie w zależności od tego jaki problem ma do rozwiązania nasz program. Np. w przypadku symulacji ruchu ulicznego nie będzie pewnie nas interesować taka cecha samochodu jak kolor (zatem ten atrybut nie znajdzie się w definicji klasy jako wspólna cecha wszystkich obiektów samochodów). Ale być może gdyby nasz program zajmował się zagadnieniem sprzedaży samochodów, to cecha "kolor" znalazłaby się jako istotny atrybut w definicji klasy. A zamiast operacji: włącz się_do ruchu itp. potrzebne byłyby całkiem inne operacje na obiektach (np. sprzedaj).

7 Do czego służą klasy? Klasy mogą też odzwierciedlać obiekty abstrakcyjne (np. matematyczne) Rozważmy np. pary liczb całkowitych. Klasa Para atrybuty: pierwsza_liczba_pary druga_liczba_pary usługi - operacje: operacja_inicjacji // zainicjuj parę dwoma podanymi liczbami set add // ustal wartość pary na podstawie wartości innej pary // dodaj do pary inną parę show // pokaż parę Znowu: ta definicja nie określa wartości cech pojedynczego obiektu. Możemy mieć wiele obiektów par-liczb całkowitych. Każdy obiekt para ma podane atrybuty (ale np. różne ich wartości) oraz na każdym możemy wykonywać podane operacje (set,add itd).

Definicja klasy 8 Definicja klasy określa: zestaw cech (atrybutów) obiektów klasy, zestaw operacji, które można wykonywać na obiektach klasy specjalne operacje, które pozwalają na inicjowanie obiektów przy ich tworzeniu W wielu językach obiektowych (w tym w C++, Javie): wspólne cechy (atrybuty) obiektów nazywają się polami klasy, operacje (polecenia) - nazywają się metodami, specjalne operacje inicjalizacji - nazywają się konstruktorami.

Definicja klasy 9 Definicja klasy stanowi zatem definicję: pól, metod, i konstruktorów. Klasę winniśmy traktować jako swoisty wzorzec, szablon opisujący powstawanie obiektów (konstruktory), ich cechy (pola) oraz sposób komunikowania się z obiektami (metody). Pola, metody i konstruktory nazywamy składowymi klasy. Klasa stanowi też osobną przestrzeń nazw: wewnątrz klasy można definiować nowe typy. Nazwy tak zdefiniowanych typów należeć będą do zasięgu klasy: można się do nich odwołać z zewnątrz poprzez nazwę kwalifikowaną z zastosowaniem operatora zasięgu ' ::'.

Definicja klasy 10 Definicję klasy piszemy zwykle na zewnątrz innych klas i funkcji (nie jest to jednak wymaganie języka: można, choć rzadko bywa to przydatne, definiować klasę wewnątrz funkcji). Sama definicja ma postać class Klasa { }; // składowe klasy: pola,konstruktory, metody... lub struct Klasa { }; // składowe klasy: pola,konstruktory, metody...

Definicja klasy 11 Nie należy zapominać o średniku kończącym definicję klasy. Nowy typ jest już zdefiniowany po napotkaniu zamykającego nawiasu klamrowego, zatem za nawiasem, a przed średnikiem można umieścić definicje obiektów właśnie zdefiniowanej klasy; na przykład po class Klasa { //... } x, y, z; zdefiniowana byłaby klasa Klasa i utworzone trzy obiekty tej klasy o nazwach x, y i z (pod warunkiem, że istnieje w klasie/strukturze publiczny konstruktor domyślny). Wszystkie składowe klasy są widoczne wewnątrz klasy. Oznacza to, że mają do nich dostęp funkcje (metody) zadeklarowane jako funkcje składowe danej klasy. Mogą jednak mieć różny poziom dostępności z zewnątrz, a więc z funkcji które nie są składowymi danej klasy: poziom dostępności jest określany jednym ze słów kluczowych: public, private, lub protected.

Dostępność składowych 12 Definicję klasy dzieli się na tzw. sekcje: każda sekcja rozpoczyna się od jednego z tych słów kluczowych z następującym po nim dwukropkiem. Sekcja rozciąga się do końca definicji klasy lub do rozpoczęcia innej sekcji, na przykład: 1. class Klasa { 2. int s1; 3. public: //sekcja publiczna 4. int s2; 5. double d2; 6. private: //sekcja prywatna 7. double s3; 8. void fun3(int,double); 9. public: //sekcja publiczna 10. int s4; 11. char c4; 12. };

Dostępność składowych Pole s1 zostało zdefiniowane przed pojawieniem się jakiegokolwiek specyfikatora poziomu dostępności. Przyjmuje się wtedy dostępność domyślną, według następującej zasady: (Klasy można definiować w C++ za pomocą słowa kluczowego class lub struct. ) Jeśli użyliśmy słowa class, to domyślnie składowe są prywatne (private), jeśli użyliśmy słowa struct, to domyślnie składowe są publiczne (public). Innych różnic między klasami i strukturami w C++ nie ma. Pod względem dostępności składowe dzielą się zatem na: publiczne (public), których nazwy mogą być używane we wszystkich miejscach programu, gdzie widoczna jest definicja klasy; prywatne (private), których nazwy mogą być używane tylko przez funkcje, które same są składowymi tej samej klasy, lub funkcje z daną klasą zaprzyjaźnione (o czym później); chronione (protected), których nazwy mogą być używane tylko przez funkcje, które same są składowymi tej samej klasy, funkcje z daną klasą zaprzyjaźnione, a także funkcje składowe i zaprzyjaźnione klas pochodnych (dziedziczących z) danej klasy. 13

Pola klasy 14 Pola klasy definiują dane, z jakich składać się będzie każdy obiekt klasy. Danymi tymi mogą być wielkości dowolnego typu wbudowanego lub zdefiniowanego w programie przez samego programistę lub autora biblioteki, z której program korzysta. Niestatyczne pole klasy nie może być typu, który dana klasa właśnie definiuje, natomiast może mieć typ wskaźnika do obiektu tejże klasy. Deklaracje pól mają postać definicji zmiennych: class Klasa { }; int k1, k2; double x, y; //...

Pola klasy 15 Zadeklarowanie pola (niestatycznego) oznacza, że w każdym obiekcie definiowanej klasy będzie utworzona zmienna o nazwie i typie określonym w deklaracji. Sama definicja klasy nie powoduje utworzenia żadnych obiektów. Pola można deklarować wewnątrz klasy w dowolnej kolejności i miejscu przed lub po metodach; ich zakresem jest cała klasa, a nie tylko fragment następujący leksykalnie po definicji. Kolejność definicji pól ma jednak znaczenie podczas inicjowania i niszczenia (destrukcji) pola są inicjowane w kolejności takiej, w jakiej były zadeklarowane, a usuwane w kolejności odwrotnej.

Metody 16 Tak jak pola klasy opisują dane, które zawarte będą w każdym obiekcie klasy, tak metody definiują zbiór operacji, jakie na tych danych będzie można wykonywać. Metody są wyrażone w języku jako niestatyczne funkcje o pewnych szczególnych własnościach (co to znaczy niestatyczne, wyjaśnimy na kolejnych wykładach). Deklaracja metody ma postać deklaracji funkcji, tyle że zawarta jest wewnątrz definicji klasy i ma ona dostęp do pól klasy- zatem nie musimy go przekazywać przez parametr. Tak jak dla zwykłych funkcji, deklaracja może być połączona z definicją. Można też, z podobnym skutkiem, wewnątrz klasy tylko metodę zadeklarować, a zdefiniować ją już poza klasą, w definicji odwołując się do niej poprzez nazwę kwalifikowaną operatorem zakresu klasy (np. Klasa::), bo przecież mogłoby istnieć wiele niezwiązanych ze sobą metod o tej samej nazwie w różnych klasach.

Metody 17 Istnieje pewna różnica między tymi sposobami: Jeśli funkcja (metoda, funkcja statyczna, konstruktor, destruktor) jest definiowana wewnątrz klasy, to domyślnie przyjmuje się dla niej modyfikator inline, czyli kompilator będzie próbował ją rozwijać(operacja ta może się nie powieść- kompilator może uznać to zadanie za zbyt trudne). Rozwijanie oznacza, że kod (instrukcje maszynowe) funkcji jest przez kompilator umieszczany w każdym miejscu pliku wykonywalnego, gdzie funkcja powinna, według treści programu, być wywołana. Jeśli metoda (ogólnie funkcja) jest w klasie tylko zadeklarowana, natomiast zdefiniowana jest poza klasą, to domyślnie nie będzie rozwijana, chyba że jawnie tego zażądamy w definicji korzystając z modyfikatora inline.

Metody 18 Metody, a więc funkcje składowe niestatyczne i nie będące konstruktorem, wywoływane są zawsze na rzecz konkretnego, istniejącego wcześniej obiektu klasy, której są składowymi. Wywołanie metody fun spoza klasy, a więc z funkcji która sama nie jest funkcją składową tej samej klasy np. w main(), przybiera zatem jedną z postaci a.fun() pa->fun() gdzie a jest zmienną będącą obiektem tej klasy lub referencją do obiektu tej klasy, a pa jest wskaźnikiem wskazującym obiekt tej klasy.

Metody 19 Zanim napiszemy pierwszy przykład przedstawimy: Podstawowe założenia paradygmatu obiektowego: Abstrakcja Każdy obiekt w systemie służy jako model abstrakcyjnego wykonawcy, który może wykonywać pracę, opisywać i zmieniać swój stan oraz komunikować się z innymi obiektami w systemie bez ujawniania, w jaki sposób zaimplementowano dane cechy. Hermetyzacja Czyli ukrywanie implementacji, enkapsulacja. Zapewnia, że obiekt nie może zmieniać stanu wewnętrznego innych obiektów w nieoczekiwany sposób. Tylko własne metody obiektu są uprawnione do zmiany jego stanu. Każdy typ obiektu prezentuje innym obiektom swój interfejs, który określa dopuszczalne metody współpracy.

Modyfikator const 20 Do tej pory modyfikatora const używaliśmy: przy deklaracji stałych, np. const int NMAX=100; przy przekazywaniu parametrów przez stałą referencję do funkcji np. void f(const string &s) Poznamy teraz nowe zastosowanie modyfikatora const w deklaracjach metod składowych w klasach. Przykład: class A { }; private: int X; public: int GetX () const;

Modyfikator const 21 Taka deklaracja mówi kompilatorowi, iż w środku funkcji GetX() na pewno nie zmienimy żadnej danej z instancji klasy A. Ta informacja pozwala kompilatorowi lepiej optymalizować kod programu, gdyż pozwala np. przechować w rejestrach wartości danych obiektu. Bez modyfikatora const, po powrocie z funkcji GetX() kompilator musi odświeżyć wartości w takich rejestrach, zaś mając gwarancje, że GetX() nic nie zmienia w obiekcie - nie musi tego robić. Drugim powodem jest fakt, że programista czytając kod źródłowy programu może, bez zaglądania w kod funkcji GetX(), być pewnym, że nie modyfikuje ona obiektu. Może to ułatwić testowanie programu i przyspiesza poszukiwanie błędu, szczególnie w dużych i złożonych programach.

Przykład 22 Napisz deklarację klasy Wektor w której przechowujemy następujące informacje o wektorze w przestrzeni: współrzędne x, y, z oraz metody: metoda ustaw ustalająca pola prywatne klasy zgodnie z wartościami jej parametrów (set) metody podajx, podajy i podajz zwracające wartości pól prywatnych klasy (get) metoda il_skalarny zwracająca iloczyn skalarny wektora, będącego parametrem aktualnym dla którego jest wykonywana metoda, z wektorem przekazanym jako parametr metoda wyswietl wyświetlająca na ekranie współrzędne wektora

Przykład definicje funkcji w klasie 23 #include <iostream> #include <iomanip> using namespace std; class Wektor { double x, y, z; //prywatne pola klasy public: //sekcja publiczna //metoda ustalająca wartości pól klasy zgodnie // z przekazanymi parametrami void ustaw(double xx, double yy, double zz) { //nadajemy polom klasy wartości przekazane przez parametry //metoda jako składowa klasy ma dostęp do pól prywatnych x = xx; y = yy; z = zz; }

Przykład definicje funkcji w klasie 24 //metody zwracające wartości poszczególnych pól //pola są prywatne więc spoza klasy nie mamy do nich dostępu //const ponieważ funkcja nie zmienia pól klasy double podajx() const { return x; } double podajy() const { return y; } double podajz() const { return z; }

Przykład definicje funkcji w klasie 25 //f-cja obliczająca iloczyn skalarny klasy na rzecz której //wywoływana jest metoda i klasy przekazanej przez parametr double il_skalarny(const Wektor& w) const { //składowa klasy, ma dostęp do prywatnych składowych x, y, z //zarówno klasy której jest metodą, jak i klasy przekazanej // przez parametr return x*w.x + y*w.y + z*w.z; } //metoda wyswietl void wyswietl() const //const bo f-cja nie zmienia pól { cout<<fixed<<setprecision(1); cout<<"[ "<<x<<", "<<y<<", "<<z<<" ]"<<endl; } };//koniec definicji klasy

26 Przykład definicje funkcji w klasie int main() { Wektor w1, w2; //deklarujemy dwa obiekty (instancje) // klasy Wektor //Składowe (pola i metody) niestatyczne (instancyjne) //zawsze wiążą się z istnieniem obiektu danej klasy w1.ustaw(1, 1, 2);//ustawiamy pola w w1, //wywołując metodę ustaw dla w1 cout<<"w1= "; //pola x,y,z są prywatne, dostęp do nich mamy tylko // przez metody klasy //cout<<w1.podajx(); //OK, metoda zwracająca wartość x //cout<<w1.x; //BŁĄD cout<<"[ "<<w1.podajx()<<", " <<w1.podajy()<<","<<w1.podajz()<<" ]"<<endl;

27 Przykład definicje funkcji w klasie w2.ustaw(1,-1, 2); cout<<"w2= "; //ustawiamy pola w w2 w2.wyswietl(); cout << "w1*w2 = " << w1.il_skalarny(w2) << endl; //iloczyn skalarny return 0; }

Konstruktory 28 Konstruktor jest to funkcja w klasie, wywoływana w trakcie tworzenia każdego obiektu danej klasy. Konstruktor: ma identyczną nazwę jak nazwa klasy (z uwzględnieniem wielkość liter) nie zwraca żadnej wartości (nawet void, typu zwracanego nie podajemy w ogóle) Należy dodać, że każda klasa ma swój konstruktor. Nawet jeżeli nie zadeklarujemy go jawnie zrobi to za nas kompilator (stworzy wtedy konstruktor bezparametrowy i pusty, który jest publiczny, nie ma żadnych parametrów i nie wykonuje żadnych czynności). Taka sytuacja miała miejsce w powyższym przykładzie, w klasie Wektor nie zdefiniowaliśmy jawnie żadnego konstruktora, zatem przy deklaracji - tworzeniu zmiennych obiektowych typu Wektor w funkcji main() wykorzystywany był domyślny konstruktor bezparametrowy dostarczony przez kompilator. Jeśli jakikolwiek konstruktor został w klasie zdefiniowany, to konstruktor domyślny nie będzie kreowany automatycznie.

Konstruktory 29 Konstruktor jest konstruktorem domyślnym wtedy i tylko wtedy, gdy może być wywołany bez żadnych argumentów, np. Wektor(){} albo Wektor(){//konstruktor bezparametrowy zerujący pola klasy } x = 0; y = 0; z = 0; Konstruktor (niekoniecznie domyślny) jest wywoływany automatycznie wyłącznie podczas tworzenia obiektu (ściśle mówiąc, na zakończenie tego procesu); nie można go wywołać ręcznie, jak normalnej metody, na rzecz obiektu już istniejącego.

Konstruktory 30 Jeśli chcemy zmienić wartości pól istniejącego obiektu, możemy skorzystać np. z metody void ustaw(double xx, double yy, double zz) wówczas w main(): Wektor w;//konstruktor bezparametrowy w.ustaw(1,1,1); Konstruktory, jak inne funkcje, mogą mieć parametry domyślne (następny wykład). W czasie wykonywania konstruktora obiekt jest już skonstruowany, to znaczy został fizycznie utworzony w pamięci, jak również, co bardzo ważne, zostały już utworzone wszystkie jego składowe opisane polami klasy. Składowe te tworzone są w kolejności takiej, w jakiej zostały zadeklarowane w definicji klasy/struktury.

Konstruktory - przeciążanie 31 Konstruktory mogą też być przeładowywane (przeciążane)(ang. overloading), jak normalne funkcje(czy metody). Wszystkie mają w danej klasie taką samą nazwę: taką jak nazwa tej klasy. Jeśli jest ich kilka, to podczas tworzenia obiektu wybierany jest ten najbardziej pasujący": class Klasa { int p; public: }; Klasa(){} //konstruktor bezparametrowy Klasa(int x) //konstruktor inicjujący pole // wartością parametru { } p = x;

Konstruktory - przeciążanie 32 int main() { //tworzymy obiekt korzystając z konstruktora //bezparametrowego Klasa kla; //korzystamy z konstruktora z parametrem: //Klasa obiekt(argumenty); } Klasa klb(42);//tworzymy obiekt klasy Klasa //z polem p o wartości 42 Warunkiem koniecznym, choć niewystarczającym dla przeciążania jest, aby funkcje o tej samej nazwie różniły się sygnaturą. Do sygnatury funkcji należy jej nazwa oraz liczba i typ parametrów nie licząc tych z wartościami domyślnymi. Typ wartości zwracanej, zwykle do sygnatury nie jest zaliczany.

33 Przykład cd- konstruktory class Wektor { private: double x, y, z; //prywatne pola klasy public: //sekcja publiczna //DEKLARACJE KONSTRUKTORÓW Wektor(){//bezparametrowy, zeruje pola } x = 0; y = 0; z = 0;//zerujemy pola klasy //konstruktor z parametrami- ustawia pola zgodnie //z wartościami parametrów Wektor(double xx, double yy, double zz){ } x = xx; y = yy; z = zz; }; //DEKLARACJE METOD: //...

34 Przykład cd- konstruktory int main() { //deklarujemy obiekt (instancje) klasy Wektor Wektor w1; // przy tworzeniu obiektu użyty //zostanie konstruktor domyślny //lub: //Wektor w1 = Wektor(); w1.wyswietl(); //[ 0.0, 0.0, 0.0 ] //deklarujemy kolejny obiekt klasy Wektor Wektor w2(2, 4, 5); //konstruktor z parametrami "zwykly" //lub: Wektor w2 = Wektor(2, 4, 5); w2.wyswietl(); //[ 2.0, 4.0, 5.0 ]

35 Przykład cd- konstruktory w1.ustaw(1, 1, 2); //ustawiamy pola w w1, wywołując cout << "w1= "; //metodę ustaw dla w1 cout << "[ "<<w1.podajx()<<", " << w1.podajy()<<", "<<w1.podajz()<<" ]"<<endl; //w1= [ 1.0, 1.0, 2.0 ] } w2.ustaw(1,-1, 2); //ustawiamy pola w w2 cout << "w2= "; w2.wyswietl(); //w2= [ 1.0, -1.0, 2.0 ]