Prgramwanie biektwe Wykład 1 Materiały: dr inż. Bżena Łpuch 1 Histria i cechy C++ Autr - Bjarne Strustrup (Dania, Cambridge, AT&T), 1983 Cel: rzszerzenie języka C biektwe mechanizmy abstrakcji danych i silną statyczną kntrlę typów. Zachwanie zgdnści z językiem C na pzimie kdu źródłweg pzstaje jednym z pdstawwych celów prjektwych klejnych standardów języka. Standardy Od 1998 - standard ISO/IEC 14882:1998 (Standard fr the C++ Prgramming Language) z drbnymi pprawkami zatwierdznymi w 2003 r. (ISO/IEC 14882:2003) - ISO C++ (-std = c++98). W 2009 rku głszn nwy standard (tzw. C++0x) (-std=c++0x), który zaczął bwiązywać d 12 sierpnia 2011 rku i dtąd jest nazywany (ISO/IEC 14882:2011) (-std=c++11). 2 PRZYDATNE KONSTRUKCJE 2.1 Parametry dmyślne Język C++ pzwala przypisywać parametrm funkcji wartści dmyślne. Funkcja taka mże być wywłana ze wszystkimi parametrami, wtedy wartści dmyślne nie są brane pd uwagę, lub z mniejszą liczbą parametrów, wtedy kmpilatr uzupełni wywłanie funkcji brakujące argumenty. Przykład: #include <istream> using namespace std; vid fun(int a=0, int b=10); int main() int n=1, m=5; fun(n,m); // przekazan d funkcji 1 i 5 fun(n); // przekazan d funkcji 1 i 10 fun(); // przekazan d funkcji 0 i 10 vid fun(int a, int b) cut << "Pierwszy argument: " << a << endl; cut << "Drugi argument: " << b << endl; UWAGA: Ograniczenia stswania parametrów dmyślnych: jeśli parametr nie ma wartści dmyślnej, t nie mże jej psiadać żaden z pprzedzających g parametrów! 1
Prgramwanie biektwe Wykład 1 Materiały: dr inż. Bżena Łpuch 2.2 Przeciążanie nazw funkcji W języku C++ mżna definiwać dwlnie wiele funkcji takiej samej nazwie. Muszą się ne różnić sygnaturą czyli liczbą parametrów frmalnych i (lub) ich typami. Jest t tzw. plimrfizm nazw funkcji. Przy wywłaniu kmpilatr użyje tej definicji funkcji, dla której liczba parametrów frmalnych i ich typy dpwiadają argumentm wywłania funkcji. Uwaga: W skład sygnatury funkcji nie wchdzi typ zwracaneg wyniku. Nie jest zatem mżliwe rzróżnienie funkcji na pdstawie zwracanych wartści. Definiwanie funkcji plimrficznych nazywa się przeciążaniem. Używana jest również nazwa przeładwanie funkcji (ang. functin verlading). Przeciążanie funkcji stsujemy w przypadku funkcji realizujących te same zadania, ale na danych różneg typu lub ich różnej liczby. Przykład: #include <istream> using namespace std; duble srednia(duble n1, duble n2); duble srednia(duble n1, duble n2, duble n3); int main() cut << "srednia 1: " << srednia(2.,5.) << endl; cut << "srednia 2: " << srednia(1.,3.,5.) << endl; duble srednia(duble n1, duble n2) return ( (n1+n2)/2.); duble srednia(duble n1, duble n2, duble n3) return ( (n1+n2+n3)/3.); 2.3 Dpaswywanie funkcji Brak prttypu pasująceg d wywłania funkcji spwduje, że C++ będzie próbwał dpaswać funkcje pprzez standardwe knwersje typów. Szczegóły dpaswywania funkcji: Prata, Szkła prgramwania. Język C++, wyd.v, 2006, str. 387-393. 2
Prgramwanie biektwe Wykład 1 Materiały: dr inż. Bżena Łpuch 2.4 Funkcje twarte (inline) Wywłanie funkcji jest prcesem czaschłnnym. W przypadku prstych funkcji kszt ich wywłania mże znacznie przewyższyć kszt wyknania właściwych instrukcji funkcji. D rzwiązania teg prblemu w C++ zaprpnwan funkcje twarte, rzwijane w miejscu wywłania. Jeśli deklarację funkcji patrzymy słwem kluczwym inline, znacza t, że preferujemy rzwinięcie ciała funkcji w miejscu jej wywłania zamiast zastswania zwykłeg mechanizmu wywływania funkcji. Przykład: Ten prgram: #include <istream> using namespace std; inline vid zwieksz(int &a) ++a; int main() int x=0; zwieksz(x); //++x; cut << "x=" << x << endl; zstanie skmpilwany tak, jakby zstał napisany następując: #include <istream> using namespace std; int main() int x=0; ++x; cut << "x=" << x << endl; Mechanizm ten jest wykrzystywany dmyślnie w większści kmpilatrów, działających w trybie ptymalizacji kdu, nawet dla funkcji, które nie są znaczne jak inline. Oznaczenie funkcji inline t tylk wskazówka dla kmpilatra, d której nie musi się stswać. 3
Prgramwanie biektwe Wykład 1 Materiały: dr inż. Bżena Łpuch 3 PODSTAWOWE POJĘCIA PROGRAMOWANIA OBIEKTOWEGO 3.1 Prgramwanie prceduralne Paradygmat: Zadecyduj, jakie chcesz mieć prcedury; stsuj najlepsze algrytmy, jakie mżesz znaleźć. Prcedura: wydrębnina z prgramu główneg sekwencja instrukcji nadanej nazwie, wskazująca knkretne zadanie d wyknania. Przykład: // Funkcja bliczająca pierwiastek kwadratwy duble sqrt(duble arg) // kd bliczania pierwiastka kwadratweg // Funkcja główna int main () duble pierw; // Wywłanie funkcji bliczania pierwiastka pierw=sqrt(2.0); 4
Prgramwanie biektwe Wykład 1 Materiały: dr inż. Bżena Łpuch 3.2 Abstrakcyjne typy danych, czyli typy zdefiniwane przez użytkwnika (prgramwania w stylu biektwym) Paradygmat: Zadecyduj, jakie chcesz mieć typy; dla każdeg typu dstarcz pełny zbiór peracji. Przykład: class cmplex private: duble re, im; public: cmplex() //dmyślna liczba zesplna re=im=0; cmplex(duble r, duble i) //twrzenie z dwóch składników re=r; im=i; cmplex(duble r) //twrzenie ze skalara re=r; im=0; // definicje funkcji peracji // na liczbach zesplnych: // +, -, *, / ==!= ; vid f() cmplex a(2), b=1/a, c; c=a+b; 5
Prgramwanie biektwe Wykład 1 Materiały: dr inż. Bżena Łpuch Paradygmat: 3.3 Prgramwanie biektwe Zdecyduj, jakie chcesz mieć klasy. Dla każdej klasy dstarcz pełny zbiór peracji. Krzystając z mechanizmu dziedziczenia jawnie wskaż, c jest wspólne. Cechy języka prgramwania biektweg: abstrakcyjne typy danych (klasy), hermetyzacja danych (ukrywanie), dziedziczenie, plimrfizm. Hermetyzacja (ang. encapsulatin, kapsułkwanie, enkapsulacja) - graniczenie dstępnści danych i funkcji wewnętrznych klas i biektów, udstępnianie ich jedynie za pmcą specjalnych funkcji nazywanych metdami. Dziedziczenie: jedna klasa biektów mże być zdefiniwana jak przypadek gólniejszej klasy, a definicje metd i pól danych klasy gólniejszej umieszczane są autmatycznie w klasie szczególnej, klasa gólna nazywana jest klasą bazwą a klasa szczególna klasą pchdną, klasy pchdne mgą definiwać swje własne metdy i pla danych, które mgą przesłaniać dziedziczne metdy i pla danych, klasa mże dziedziczyć właściwści więcej niż jednej klasy - dziedziczenie wielbazwe. Plimrfizm: wielpstaciwść - mżliwść istnienia wielu metd tej samej nazwie, pwiązana z mżliwścią wybru knkretnej metdy pdczas wyknywania. 6
Prgramwanie biektwe Wykład 1 Materiały: dr inż. Bżena Łpuch 3.4 OBIEKTY I KLASY W C++ Obiekt: abstrakcyjny byt reprezentujący lub pisujący pewną rzecz lub pjęcie bserwwane w świecie rzeczywistym Obiekt przechwuje pewne infrmacje na swój temat (atrybuty). Obiekt charakteryzuje się pewnym zakresem zachwań. Mżna pprsić biekt wyknanie pewnej peracji na samym sbie. Klasa: ugólnienie pdbnych d siebie biektów. Opisuje atrybuty biektu i jeg peracje (zachwania). Twrząc klasę kreślamy cechy i mżliwści wszystkich przyszłych biektów tej klasy. Obiekt jest t egzemplarz (instancja) danej klasy. Metdy: peracje wyknywane na biektach. Są wyknywane na skutek wysłania d biektu kmunikatu, który wywłuje kreślną metdę (perację). Metdy nszą również nazwę funkcji składwych. Autr klasy mże: kreślić wszystkie peracje, jakie użytkwnik biektów klasy będzie na nich wyknywać, zagwarantwać, że każdy biekt będzie pprawnie zainicjwany, zapewnić, że biekt p wyknaniu każdej dpuszczalnej peracji będzie spełniał kreślne kryteria, zapewnić, że p zwlnieniu przez prgram pamięci zajmwanej przez biekt zstanie zwlnina pamięć pbrana w związku z funkcjnwaniem biektu, całkwicie ukryć reprezentację danych przed użytkwnikiem. 3.4.1 Hermetyzacja danych Tradycyjna struktura: dstęp d składwych jest niegraniczny. Hermetyzacja danych: dstęp d składwych jest graniczny za pmcą interfejsu. Prgramista aplikacji mże wyknywać na biekcie tylk te peracje, które przewidział prjektant klasy i które udstępnił publicznie. W języku C++ dstęp d składwych klasy jest kreślany za pmcą słów kluczwych: Zalety: private: składwe nie są dstępne dla klienta klasy (aplikacji krzystającej z klasy), dstęp d tych składwych mają tylk metdy klasy, public: składwe są dstępne dla klienta klasy, prtected: wykrzystywane pdczas dziedziczenia. zapewnienie spójnści atrybutów biektu, mżliwść weryfikacji teg, czy wyknywana peracja jest dzwlna w kreślnej sytuacji i dla kreślnych parametrów funkcji. 7
Przykład wersja A: Prgramwanie biektwe Wykład 1 Materiały: dr inż. Bżena Łpuch #include <istream> using namespace std; // DEFINICJA KLASY class TV private: int prgram; // nr prgramu Atrybuty biektów klasy TV bl wlaczny; // czy dbirnik włączny? public: // INTERFEJS KLASY Operacje dstępne dla biektów klasy TV // --knstruktr - przypisanie wartści pczątkwych składwym prywatnym TV() prgram=2; wlaczny=false; // ---metdy klasy vid zmienprgram(int p) if (wlaczny) prgram=p; else cut << "Najpierw wlacz TV" << endl; vid wlacz() wlaczny=true; cut << "Wlaczylem TV" << endl; vid wylacz() wlaczny=false; cut << "Wylaczylem TV" << endl; int gladam() return prgram; ; // // KLIENT KLASY int main () TV kuchniatv; twrzymy biekty TV pkjtv; kuchniatv.zmienprgram(4); kuchniatv.wlacz(); cut << "Prgram: " << kuchniatv.gladam()<<endl; kuchniatv.zmienprgram(4); cut << "Prgram: " << kuchniatv.gladam()<<endl; kuchniatv.wylacz(); wysyłamy kmunikaty d biektu pkjtv.wlacz(); cut << "Prgram: " << pkjtv.gladam()<<endl; pkjtv.wylacz(); return 0; 8
Przykład wersja B: Prgramwanie biektwe Wykład 1 Materiały: dr inż. Bżena Łpuch #include <istream> using namespace std; // DEKLARACJA KLASY class TV private: int prgram; // nr prgramu bl wlaczny; // czy dbirnik włączny? public: // INTERFEJS KLASY // knstruktr - przypisanie wartści pczątkwych składwym prywatnym TV(); // metdy klasy vid zmienprgram(int p); vid wlacz(); vid wylacz(); int gladam(); ; //Kniec definicji klasy // DEFINICJE METOD KLASY TV::TV() prgram=2; wlaczny=false; vid TV::zmienPrgram(int p) if (wlaczny) prgram=p; else cut << "Najpierw wlacz TV" << endl; vid TV::wlacz() wlaczny=true; cut << "Wlaczylem TV" << endl; vid TV::wylacz() wlaczny=false; cut << "Wylaczylem TV" << endl; int TV::gladam() return prgram; // // KLIENT KLASY int main () TV kuchniatv; kuchniatv.zmienprgram(4); kuchniatv.wlacz(); cut << "Prgram: "<< kuchniatv.gladam()<<endl; kuchniatv.zmienprgram(4); cut << "Prgram: " << kuchniatv.gladam()<<endl; kuchniatv.wylacz(); TV pkjtv; pkjtv.wlacz(); cut << "Prgram: " << pkjtv.gladam()<<endl; pkjtv.wylacz(); return 0; 9
Prgramwanie biektwe Wykład 1 Materiały: dr inż. Bżena Łpuch Definicja klasy ma pstać: 3.4.2 Klasa - definicja class nazwa_klasy private: // pla danych i funkcje prywatne typ nazwa_zmiennej; public: // pla danych i funkcje publiczne typ nazwa_funkcji(); prtected: // pla danych i funkcje chrnine ; W skład klasy wchdzą: pla danych: zmienne, które służą d przechwania wartści atrybutów biektu, metdy (funkcje składwe): funkcje, które kreślają zachwanie biektu, pzimy dstępu d składwych: d teg, na którym pzimie znajduje się składwa zależy mżliwść dstępu d niej z innych miejsc prgramu. Składwe (dane i metdy) zadeklarwane w sekcji public są dstępne w całym prgramie. Twrzą ne publiczny interfejs klasy, za pmcą któreg krzystamy z biektu. Składwe (dane i metdy) zadeklarwane w sekcji private są dstępne jedynie w funkcjach składwych klasy. Ich zadaniem jest ukrycie danych i wewnętrznych prcedur biektu. Składwe (dane i metdy) zadeklarwane w sekcji prtected są dstępne jedynie w funkcjach składwych klasy i w funkcjach składwych jej klas pchdnych (dziedziczących). (Patrz: dziedziczenie). Specyfikatry dstępu (ang. access specifiers) public, private i prtected mgą w definicji klasy występwać wielkrtnie. Jeśli pierwszą grupą składwych knstrukcji class są składwe prywatne, t mżna przed nimi pminąć kwalifikatr private. Obwiązuje zasada, że dpóki w brębie definicji klasy nie wystąpi w spsób jawny inny kwalifikatr (na przykład public lub prtected), wszystkie dane i metdy są autmatycznie zakwalifikwane jak prywatne. Klasę mżna definiwać za pmcą knstrukcji class lub struct. Klasa pisana za pmcą słwa class jest klasą, w której wszystkie składwe są prywatne ( ile teg nie zmienimy za pmcą na przykład słwa public). Klasa pisana za pmcą słwa struct jest klasą, w której wszystkie składwe są publiczne ( ile teg nie zmienimy za pmcą na przykład słwa private). Czyli zapis struct S ; jest p prstu skrótem zapisu class S public: ; 10
Prgramwanie biektwe Wykład 1 Materiały: dr inż. Bżena Łpuch Pla danych: Metdy: 3.4.3 Klasa - składwe W ciele klasy mżna używać deklaracji dwlnych danych i struktur danych istniejących w języku C++. Nie wln inicjwać składwych. Mżna umieszczać w ciele klasy prttyp funkcji składwej (deklarację), zaś definicję funkcji umieszczać na zewnątrz; należy ją wtedy pprzedzić identyfikatrem klasy wraz z peratrem zasięgu. Każda metda zdefiniwana wewnątrz klasy jest uważana za funkcję rzwijaną w miejscu (wplataną, ang. inline), bez względu na t, czy zstanie pprzedzna słwem kluczwym inline. Jeśli funkcja składwa definiwana na zewnątrz ma być funkcją typu inline, należy pprzedzić ją kwalifikatrem inline. class MjaKlasa private: // pla danych i funkcje prywatne public: // pla danych i funkcje publiczne // ta funkcja jest definiwana w ciele klasy vid Fun1(int a) // instrukcje funkcji // ta funkcja jest tylk deklarwana w ciele klasy, // jest t zapwiedź funkcji, której definicja // znajduje się na zewnątrz klasy vid Fun2(int, int); ; // Definicja funkcji Fun2 vid MjaKlasa::Fun2(int a, int b) // instrukcje funkcji Metdy (funkcje składwe) mżna pdzielić na następujące kategrie: funkcje zarządzające stswane autmatycznie w mmencie twrzenia biektu klasy (knstruktry) i w mmencie jeg usuwania (destruktry); należą najczęściej d składwych publicznych; funkcje dstępu ich zadaniem jest udstępnienie składwych prywatnych klasy; należą d składwych publicznych; funkcje przetwarzające dknują peracji na składwych klasy, mgą krzystać z funkcji pmcniczych; należą d składwych publicznych; funkcje pmcnicze wykrzystywane przez inne kategrie funkcji; zazwyczaj są t składwe prywatne. 11
Prgramwanie biektwe Wykład 1 Materiały: dr inż. Bżena Łpuch 3.4.4 Obiekty Obiekt t pjedyncze, indywidualne wystąpienie klasy. Obiekty definiuje się pdbnie d zmiennych, umieszczając listę identyfikatrów za nazwą klasy. // definicja zmiennej int x; // definicja zmiennej x // definicja klasy class MjaKlasa // tutaj definicja składwych klasy MjaKlasa ; // definicje biektów MjaKlasa a; // definicja biektu a typu MjaKlasa MjaKlasa b,c; // definicja biektów b i c Prces twrzenia biektu plega na przydzieleniu mu bszaru pamięci wystarczająceg dla składwych będących danymi i strukturami danych, p czym wywływana jest metda będąca knstruktrem biektu. Odwłania d składwych biektu uzyskuje się za pmcą peratra "." umieszczneg p nazwie biektu. Przykład: MjaKlasa a; // deklaracja biektu a a.drukuj(); // wywłanie metdy Drukuj na rzecz biektu a Funkcje składwe (metdy) muszą być wywływane RAZEM z biektem. Metdy są takie same dla wszystkich biektów danej klasy. Dane przechwywane w biektach są różne. 12