Do czego służą klasy?

Podobne dokumenty
Do czego służą klasy?

KLASY cz.1. Dorota Pylak

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

Podstawy Programowania Obiektowego

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

TEMAT : KLASY DZIEDZICZENIE

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

Technologie i usługi internetowe cz. 2

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

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

Definiowanie własnych klas

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

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

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

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

Programowanie komputerowe. Zajęcia 7

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

Programowanie obiektowe - 1.

Wykład 8: klasy cz. 4

C-struktury wykład. Dorota Pylak

Wstęp do programowania obiektowego. Wykład 2

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Wstęp do Programowania 2

C-struktury wykład. Dorota Pylak

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

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

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

Rozdział 4 KLASY, OBIEKTY, METODY

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

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

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

Wykład 5: Klasy cz. 3

Materiały do zajęć VII

Struktury Struktura polami struct struct struct struct

Programowanie Obiektowo Zorientowane w języku C++ Klasy, pola, 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.

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

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

Technologie obiektowe

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

Programowanie w Javie 1 Wykład i Ćwiczenia 3 Programowanie obiektowe w Javie cd. Płock, 16 października 2013 r.

Programowanie, część I

Laboratorium 1 - Programowanie proceduralne i obiektowe

Podstawy Języka Java

Dziedziczenie. Ogólna postać dziedziczenia klas:

Podstawy Programowania Obiektowego

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

Programowanie obiektowe

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

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

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

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

Język C++ zajęcia nr 2

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

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

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

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

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

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.

Definiowanie własnych klas

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

Mechanizm dziedziczenia

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

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

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

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

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

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

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

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

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

PARADYGMATY PROGRAMOWANIA Wykład 4

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

Dziedziczenie jednobazowe, poliformizm

Wstęp do programowania

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

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

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

Programowanie obiektowe

Programowanie w C++ Wykład 11. Katarzyna Grzelak. 13 maja K.Grzelak (Wykład 11) 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

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

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

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

Wstęp do programowania

Wprowadzenie do szablonów szablony funkcji

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

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

Szablony klas, zastosowanie szablonów w programach

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

Wykład 4: Klasy i Metody

Szablony funkcji i szablony klas

Wprowadzenie do szablonów szablony funkcji

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

PARADYGMATY PROGRAMOWANIA Wykład 2

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

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

Programowanie obiektowe

Wprowadzenie do programowanie obiektowego w języku C++

Transkrypt:

KLASY Dorota Pylak

2 Do czego służą klasy? 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. 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.

3 Do czego służą klasy? 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ć. 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? 4 Dopiero teraz będziemy wiedzieć co charakteryzuje każdy obiekt-samochó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 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).

Do czego służą klasy? 5 Klasy mogą też odzwierciedlać obiekty abstrakcyjne (np. matematyczne) Rozważmy np. pary liczb całkowitych. W naszym programie odzwierciedlamy właściwości tych obiektów za pomocą definicji klasy par liczb całkowitych. Taka definicja określa atrybuty pary oraz operacje, które na parach można wykonywać. Klasa Para atrybuty: pierwsza_liczba_pary druga_liczba_pary usługi - operacje: operacja_inicjacji // zainicjuj parę dwoma podanymi liczbami set add show // ustal wartość pary na podstawie wartości innej pary // dodaj do pary inną parę // 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).

6 Definicja klasy 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 inicjacji - nazywają się konstruktorami. 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 7 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ć lub class Klasa { ; // składowe klasy: pola, metody... struct Klasa { ; // składowe klasy: pola, metody... 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).

Dostępność składowych 8 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.. 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 9 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.

Pola klasy 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; //... 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. 10

Metody 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 później). 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. 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. 11

Metody 12 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, 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. 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.

13 Modyfikator const 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; 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 14 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 metody podajx, podajy i podajz zwracające wartości pól prywatnych klasy 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 15 #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; //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;

Przykład definicje funkcji w klasie 16 double podajy() const { return y; double podajz() const { return z; //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; void wyswietl() const //const bo f-cja nie zmienia pól klasy { cout<<fixed<<setprecision(1); cout<<"[ "<<x<<", "<<y<<", "<<z<<" ]"<<endl; ;

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ść pola x //cout<<w1.x; //BŁĄD cout<<"[ "<<w1.podajx()<<", " <<w1.podajy()<<","<<w1.podajz()<<" ]"<<endl; w2.ustaw(1,-1, 2); //ustawiamy pola w w2 cout<<"w2= "; w2.wyswietl(); cout << "w1*w2 = " << w1.il_skalarny(w2) << endl;//iloczyn skalarny return 0; 17

Parametry domyślne 18 W metodach klasy, tak jak w funkcjach, możemy korzystać z domyślnych wartości parametrów. Np. dla metody ustaw: void ustaw(double xx = 0, double yy = 0, double zz = 0) { x = xx; y = yy; z = zz; Wówczas w funkcji main(): Wektor w; w.ustaw(); //wszystkie parametry z wartościami domyślnymi cout<<"w= "; w.wyswietl(); //w= [ 0.0, 0.0, 0.0 ] //parametr xx ustawiony jawnie, pozostałe - wartości domyślne w.ustaw(1.5); w.wyswietl(); //[ 1.5, 0.0, 0.0 ] w.ustaw(2,3); w.wyswietl(); //[ 2.0, 3.0, 0.0 ] Parametry z wartościami domyślnymi w definicji funkcji (metody) muszą być na końcu listy parametrów. Przy wywoływaniu funkcji (metody) parametry z wartościami domyślnymi są opcjonalne, ale można opuścić tylko końcowe parametry, np. wywołując ustaw nie można ustawić tylko parametrów xx, zz, a opuścić yy.

Konstruktory 19 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. Konstruktor jest konstruktorem domyślnym wtedy i tylko wtedy, gdy może być wywołany bez żadnych argumentów, np. albo Wektor(){ Wektor(){//konstruktor bezparametrowy zerujący pola klasy x=0; y=0; z=0;

20 Konstruktory Nie znaczy to, że konstruktor domyślny koniecznie musi być zdefiniowany jako funkcja bezparametrowa; może mieć dowolną liczbę parametrów, ale jeśli je ma, to wszystkie muszą mieć zdefiniowane wartości domyślne, np. Wektor(double xx=0, double yy=0, double zz=0){ x = xx; y = yy; z = zz; W klasie może oczywiście istnieć tylko jeden konstruktor domyślny! Zatem dla powyższego przykładu konstruktorem domyślnym może być jeden z trzech przedstawionych powyżej. 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. 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. 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.

21 Konstruktory - przeciążanie Konstruktory mogą też być przeładowywane (przeciążane), 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) {p=x; //konstruktor inicjujący pole wartością parametru 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.

Przykład 2- definicje metod poza klasą 22 Rozważmy ponownie klasę Wektor: Napiszmy deklarację klasy Wektor, w której przechowujemy następujące informacje o wektorze w przestrzeni: współrzędne x, y, z oraz: konstruktory konstruktor bezparametrowy (ustawia punkt (0,0)) konstruktor ustalający pola prywatne klasy na podstawie jego parametrów i metody: metoda ustaw ustalająca pola prywatne klasy zgodnie z wartościami jej parametrów, ponadto ustalająca wartości domyślne parametrów równe 0 metody podajx, podajy i podajz zwracające wartości pól prywatnych klasy 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 Tym razem wewnątrz klasy metody należy tylko zadeklarować, a zdefiniować je już poza klasą odwołując się do nich poprzez nazwę kwalifikowaną operatorem zakresu klasy Wektor::.

23 Przykład 2- definicje metod poza klasą #include <iostream> #include <iomanip> using namespace std; class Wektor { private: double x, y, z; //prywatne pola klasy public: //sekcja publiczna //DEKLARACJE KONSTRUKTORÓW Wektor();//bezparametrowy, zeruje pola //konstruktor z parametrami- ustawia pola zgodnie z wartościami parametrów Wektor(double xx, double yy, double zz); //DEKLARACJE METOD: //metoda ustalająca wartości pól klasy zgodnie z parametrami //wyzerowane wartości domyślne void ustaw(double xx = 0, double yy = 0, double zz = 0);

24 Przykład 2- definicje metod poza klasą //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; double podajy() const; double podajz() const; //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; void wyswietl() const; //const bo f-cja nie zmienia pól klasy ; //DEFINICJE KONSTRUKTORÓW I METOD (IMPLEMENTACJA) Wektor:: Wektor(){ x = 0; y = 0; z = 0;//zerujemy pola klasy Wektor:: Wektor(double xx, double yy, double zz){ x = xx; y = yy; z = zz;

25 Przykład 2- definicje metod poza klasą void Wektor::ustaw(double xx, double yy, double zz){ x = xx; y = yy; z = zz; double Wektor::podajX() const{ return x; double Wektor::podajY() const{ return y; double Wektor:: podajz() const{ return z; double Wektor::il_skalarny(const Wektor& w) const { return x*w.x + y*w.y + z*w.z; void Wektor::wyswietl() const { cout<<fixed<<setprecision(1)<<"[ "<<x<<", "<<y<<", "<<z<<" ]"<<endl;

26 Przykład 2- definicje metod poza klasą int main() { Wektor w1; //deklarujemy obiekt (instancje) klasy Wektor w1.wyswietl(); //[ 0.0, 0.0, 0.0 ] Wektor w2(2,4,5); //konstruktor z parametrami w2.wyswietl(); //[ 2.0, 4.0, 5.0 ] w1.ustaw(1, 1, 2); //ustawiamy pola w w1, wywołując metodę ustaw dla w1 cout<<"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 ] cout << "w1*w2 = " << w1.il_skalarny(w2) << endl; //w1*w2 = 4.0 w2.ustaw(1,3); w2.wyswietl(); //[ 1.0, 3.0, 0.0 ] return 0;