Programowanie obiektowe (object oriented programming) to...

42
Wykłady z Programowania Obiektowego 1 Programowanie obiektowe (object oriented programming) to metodologia tworzenia programów komputerowych, która definiuje programy za pomocą obiektów – elementów łączących stan (czyli dane) i zachowanie (czyli procedury u nas są to metody). Obiektowy program komputerowy wyrażony jest jako zbiór takich obiektów komunikujących się pomiędzy sobą w celu wykonania zadań. Podejście to różni się od tradycyjnego programowania proceduralnego, gdzie dane i procedury nie są ze sobą bezpośrednio związane. Programowanie obiektowe ma ułatwić pisanie, konserwacje i wielokrotne użycie programów lub ich fragmentów. Głównym problemem, który jawił się przy tworzeniu oprogramowania była jego rosnąca złożoność, pierwsze języki programowania to były języki maszynowe typu asembler, gdzie złożoność i możliwość zapanowania nad większym programem była trudna, bo pracowaliśmy na małej granulacji, jeśli chodzi o metody wykonywania różnego rodzaju poleceń. Kolejnym krokiem było uściślenie sposobu programowania pod kątem języka C, tutaj pojawiła się koncepcja programowania strukturalnego, czyli podzieliliśmy program na szereg funkcji, mamy do tego różnego rodzaju mechanizmy pozwalające sterować kolejnością wykonania kodu czyli pętle, mechanizmy typu switch itp. Wstępem do porządkowania, przeniesienia świata rzeczywistego do oprogramowania było wykorzystanie struktur. Struktura definiowała zbiór parametrów, czyli mieliśmy nazwę i ten zbiór parametrów, który opisywał taki jakby paraobiekt. Mogliśmy wiec opisać, stworzyć obiekt typu szachownica na której mieliśmy określoną liczbę pól, wyszczególnić które pola są aktualnie zajęte, jaka figura się na tych polach znajduje itp. Jednak same struktury są jedynie pogrupowaniem zbioru atrybutów i to było za mało. To był tylko szereg metod wywoływanych w określony sposób, które wykonywały pewnego rodzaju działania. Statystyki które mówią o porażkach programów wymusiły konieczność lepszego modelowania w programowaniu świata rzeczywistego. Bo wcześniej w granicach 50% projektów trwało dłużej niż planowano, czyli były przekraczane budżety czasowe i finansowe, a około 75% programów to były programy, które nie działały tak jak potrzeba, była tylko zrealizowana specyfikacja, ale były błędy w działaniu programu. Koło 25% projektów były porzucane, bo ich budżet finansowy i czas znacznie przekraczał planowane założenia ze względu na złożoność możliwość budowania dużych rzeczy. Zatem całe programowanie obiektowe jest zorientowane na tworzenie obiektów, które są ze sobą powiązane i te obiekty łączą dwie charakterystyczne cechy jakimi są obiekt ze świata rzeczywistego, który jest opisany jakimś zbiorem danych i ten zbiór danych to pewien stan tego obiektu np. obiekt samochód ma zbiornik i zbiornik też jest obiektem i w tym zbiorniku jest określona ilość paliwa i ta ilość paliwa to stan obiektu, za jego pomocą możemy opisać np. maksymalną pojemność zbiornika. Druga cecha obiektu to zachowanie czyli jakie metody można wywołać np. samochód można uruchomić, samochód ma jakiś stan np. jedzie z określoną prędkością lub stoi i metoda uruchom, zatrzymaj itp. Generalnie koncepcja ta prowadzi do tego, by cały program był stworzony z obiektów, które są w jakiś sposób powiązane, tak by można było tworzyć skomplikowane struktury. Poprawne podejście jest takie, że w programie mamy same obiekty, nie mówimy tutaj o jakiś metodach, które znajdują się ponad typu zmienne globalne, tutaj wszystko mamy pozamykane w obiektach, w obiekcie możemy mieć kolejne obiekty, dany obiekt jest opisany zbiorem atrybutów i zachowań, czyli zmiennych i metod,. Jako zmienne wykorzystujemy typy wbudowane, a zamiast tych typów możemy użyć zbudowane obiekty przez nas. Podejście obiektowe:

Transcript of Programowanie obiektowe (object oriented programming) to...

Page 1: Programowanie obiektowe (object oriented programming) to ...kolos.math.uni.lodz.pl/~archive/Programowanie obiektowe/Notatki pod... · Język uml to język generyczny (takie modelowanie

Wykłady z Programowania Obiektowego 1

Programowanie obiektowe (object oriented programming) to metodologia tworzenia programów komputerowych, która definiuje programy za pomocą obiektów – elementów łączących stan (czyli dane) i zachowanie (czyli procedury u nas są to metody).

Obiektowy program komputerowy wyrażony jest jako zbiór takich obiektów komunikujących się pomiędzy sobą w celu wykonania zadań. Podejście to różni się od tradycyjnego programowania proceduralnego, gdzie dane i procedury nie są ze sobą bezpośrednio związane. Programowanie obiektowe ma ułatwić pisanie, konserwacje i wielokrotne użycie programów lub ich fragmentów.

Głównym problemem, który jawił się przy tworzeniu oprogramowania była jego rosnąca złożoność, pierwsze języki programowania to były języki maszynowe typu asembler, gdzie złożoność i możliwość zapanowania nad większym programem była trudna, bo pracowaliśmy na małej granulacji, jeśli chodzi o metody wykonywania różnego rodzaju poleceń.

Kolejnym krokiem było uściślenie sposobu programowania pod kątem języka C, tutaj pojawiła się koncepcja programowania strukturalnego, czyli podzieliliśmy program na szereg funkcji, mamy do tego różnego rodzaju mechanizmy pozwalające sterować kolejnością wykonania kodu czyli pętle, mechanizmy typu switch itp. Wstępem do porządkowania, przeniesienia świata rzeczywistego do oprogramowania było wykorzystanie struktur. Struktura definiowała zbiór parametrów, czyli mieliśmy nazwę i ten zbiór parametrów, który opisywał taki jakby paraobiekt. Mogliśmy wiec opisać, stworzyć obiekt typu szachownica na której mieliśmy określoną liczbę pól, wyszczególnić które pola są aktualnie zajęte, jaka figura się na tych polach znajduje itp. Jednak same struktury są jedynie pogrupowaniem zbioru atrybutów i to było za mało. To był tylko szereg metod wywoływanych w określony sposób, które wykonywały pewnego rodzaju działania.

Statystyki które mówią o porażkach programów wymusiły konieczność lepszego modelowania w programowaniu świata rzeczywistego. Bo wcześniej w granicach 50% projektów trwało dłużej niż planowano, czyli były przekraczane budżety czasowe i finansowe, a około 75% programów to były programy, które nie działały tak jak potrzeba, była tylko zrealizowana specyfikacja, ale były błędy w działaniu programu. Koło 25% projektów były porzucane, bo ich budżet finansowy i czas znacznie przekraczał planowane założenia ze względu na złożoność możliwość budowania dużych rzeczy.

Zatem całe programowanie obiektowe jest zorientowane na tworzenie obiektów, które są ze sobą powiązane i te obiekty łączą dwie charakterystyczne cechy jakimi są obiekt ze świata rzeczywistego, który jest opisany jakimś zbiorem danych i ten zbiór danych to pewien stan tego obiektu np. obiekt samochód ma zbiornik i zbiornik też jest obiektem i w tym zbiorniku jest określona ilość paliwa i ta ilość paliwa to stan obiektu, za jego pomocą możemy opisać np. maksymalną pojemność zbiornika. Druga cecha obiektu to zachowanie czyli jakie metody można wywołać np. samochód można uruchomić, samochód ma jakiś stan np. jedzie z określoną prędkością lub stoi i metoda uruchom, zatrzymaj itp.

Generalnie koncepcja ta prowadzi do tego, by cały program był stworzony z obiektów, które są w jakiś sposób powiązane, tak by można było tworzyć skomplikowane struktury. Poprawne podejście jest takie, że w programie mamy same obiekty, nie mówimy tutaj o jakiś metodach, które znajdują się ponad typu zmienne globalne, tutaj wszystko mamy pozamykane w obiektach, w obiekcie możemy mieć kolejne obiekty, dany obiekt jest opisany zbiorem atrybutów i zachowań, czyli zmiennych i metod,. Jako zmienne wykorzystujemy typy wbudowane, a zamiast tych typów możemy użyć zbudowane obiekty przez nas.

Podejście obiektowe:

Page 2: Programowanie obiektowe (object oriented programming) to ...kolos.math.uni.lodz.pl/~archive/Programowanie obiektowe/Notatki pod... · Język uml to język generyczny (takie modelowanie

Wykłady z Programowania Obiektowego 2

- wszystko jest obiektem- program jest zbiorem obiektów, które wysyłają sobie komunikaty- każdy obiekt posiada pamięć na którą składają się inne obiekty- każdy obiekt posiada swój typ- wszystkie obiekty tego samego typu mogą otrzymywać te same komunikaty

Tworzenie oprogramowania to jedno, ale trzeba je jeszcze utrzymać i rozbudować, a rozbudowa programowania obiektowego jest znacznie łatwiejsza, bo możemy obiekty zgrupować w pakiety i potem z nich korzystać. Obiekty stają się dla nas czarnymi skrzynkami, gdzie mamy obiekt kalkulator, który jest złożony z wielu elementów, ale my dajemy tylko dane wsadowe.

Wszystko jest obiektem, nie ma sytuacji by coś było zmienną globalną itd. Można w c++ stworzyć zmienną globalną, ale nie będzie to zgodne z podejściem obiektowym. Obiekt staje się typem, tak jak mamy typy na zasadzie int tak obiekt samochód stanie się typem, obiekt jest klasą, klasa czyli wzorzec z którego powstają konkretne implementacje.

Cechy obiektu- stan – dane wewnętrzne- zachowanie – zestaw metod do wykonania- identyfikacja – każdy obiekt można w sposób jednoznaczny odróżnić od innych obiektów

Jak stworzymy obiekt macierz, to w macierzy mamy pola macierzy, które możemy zamodelować za pomocą tablicy, musimy określić wielkość tej macierzy, czyli cechy obiektu na przykładzie macierzy, wymiar ten będzie warunkował pojemność macierzy, poszczególne pola mogą być opisane za pomocą wbudowanego typu tablicowego lub kolejnego obiektu typu pole.

Class macierz{

Pole[] tab_p; //tablica, bo macierz ma rozmiar stanInt rozmiar; stan+ //możemy przeładować operator dodawania, operator jest metodą zachowanieLubPublic macierz dodaj(macierz A, macierz B) zachowanie

Private Resetuj() zachowanie

Class Pole{

Int value;Public getPublic set

}} //mamy obiekt w obiekcie to była definicja naszych typów

Getter i setter – to pozwala ustawić wartość, nie ma tego w c++ ale jest w c# i w Java.

Jak mamy taki obiekt, taką klasę, to coś abstrakcyjnego, z tego typu możemy zainicjalizować instancję danego obiektu. Mamy wzorzec, klasę koń i w tym momencie jak zainicjalizujemy ten obiekt to mamy konkretny egzemplarz danego konia, cos co jest w pamięci, coś co stanie się już typem rzeczywistym.

Obiekty i klasy

Page 3: Programowanie obiektowe (object oriented programming) to ...kolos.math.uni.lodz.pl/~archive/Programowanie obiektowe/Notatki pod... · Język uml to język generyczny (takie modelowanie

Wykłady z Programowania Obiektowego 3

- klasa to złożony typ danych składający się z pól przechowujących dane oraz posiadający metody wykonujące zaprogramowane czynności- obiekt może reprezentować cokolwiek. Każdy obiekt należy do pewnej klasy. Definicja klasy zawiera pola z których składa się ów obiekt, oraz metody, którymi dysponuje- klasa jest więc wzorcem na podstawie którego powołujemy do życia obiekty.

Obiekt znajduje się w pamięci w trakcie wykonywania programu, a klasa jest wzorcem…

Pola i metody- obiekty zawierają pola, czyli zmienne. Ich rolą jest przechowywanie pewnych informacji o obiekcie – jego charakterystyki- obiekt może wykonywać na sobie pewne działania, a więc uruchamiać zaprogramowane funkcje. Nazywamy je metodami albo funkcjami składowymi. Czynią one obiekt tworem, aktywnym – nie jest on jedynie pojemnikiem na dane, lecz może samodzielnie nimi manipulować

Dalsza część naszego programu, chcemy by się wykonywała:Macierz m = New macierz() //mamy rzeczywisty obiekt, jego instancja będzie rzeczywista w trakcie wykonywania programu i możemy zmieniać jego stan, modyfikować pola tego obiektu, np. zmieńmy rozmiar:M rozmiar=3; //do kwestii public dojdziemy, to jest modyfikator dostępu, w c++ są trzy, w Java są 4. Kolejne co możemy zrobić to np.M dodaj(m1, m2); //uwaga na wielkie litery wszędzie muszą być takie same tylko Word mi sam zmienia, jak dodamy dwie macierze, to macierz wynikowa będzie trzecim obiektem M . dodaj(m1) // podobnie jak w strukturachMetodę definiujemy POD ciałem klasy to taki ładny zwyczaj.

Metoda- metoda w programowaniu obiektowym jest to funkcja składowa klasy, której zadaniem jest działanie na rzecz określonych elementów danej klasy lub klas z nią spokrewnionych (zob. też dziedziczenie)- metody wiąże się z klasami głównie po to aby nie zaśmiecać kodu źródłowego i samego programu nadmierna ilością funkcji globalnych, które i tak nie zostaną użyte w innym celu niż na rzecz konkretnej klasy- inną ich zaletą jest to, że metoda wewnętrzna danej klasy ma dostęp do wszystkich składników tej klasy (także prywatnych i chronionych) bez konieczności deklarowania zaprzyjaźnienia

Samochód osobowy dziedziczymy z klasy środków transportu i ileś rzeczy są po prostu wspólne dla całej klasy środków transportu, a potem nasz samochód będziemy uszczegóławiali. Metody mogą być wewnętrzne i zewnętrzne, mogą być statyczne, czyli widziane przez wszystkie istniejące w programie klasy itp.

Konstruktory i destruktory- są to specjalne metody wywoływane podczas tworzenia obiektu oraz jego usuwania (destruktory nie występują w Java, bo java sama zarządza pamięcią, nie ma wycieków pamięci, w c++ często tworzymy kolejne obiekty bez zwalniania pamięci, dlatego nam są potrzebne destruktory, a w Java jest łatwiej)- konstruktor nie może posiadać definicji zwracanego typu- konstruktor bez żadnych argumentów jest konstruktorem domyślnym- nazwa destruktora musi być poprzedzona znakiem tyldy (c++) u nas byłoby ~Macierz- destruktor nie posiada definicji typu zwracanego oraz nie przyjmuje żadnych argumentów (c++)- nazwy konstruktora i destruktora muszą być zgodne z nazwą klasy- konstruktor i destruktor muszą być zadeklarowane w części publicznej klasy

Page 4: Programowanie obiektowe (object oriented programming) to ...kolos.math.uni.lodz.pl/~archive/Programowanie obiektowe/Notatki pod... · Język uml to język generyczny (takie modelowanie

Wykłady z Programowania Obiektowego 4

- domyślny konstruktor może być przeciążany

Czyli macierz musi posiadać konstruktor, który zarezerwuje miejsca na pola, a pole musi zawierać konstruktor, który zarezerwuje pamięć na dane pole powiedzmy int. Uwaga by nie gubić referencji. Więcej o konstruktorach będzie na 4 wykładzie typu konstruktor kopiujący itp.

Przeciążenie i przeładowanie to dwa różne terminy. Konstruktor możemy przeciążyć, możemy stworzyć kilka konstruktorów np. podstawowy który zainicjalizuje pola macierzy np. 0ami a potem inny konstruktor.

Paradygmaty programowania obiektowego- abstrakcja- enkapsulacja (hermetyzacja)- dziedziczenie- polimorfizm

Abstrakcja – bierzemy świat rzeczywisty grupujemy go w elementy, elementy stają się obiektami, obiektom przypisujemy zachowanie, stan.

Język uml to język generyczny (takie modelowanie obiektowe) czyli potem są narzędzia, które przekształcą nam naszą strukturę w dany język klas - java czy c++.

Polimorfizm tu będzie przeładowanie itp.

Abstrakcja- umiejętność wyodrębniania cech istotnych dla danego problemu- 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 typy UZUPELNIC

Klasa abstrakcyjna (w Java nie ma)- nie posiada obiektów , czyli nie posiada stanu, posiada metody i interfejsy- używana do definicji interfejsu dla klas z niej wywiedzionych

Interfejsy w Java to to, co mówi nam jak się obiekt może zachowywać, czyli wyrzucamy stan, zostało tylko zachowanie. Mówimy o tym jak obiekty się będą zachowywały, a to jaki będą miały stan to możemy dospecyfikować później.

Metoda abstrakcyjna- nie została jeszcze zaimplementowana (tylko zadeklarowana, aby zaimplementować ją w klasach potomnych) - deklarowana jedynie wewnątrz klasy abstrakcyjnej (klasa posiadająca przynajmniej jedną metodę abstrakcyjną jest klasą abstrakcyjną)UZUPELNIC

Enkapsulacja-UZUPELNICCzyli ukrywanie implementacji, hermetyzacja, zapewnia, że obiekt nie może zmienić stanu wewnętrznego innych obiektów w nieoczekiwany sposób. Tylko wewnętrzne 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. Pewne języki osłabiają to założenie, dopuszczając pewien poziom bezpośredniego (kontrolowanego) dostępu do ‘wnętrzności” obiektu. Ograniczają w ten sposób poziom abstrakcji- ukrycie wewnętrznej implementacji klas

Page 5: Programowanie obiektowe (object oriented programming) to ...kolos.math.uni.lodz.pl/~archive/Programowanie obiektowe/Notatki pod... · Język uml to język generyczny (takie modelowanie

Wykłady z Programowania Obiektowego 5

- dostęp do obiektów poprzez wyspecyfikowany interfejs- interakcja z obiektami przez wysyłanie komunikatów (wywołania publicznych metod)- zalety : ochrona i elastyczność kodu

Podzieliliśmy już sobie wszystko na obiekty, ale możemy chcieć ukryć implementację. Przygotowujemy obiekty, które stanowią jakby naszą bibliotekę i kto będzie z niej korzystał niech się nie wgryza w to jak my te obiekty stworzyliśmy, niech sobie dodaje macierz, inicjalizuje pola, ale niech tego programisty nie interesuje jak my to robimy czy za pomocą tablicy czy jakoś inaczej. Czyli ukrywamy też atrybuty. Można rozszerzać, ale nie da się ingerować w to co już jest,. Pozwala to na większą spójność. Wtedy nikt nie może przerobić tego co my już zrobiliśmy, on dla kogoś ma tylko działać. Klasa abstrakcyjna w c++, w c# czy Java jest to interfejs właśnie po to by ludzie nam nie grzebali w tym co zrobiliśmy. I tu znów istotne są słówka public itp. Interfejs to to co widzi inny programista korzystający z mojej pracy.

Poziomy kontroli dostępu- public – dostępne dla każdego (to co jest w kodzie klasy będzie widoczne na zewnątrz)- private – tylko twórca klasy- protected – dostęp mają tylko dana klasa i klasy dziedziczące

Określają w jaki sposób mają być widoczne poszczególne metody i pola danej klasy. W niektórych językach programowania niezadeklarowanie private sprawi, że cos będzie zawsze widoczne, analogicznie w drugą stronę.

DziedziczeniePorządkuje i wspomaga polimorfizm i enkapsulację (protected) dzięki umożliwieniu definiowania i tworzenia specjalizowanych obiektów na podstawie bardziej ogólnych. Dla obiektów specjalizowanych nie trzeba redefiniować całej funkcjonalności, lecz tylko tę, której nie ma obiekt ogólniejszy. W typowym przypadku powstają grupy obiektów zwane klasami, oraz grupy klas zwane drzewami. Odzwierciedlają one wspólne cechy obiektów:- technika wykorzystania istniejących fragmentów kodu polega na tworzeniu nowych klas na bazie już istniejących- cechy wspólne dla wszystkich podklas definiowane są w nadklasie- podklasa może: korzystać z cech nadklasy, nadpisywać zachowanie nadklasy, dodawać nowe atrybuty i zachowanie

Np. mamy klasę środki komunikacji, które mogą się poruszać, zatrzymać, posiadać pewną prędkość. Narzucamy sposób budowania tych środków komunikacyjnych, czyli mówimy, że chcemy by właśnie tak wyglądały środki komunikacyjne. Przy dziedziczeniu jak programista chce stworzyć obiekt samochód, to tez będzie mógł go uruchomić, zatrzymać, ale np. samochód ciężarowy będzie miał dalsze cechy typu ładowność i to jest nasze dospecyfikowanie, tak samo z samolotem tam dospecyfikujemy lot w górę i w dół. Uwaga na dziedziczenie wielokrotne np. jak będziemy mieć amfibię, która może dziedziczyć pole prędkość z łodzi i samochodu i pytanie jak ma do tego podejść, dlatego Java nie pozwoli na coś takiego.

PolimorfizmReferencje i kolekcje obiektów mogą dotyczyć obiektów różnego typu, a wywołanie metody dla referencji spowoduje zachowanie odpowiednie dla pełnego typu obiektu wywoławczego. Niektóre języki udostępniają bardziej statyczne (w trakcie kompilacji) rozwiązania polimorfizmu – na przykład szablony i przeciążanie operatorów w c++- pozwala w jednolity sposób traktować obiekty klas z hierarchii dziedziczenia przy zachowaniu ich charakterystycznego zachowania- od strony technicznej sprowadza się do tzw. późniejszego wiązania metod przy ich wywołaniu (wybór metody na podstawieUZUPELNIC

Page 6: Programowanie obiektowe (object oriented programming) to ...kolos.math.uni.lodz.pl/~archive/Programowanie obiektowe/Notatki pod... · Język uml to język generyczny (takie modelowanie

Wykłady z Programowania Obiektowego 6

Np. jak mamy klasę środki transportu to w niektórych miejscach nie musimy wiedzieć jaki typ będzie występował, np. jak mamy człowieka, to on może uruchomić środek transportu, ale nie wiemy który z tych środków transportu będzie on uruchamiał i polimorfizm mówi, ze człowiek może wywołać metodę uruchom na środku komunikacji i w trakcie kompilacji kompilator podstawi pod ogólną klasę środków transportu konkretny obiekt typu samochód.

Wczesne i późne wiązania- wczesne wiązanie: kompilator generuje wywołanie funkcji, program łączący zamienia nazwę na konkretny adres- późne wiązanie UZUPEŁNIĆ

Różne podejście do realizacji paradygmatuNiektóre języki wprowadzając modyfikacje do założeń obiektowościUZUPEŁNIĆ

Dziedziczenie wielokrotne- Dostępne jest w c++, Pyton, Incr Tcl- tylko interfejsu : object Pascal, Java, c#- dziedziczenie wielkrotne tylko metod: Ruby

Klasa jest obiektem- tak Ruby Python- nie: c++, c#

Instrukcja do – whileSkładnia: do instrukcja (wyrażenie)PrzykładDo{

Char ch;Cin >> ch;Cout << ch;

}While ( ch!=’q’);Pętla wykonuje się tak długo, jak warunek jest prawdziwy. Warunek jest sprawdzany na końcu pętli.

Język c++ nie jest idealny jeśli chodzi o programowanie obiektowe, chociażby dlatego, bo pozwala na pisanie językiem strukturalnym w sensie bez klas a ze strukturami. C++ jest bardzo elastycznym językiem, a programy mogą zawierać masę błędów ideologicznych. Java jest oczywiście lepsza… Bo bardziej restrykcyjna.

C++ składa się z programu (treści wykonywanej aplikacji), wejście do programu (funkcja main)

#include <iostream>#include<inne biblioteki>using namespace std; int main() //miejsce gdzie zaczyna się program, nie jest ustalone w c++ czy to będzie int czy void{

Cout << “Hello” <<”\n”; //cout to obiekt, << to operator przesunięcia bitowego w prawo, ten operator został przeładowany do tego by wypisać na standardowe wyjście za pomocą obiektu cout wartość, która znajduje się po prawej

Page 7: Programowanie obiektowe (object oriented programming) to ...kolos.math.uni.lodz.pl/~archive/Programowanie obiektowe/Notatki pod... · Język uml to język generyczny (takie modelowanie

Wykłady z Programowania Obiektowego 7

stronie, operator ten działa prawostronnie, cout sam nie skończy nam linii dlatego potrzebujemy /n}

Ten program jeszcze nie bazuje na paradygmacie programowania obiektowego, a gdybyśmy to samo pisali w javie to tam już funkcja main byłaby zwarta w klasie. Czyli tam obiekt który jest początkiem programu jest klasą. Wskaźniki i tablice pokrywają się z C np. zapisz tablicę 4wyamirową jako tablicę 1wymiarową za pomocą wskaźników…Potrzebny byłby wzór działający na miejscach pamięci do których się odwołują wskaźniki. Są takie same testy – if, else, pętle.

W Javie mamy pętle nieskończoną for(;;) oraz pętle iterującą po obiektach, iterowane jest od początku do końca bez wskazywania obiektów po których chcemy iterować.

Mamy dwa rodzaje typów – wbudowane (char, int, long) i typy zmiennoprzecinkowe (double, float). Operacje arytmetyczne są te co zawsze, ale te operatory możemy przeładowywać np. by + oznaczał operator dodawania dwóch macierzy, bo standardowo możemy dodawać tylko zmienne typów wbudowanych liczbowych.

Mamy też operatory bazujące na relacjach: relacja równości, różności, przypisania (je też możemy przeładowywać).++ operator inkrementacji (preinkrementacje i postinkrementacje)Int i=1;I++;//mamy zmienna i ta zmienna jest zwiększana (post)To i=2++i //najpierw zwiększamy a dopiero potem przypisujemy do zmiennejTo wyjdzie i=3.Char t[12] to [] tez są operatorami które możemy przeładować. Wyszedł nam typ tablicowy 10 znaków indeksowany 0..9. t jest wskaźnikiem na zerowy element. &t[2] – miejsce w pamięci trzeciego elementuInt main(){

Int i=1I++;{

I=1I--;Cout<<i;//będize 0

}Cout<<i; //będzie 2 bo się zmienne przesłaniają w tych blokach

}

Int i=1If(i%2) //wartość modulo tu wyjdzie 1 czyli różne od zera wiec to jest spełnione, zwraca resztę z dzielenia{

Cout << i%2;}Else

Cout<<i%2;

Wyświetlona będzie 1.

Gdybyśmy chcieli przeiterować tablicę int t[10]; i wypisać wszystkie wartości (for, do-while, while:

For(int i=0;i<10;i++)

Page 8: Programowanie obiektowe (object oriented programming) to ...kolos.math.uni.lodz.pl/~archive/Programowanie obiektowe/Notatki pod... · Język uml to język generyczny (takie modelowanie

Wykłady z Programowania Obiektowego 8

{Cout << t[i]; //Baton przy tablicy I komentarz Knoota – ‘Uroczo tylko niewyraźnie”// cout << * (t+i)}

I=0;Do{

Cout << t[i];I++;

}while (i<10);

Int i=0;While (i<10){

Cout <<I++;

}

Break i continueInstrukcja break wewnątrz pętli powoduje natychmiastowe wyjście z niej. W przypadku zagnieżdżonych pętli wyjście dotyczy tylko jednej (wewnętrznej pętli). Instrukcja continue powoduje natychmiastowe przejście do sprawdzania warunku pętli.

Dla macierzyFor(i…)

For (j..)Break (wyjdziemy do pętli wyżej)Return (wyjdziemy z obu pętli)Continua (sprawdzi nam warunek pierwszego for)

For(;;){

Char ch;Cin>>ch;If (ch==’q’) break;If (ch==’a’){

Cout << ‘Ala ma kota”<<endl;Continue;

}If (ch==’b’) cout <<”Bee!”<<endl;

}

Instrukcja switchInstrukcja switch pozwala na wybór warianty w zależności od wartości podanego wyrażenia całkowitego.

Składnia:Switch (wyrażenie){

Case stala1: ciąg instrukcjiCase stala2: ciag instrukcjiDetault: ciag instrukcji

Page 9: Programowanie obiektowe (object oriented programming) to ...kolos.math.uni.lodz.pl/~archive/Programowanie obiektowe/Notatki pod... · Język uml to język generyczny (takie modelowanie

Wykłady z Programowania Obiektowego 9

}

Każdy z ciągów instrukcji powinien w zasadzie kończyć się instrukcją break, w przeciwnym wypadku zostanie wykonany….default…UZUPELNIC

Deklaracje funkcji:- Deklaracja funkcji umożliwia użycie funkcji zdefiniowane później lub w innym pliku- Deklaracja funkcji podaje typ wyniku funkcji, jej nazwę oraz typy argumentów- można (ale nie trzeba) podać nazwy argumentów- typ wyniku void oznacza, że funkcja nie daje wyniku- deklarację funkcji kończymy średnikiem

Definicje funkcji- definicja funkcji podaje jej nagłówek (podobnie jak deklaracja z tym, że tu nazwy argumentów są obowiązkowe) oraz treść- treść funkcji zawsze jest blokiem- definicji funkcji NIE kończymy średnikiem

Powrót z funkcji i dawanie wyniku- Instrukcja return [powoduje natychmiastowy powrót z funkcji- jeśli funkcja daje wynik (typ wyniku różny od void) argumentem dla return jest wyrażenie którego wartość stanie się wynikiem funkcjiRekurencja- podobnie jak w innych językach możemy definiować funkcje rekurencyjnie- każde wcielenie funkcji ma własne wartości parametrów i zmiennych lokalnych

Modyfikacja obiektów zewnętrznych- Argumenty funkcji są przekazywane prze wartość tj funkcja otrzymuje kopię wartości argumentu- zmiana wartości argumentu wewnątrz funkcji jest widoczna tylko wewnątrz funkcji- jeśli chcemy zmienić wartość obiektu zewnętrznego (z punkt widzenia funkcji) możemy przekazać wskaźnik do niego ( lub przez referencję) UZUPELNIC

Referencje- język c++ umożliwia w odróżnieniu od cp przekazywanie argumentów przez referencje void h (int &a)…UUZPELNIC

Wskaźniki do funkcjiVoid run (void (*paint)(){//…

(*paint)()}

Void paint(){

drawLine(100,100);}

Int main{Run(paint);}Argumentem funkcji run jest wskaźnik do funkcji bezwynikowejUZUPELNIC

Program w wielu plikach- program może być zapisany w wielu plikach źródłowych

Page 10: Programowanie obiektowe (object oriented programming) to ...kolos.math.uni.lodz.pl/~archive/Programowanie obiektowe/Notatki pod... · Język uml to język generyczny (takie modelowanie

Wykłady z Programowania Obiektowego 10

- w c++ podobnie jak w c nie ma jawnego systemu modułów- namiastkę modułu tworzymy zapisując jego interfejs w jednym pliku często z rozszerzeniem .h, a implementację w innym,- korzystając z modułu włączam jego interfejs dyrektywą preprocesora #include UZUPELNIĆ

Kompilacja i łączenie- każdy plik z implementacją kompilujemy do pliku obiektowego z rozszerzeniem .o (podWindows .obj) - na zakończenie łączymy uzyskane pliki obiektowe w pliku wykonywalny np.UZUPELNIC

MakefileZwykle wygodnie jest użyć programu make opisując proces kompilacji w MakefileUZUPOELNICW makefile mamy listę procedur które powodują odpowiednia kompilacje i linkowanie całego programu. Możemy sparametryzować nazwy poszczególnych plików, poustawiać flagi

Klasy pamięci

Modyfikator staticStatic w odniesieniu do zmiennej lokalnej nakazuje jej alokację statyczną, jej wartość będzie pamiętana pomiędzy wywołaniami funkcji- w odniesieniu do funkcji lub zmiennej globalnej static oznacza ‘ta nazwa ma nie być widoczna poza tym plikiem”

Voif f(){

Static int i=0;Cout << ++i<<endl;

}

Int main(){

For(x=0F()//wydrukuje 1..10

}

UZUPELNIC inkrementacje

StałeStałą możemy zadeklarować używając modyfikatora constStałe obowiązują te same reguły zasięgu co zmienne (tj możemy mieć stałe lokalne)- możemy pobrać adres stałej, ale nie możemy zmodyfikować komórki pamięci o tym adresieUZUPELNIC

Specyfikatory rozmiaru i znaku- do typów int oraz double można dodawać specyfikator rozmiaru short lub long, oznacza to sugestię użycia reprezentacji o mniejszym lub większym od standardowego zakresie UZUPEŁNIĆ

Domyślne wartości parametrów

Page 11: Programowanie obiektowe (object oriented programming) to ...kolos.math.uni.lodz.pl/~archive/Programowanie obiektowe/Notatki pod... · Język uml to język generyczny (takie modelowanie

Wykłady z Programowania Obiektowego 11

- deklarując argument funkcji można dopisać znak = i wyrażenie np. Int f(int a, inb=10)

- deklaruje się w ten sposób jego domyślna wartość- - funkcje można wywołać z tym argumentem Lu bez niego f(1,2) lub f(2)- - jako brakujący argument przejęta będzie wartość wyrażenia z deklaracji- - można mieć kilka domyślnych argumentów , ale wszystkie muszą być na końcu- Wyrażenie domyślne jest wyliczane przy każdym wywołaniu z brakującym

argumentem – uwaga na efekty uboczne int f(int a, int b=c++)Int g(int a, int b=h());- - wiązanie nazw odbywa się w miejscu deklaracji, zaś wartościowanie w miejscy

wywołaniaInt a=1UZUPELNIC

Przeciążanie funkcji- możemy mieć funkcje o tej samej nazwie, acz różniące się ilością lub typami argumentów- właściwa funkcja zostanie wybrana według argumentów w danym wywołaniuInt dov(int,int);Double div(double, double);Div(1,2) //wywołana będzie funkcja pierwsza, ciała tych funkcji mogą być zupełnie inneDiv(1.0,2.0);- uwaga na umieszczanie przeciążania i argumentów domyślnych UZUPELNIC

Jeszcze o operatorach:- operatory logiczne, bitowe(& - koniunkcja bitowa UZUOELNIC), sekwencjonowania, warunkowy, rzutowania , operator przypisanie, tworzenie nowego obiektuX<<=3 x przesuniemy bitowo chyba…

Napisy to tablice znaków, koniec napisu jest oznaczany znakiem o kodzie 0, stałe napisnjowe („…” UZUPELNIC

Argumenty funkcji mainFunkcja main w rzeczywistości ma argumenty i może dawać wynik:Int main (int…)- Arg to tablica argumentów programu- argc – to rozmiar tej tablicy- argv[0] to ścieżka dostępu di nazwa programu- envp to tablica zmiennych środowiskowych zakończona 0Wynik to tzw kod powrotu: 0 = sukces, co innego = kod błędu.

Struktury UZUPELNIC

Dynamiczna alokacja pamięci New i deleteInt *pf;Pf = nerw int; /alokacja pamięciDelete pf //zwolnieniePf = UZUPELNIC DUZO

Składowe klasyDeklaracja klasy opisuje składowe klasy:

Dane składowe – atrybuty polaSą to wartości przechowywane w obiektach klasy, mogą być dowolnego typu –podstawowego np. int, double lub tym wymyślony przez nas (mogą być również

Page 12: Programowanie obiektowe (object oriented programming) to ...kolos.math.uni.lodz.pl/~archive/Programowanie obiektowe/Notatki pod... · Język uml to język generyczny (takie modelowanie

Wykłady z Programowania Obiektowego 12

obiektami). Podajemy nazwę typu i potem zmienną np. string s, gdy stworzyliśmy klasę string. Pola odpowiadają za stan klasy, w polach są zapisane wyniki poszczególnych operacji.

Funkcje składowe – metodySą to operacje, jakie można wykonywać na obiektach klasy, deklaracja i definicja funkcji składowej klasy nie różni się od definicji ‘zwykłej’ funkcji w języku c++, w inny sposób się ją wywołuje, mianowicie wywołuje się ją dla określonego obiektu. Odpowiedzialne za działanie, zachowanie klasy.

Przypomnijmy, ze klasa to abstrakcyjny typ danych, który modeluje rzeczywistość. Mapowanie…

KonstruktorKonstruktor to specjalna metoda wywołana automatyczne w momencie tworzenia obiektu. Funkcją konstruktora jest inicjalizacja obiektu; w szczególności w konstruktorze nadaje się wartości początkowe składowym klasy (nie ma innego sposobu nadania wartości początkowych, jak tylko w konstruktorze).- konstruktor definiuje się jako metodę (publiczną, zastanowimy się nad protected, ale nie może być private, bo jest to wykonalne przy klasach zaprzyjaźnionych, ale będzie karkołomne) o nazwie takiej samej jak nazwa klasy- może mieć argumenty- konstruktor nie zwraca wartości- deklaracji ani definicji nie poprzedza się jednak słowem void

Jest kilka rodzajów konstruktorów, będzie o tym później. Konstruktor z góry określa stan klasy. Konstruktor domyślny – bezargumentowy. Konstruktor może zainicjalizować naszą tablicę. Jeśli go nie stworzymy, to zostanie on utworzony przy kompilacji programu, będzie wygenerowany przez kompilator i on tylko utworzy poszczególne pola i zaalokuje pamięć dla tych pól. Konstruktor to modyfikator dostępu. Jak mam klasę string to konstruktor by wyglądał tak:

StringChar[];Długość();Zamiananaduze();

public string() <- konstruktor domyślny bezargumentowyPublic string(char[]) <- inny konstruktor{

}

Przykład był fajny o stosie na slajdach. Stos() {n=0;} to był tam konstruktorStos stos; to było niejawne wywołanie konstruktora

Konstruktor może mieć argumenty:

Class zespolona{

Public:Zespolona(float r, float) {Re=r, im=i;}

Page 13: Programowanie obiektowe (object oriented programming) to ...kolos.math.uni.lodz.pl/~archive/Programowanie obiektowe/Notatki pod... · Język uml to język generyczny (takie modelowanie

Wykłady z Programowania Obiektowego 13

..Private:Float Re,im;…

}

Main{

Zespolona x(1.5,2.0) // argumenty dla konstruktora tak podajemyZespolona y = zespolona(0.1,34)// lub tak….

}

DestruktorDestruktor to specjalna metoda wywoływana automatycznie w momencie likwidacji obiektu, musimy mieć możliwość zwolnienia pamięci, jak chcemy zwolnić obiekt typu wbudowanego to ok., ale musimy umieć też usuwać obiekty typów stworzonych przez nas. Zwykle przydaje się jak alokujemy pamięć dynamicznie. Funkcją destruktora jest m.in. ‘sprzątanie’ po obiekcie, np. jeśli obiekt korzystał z dynamicznie przydzielonej mu pamięci w destruktorze powinna się tą pamięć zwolnić- destruktor definiuje się jako metodę (publiczną) o nazwie takiej samej jak nazwa klasy poprzedzonej znakiem ~- destruktor nie ma argumentów Anie nie zwraca wartości- deklaracji ani definicji nie poprzedza się jednak słowem void

Definicje funkcji składowychDefinicje funkcji składowych można umieścić- wewnątrz definicji klasy – wtedy kompilowane są jako inline- poza deklaracją klasy – wtedy kompilowane są jako zwykłe funkcje, chyba że zostaną poprzedzone słowem ‘inline’ wewnątrz definicji klasy umieszcza się deklarację takiej funkcji

Funkcja typu inline jest traktowana prze kompilator w sposób specjalny: kod będący wynikiem kompilacji takiej funkcji jest wprost wstawiany we wszystkie miejsca….UZUPELNIC

Przykład na slajdach.

Widoczność składowych klasy

Ze względu na prawa dostępu do składowych (widoczność) dzielą się one na trzy rodzaje:PrywatneSkładowe prywatne dostępne są tylko w obrębie klasy, widziane są tylko przez inne składowe tej samej klasy np. metodę prywatną klasy można wywołać jedynie w innych metodach tejże klasyPubliczneSkładowe publiczne są dostępne również spoza klasy, dla obiektów i metod innych klas, dla innych funkcjiChronioneWyjaśnienie nastąpi później po omówieniu dziedziczenia

Domyślnie jeśli nie określimy poziomu dostępu to składowa traktowana jest jako prywatnaSkładowe publiczne to te elementy klasy prze które komunikuje się ona z resztą programu. Zwykle robimy private pola a nie metody, choć oczywiście niekoniecznie, po prostu nie chcemy by nam ktoś zmieniał wartości, które my ustawiliśmy.

Page 14: Programowanie obiektowe (object oriented programming) to ...kolos.math.uni.lodz.pl/~archive/Programowanie obiektowe/Notatki pod... · Język uml to język generyczny (takie modelowanie

Wykłady z Programowania Obiektowego 14

Na kole będą wszystkie możliwe karkołomne rzeczy z private itp. Dobrze to jest wyjaśnione w Gręboszu.

Hermetyzacja

Hermetyzacja to technika programistyczna polegająca na tym, że jednostki programu ( w zależnościUZUPELNIOC

W językach obiektowych podstawową jednostką programistyczną jest klasa, a hermetyzację uzyskuje się przez wydzielenie części publicznej i prywatnej składowych klasy.

Przykład na slajdach. Cel:Zabezpieczenia obiektów klasy pzed niedozwolonymi operacjami (w przykładzie : np. uniemożliwiamy bezpośrednie manipulowanie wartością zmiennej n)- ukrycie szczegółów implementacyjnych przed użytkownikami klasy…UZUPELNIC

Przykład stosu zapisanego jako lista bez zmiany main na slajdach

W przykładzie tym konieczne było zdefiniowanie destruktora, ponieważ w trakcie życia obiektu klasy Stos dynamicznie tworzone są elementy listy. Kiedy obiekt taki ma przestaje istnieć, musi sam zadbać o to by zwolnić ;pamięć zajmowana przez ewentualne pozostałe jeszcze elementu lisy.Uwaga:Systemy wykonawcze niektórych języków zawierają mechanizmy automatycznego wykrywania i zwalniania pamięci zajmowanej przez nieużywane już dane (tzw. Zbieranie śmieci, ang garbage collection, patrz java) w językach C i C++ nie ma takich mechanizmów.

Operator zakresu

Operator zakresu ma postać ::. Przed nim stawia się nazwę klasy, przestrzeni nazw bądź nic. Służy do wskazania zakresu z którego pochodzi nazwa.Std::coutStos::n::nPrzypomnijmy, że jakiś inny programista mógł stworzyć klasę w której też używa hasełka cout dlatego musimy powiedzieć z której klasy cout jest, ale że ludzie nie utrudniają sobie życia i nie ma raczej cout w innych klasach to stad mamy Rusing namespace std by było nam łatwiej. Pojawi się na kole to…

Zmienna this czyli wskaźnik do się

Inny przykład:Class Mojaklasa{

Int n=0;

Page 15: Programowanie obiektowe (object oriented programming) to ...kolos.math.uni.lodz.pl/~archive/Programowanie obiektowe/Notatki pod... · Język uml to język generyczny (takie modelowanie

Wykłady z Programowania Obiektowego 15

Public Mojaklasa(int n){n=n}}I nic nie widać dlatego w Javie byśmy napisali tak

D (zmienna globalna, choć tego w Javie nie da się zrobić)Class Mojaklasa{

Int n=0;Int dPublic Mojaklasa(int n){this.n=n // w Javie jest kropka, w c byłoby inaczej, chodzi o jednoznaczne wskazanie o który obiekt nam chodzi// this.n to jest to n z tej klasy i =n tzn ze będzie rowne temu naszemu int n….tHis.d

}

Private void print{}

}

This się przyda przy dziedziczeniu.

Konstruktory

Przypomnienie:- konstruktor to specjalna metoda wywoływana (automatycznie lub jawnie) w momencie tworzenia obiektu- nazwa konstruktora jest taka jak nazwa klasy- konstruktor nie zwraca wartości, może mieć argumenty, może być przeładowany

Konstruktor pozwala w przemyślany sposób zarządzać tworzeniem obiektu, czy poprzez kopiowanie czy inne operacje.

Konstruktor (pełna składnia)Nazwa(argumenty) : lista_inicjalizacyjna{Instrukcje}

Lista inicjalizacyjna zawiera sekwencję inicjalizatorów. Inicjalizatorem może być:Atrybut (wyrażenie) – zainicjalizowanie atrybutu (niestatycznego) wartością wyrażeniaAtrybut (lista parametrów konstruktora) – zainicjalizowanie atrybutu (niestatecznego) za pomocą jego konstruktora

Konstruktor_nadklasy

Konstruktor (inicjalizacja stałej)Class A{

Const int stala; // tu nie można zainicjalizować samej stałej

Page 16: Programowanie obiektowe (object oriented programming) to ...kolos.math.uni.lodz.pl/~archive/Programowanie obiektowe/Notatki pod... · Język uml to język generyczny (takie modelowanie

Wykłady z Programowania Obiektowego 16

A() : stala(0) // tylko tu można zainicjalizować stała{

// tu nie można zainicjalizować stałej}

}

Konstruktor (inicjalizacja atrybutu nie będącego stałą)Class A{

Int a,b,c;A() : a(1), c(0) // można tu{

B=1; // albo tu}

}

Konstruktor (inicjalizacja atrybutu będącego referencją)Referencji nie można przypisywać wartości, można ją tylko zainicjalizować, a więc tylko na liście inicjalizacyjnej

Class A{

B& b;A(B& bref): b(bref){// tu nie można manipulować wartością b}

}

Konstruktor – konstrukcja części dziedziczonej obiektu (konstruktory nadklasy)Class A{

Int a;A(int i) : a(i) {} // konstruktor w klasie A

}

Class B: public A // B jest podklasa A{

Int b;B(int i, int j) : A(i) // wywołanie konstruktora nadklasy

B(j) // inicjalizacja niedziedziczonego atrybutu b{}

};

Konstruktor domniemany

Konstruktor domniemany to konstruktor który można uruchomić bez argumentów (może to być konstruktor z argumentami domyślnymi). Jeśli nie zdefiniujemy żadnego konstruktora dla klasy to ma ona konstruktor domniemany wywołany automatycznie. Jeśli zdefiniujemy konstruktory i nie będzie wśród nich takiego, który UZUPELNIC

Konstruktor – kolejność wykonywania działań1. Uruchomienie konstruktora nadklasy (jeśli klasa jest klasą pochodną).

Jeśli konstruktora nadklasy nie wymieniliśmy na liście inicjalizacyjnej, uruchamiany jest konstruktor domniemany bezargumentowy

2. Uruchomienie konstruktorów obiektów składowych– obiekty składowe konstruowane są zgodnie z zawartością listy inicjalizacyjnej

Page 17: Programowanie obiektowe (object oriented programming) to ...kolos.math.uni.lodz.pl/~archive/Programowanie obiektowe/Notatki pod... · Język uml to język generyczny (takie modelowanie

Wykłady z Programowania Obiektowego 17

- jeśli na liście inicjalizacyjnej nie wskazaliśmy konstruktora dla jakiegoś obiektu składowego, uruchamiany jest jego konstruktor domniemany (bezargumentowy)3. wykonanie pozostałych czynności zdefiniowanych w ciele konstruktora

Tworzenie obiektów automatycznychObiekty automatyczne mają zakres bloku, istnieją od momentu deklaracji do końca bloku, w którym zostały zadeklarowane

Class A{

// jakaś klasaA() {} // jej konstruktor bezaugmentowyA(int n){…} // i jej konstruktor z argumentem

};

Int main(){…

{A a; // deklaracja zmiennej z wywołaniem konstruktora bezargumentowegoA b(5); // deklaracja zmiennej z wywołaniem konstruktora z argumentem} // tu kończy się zakres i żywot a i b

}

Tworzenie obiektów globalnychObiekty globalne mają zakres pliku, istnieją przez cały czas wykonywania programy. Są tworzone przed rozpoczęciem wykonywania funkcji main i kończą żywot po jej zakończeniu.

Class A // jakaś klasa{

…A(){}A(int n){…}

};

A a;Int main(){…}

Dynamiczne tworzenie obiektówObiekt dynamiczny istnieją od momentu jego utworzenia za pomocą operatora New do momentu jego zniszczenia operatorem delete. Jest dostępny, jeśli istnieje i jest dostępna jakaś zmienna przechowująca wskaźnik do niego.

Class A{…

A(){}A(int n){…}…

Page 18: Programowanie obiektowe (object oriented programming) to ...kolos.math.uni.lodz.pl/~archive/Programowanie obiektowe/Notatki pod... · Język uml to język generyczny (takie modelowanie

Wykłady z Programowania Obiektowego 18

);

Int main(){

A* a = New A; // new A przydziela pamięć na obiekt klasy A I zwraca wskaźnik do niego, obiekt jest tworzony przez konstruktor bezargumentowy

B* b = new A(5); // j.w. ale zadziała konstruktor z argumentem…Delete a; // utworzony dynamicznie obiekt trzeba zniszczyć kiedy jest juz niepotrzebnyDelete b;

}

Tworzenie obiektów chwilowychKonstruktor można wywołać jawnie tak, jakby był zwykła funkcją zwracającą obiekt. Obiekt taki jest ‘chwilowy’UZUPELNIC

Class A{…

A(){}A(int n){…}A f(){

…Return A(0);

}};

Int main(){

A a = A(); // obiekt chwilowy zwrócony przez konstruktor jest przypisany zmiennej aA b;B = A(3); // jak wyżej tyle ze zmiennej b

UZUPELNIC

Użycie obiektów chwilowych

Konstruktor kopiującyJest to specjalny konstruktor konstruując obiekt na podstawie podanego jako argument wzorca. Jego jedyny argument jest typu referencja do obiektu tej samej klasy.Konstruktor kopiujący zazwyczaj nie ma potrzeby dokonywać zmian we wzorcu, dlatego zwykle używa się referencji do obiektu stałego

Class K{

K (K& k) {} // lub K(const K& k){…}

}

Page 19: Programowanie obiektowe (object oriented programming) to ...kolos.math.uni.lodz.pl/~archive/Programowanie obiektowe/Notatki pod... · Język uml to język generyczny (takie modelowanie

Wykłady z Programowania Obiektowego 19

Class Osoba{

Char * imie;Osoba(const Osoba& o){

Imie = New char[strlen(o.imie)+1];Strcpy(imie, o.imie);

}}

W powyższym przykładzie atrybut imię w nowym obiekcie powinien wskazywać na własną kopie imienia. Automatycznie wygenerowany konstruktor kopiujący skopiowałby wskaźnik, co mogłoby mieć niepożądane skutki,.

Konstruktor kopiujący generowany automatycznieJeśli nie zdefiniujemy konstruktora kopiującego generowany jest on automatycznie. Automatycznie wygenerowany konstruktor kopiujący, kopiuje obiekt składnik po składniku, z wykorzystaniem tam gdzie mamy do czynienia z obiektami – konstruktorów kopiujących z odpowiednich klas. W większości przypadków taki konstruktor kopiujący wystarcza.

SPRAWDZICStworzyć konstruktor kopiujący, zawrzeć w nim jakieś wartościSytuacja taka ze zwracamy wartość przy wywołaniu danej funkcji, przekazujemy zmienna przez wartość, standardowo wrzucana jest na listę argumentów danej metody, co się dzieje jak wykorzystujemy operator przypisania, tworzymy nowy obiekt vi chcemy do niego przypisać obiekt, który wcześniej został stworzony, sprawdzić, czy zostanie wtedy wywołany konstruktor kopiujący,

Konstruktor kopiujący wywołanie jawne

Osoba o,o1; // o jest obiektem klasy osoba…O1 = Osoba(o); // o1 ma być kopia obiektu o – metoda brutal force, problem gdy mamy wskaźniki w obiektach, wtedy i one wskazują na te same miejsca w pamięci

Konstruktor kopiujący wywołanie niejawneKonstruktor kopiujący jest niejawnie wywołany w dwóch przypadkach:- kiedy obiekt jest przekazywany jako parametr funkcji / metody przez wartość- kiedy funkcja/ metoda zwraca jako wartość obiektu

Class Osoba{

…Char * imie; // zrobić wskaźniki na typy wbudowane i niewbudowane, jak zachowa się konstruktor na liście inicjalizacyjnej, jak jest przy nadklasie i dziedziczymy klasę, gdy mamy wskaźnik i chcemy go na jakiś typ niewbudowany tylko nasz i dla tego typu chcemy przekazać referencje – co wtedy?

Osoba (const osoba &o) // wypisywanie{

Printf();}

Osoba klonuj (osoba o) // przekazanie obiektu przez wartość do metody trafi kopia argumenty

Page 20: Programowanie obiektowe (object oriented programming) to ...kolos.math.uni.lodz.pl/~archive/Programowanie obiektowe/Notatki pod... · Język uml to język generyczny (takie modelowanie

Wykłady z Programowania Obiektowego 20

{Osoba o1 = Osoba(o);Return o1; // zwracana jest kopia obiektu lokalnego o1}…

}

Operatory

W języku c++ mamy możliwość definiowania własnych operatorów. Technicznie polega to na przeładowaniu istniejących operatorów, zdefiniowaniu ich działania dla innych typów argumentów. Operatory można definiować jako metody klasy lub jako…UZUPOELNIC

UZUPELNIC

Definicja operatora jednoargumentowego prefiksowego

Class zespolona{…

Zespolona operator-() {return zespolona(-re,im);}};

Zespolona operator-(zespolona z){return zespolona(-z.re, im);}

Operator przypisania

Operator przypisania ma status szczególny. Jest jedyną niedziedziczną metodą klasy (poza konstruktorami i destruktorem)

Class K{

K& operator=(K& k) {…}// lub K& operator=(const K& k){…}}

Operator przypisania generowany automatycznieJeśli nie zdefiniujemy operatora przypisania generowany jest on automatycznie. Automatycznie wygenerowany operator przypisania dokonuje przypisania składnik pokładniku, z wykorzystaniem – tam gdzie mamy do czynienia z obiektami – operatorów przypisania z odpowiednich klasUZUPELNIC

Konwersja typów

W języku c++ programista może zdefiniować reguły konwersji typów, jakie mają być stosowane dla obiektów klas przez niego definiowanych. Zdefiniowane w ten sposób konwersje UZUPELNIC

Dziedziczenie!!!

Zgodność typów

Rozważmy klasyClass A{

Page 21: Programowanie obiektowe (object oriented programming) to ...kolos.math.uni.lodz.pl/~archive/Programowanie obiektowe/Notatki pod... · Język uml to język generyczny (takie modelowanie

Wykłady z Programowania Obiektowego 21

…};

Class B: public class A{…};

Przekazywanie jednym obiektom właściwości innych obiektów. My tu będziemy chcieli dziedziczyć po klasie A. Można napisać public class A, class D itp. W Javie raczej można po jednym tylko dziedziczyć, jak chcemy po więcej to jakieś extend coś tam.

Obiekt klasy pochodnej jest obiektem klasy bazowej. Wyobraźmy sobie klasę zwierzęta i mamy podklasę kot. W momencie, gdy sprawdzamy typ klasy, to klasa ta ma typ zwierzę i podtyp kot. Poniżej ciąg dalszy tego kodu co wyżej. Jak widać dziedziczenie przenosi się też na wskaźniki.

// nadmiar mogę odrzucić, bo jest szersza

A a, *aw;B b, *bw;a = b; // ok.b = a; // bladaw = bw; // ok.bw = aw; // blad

void fA(A);fA(a); // ok., konstruktor kopiujący A::A(&A)fA(b); // ok., A::A(&A) zadziała

Jest tu niejawne rzutowanie typu b, który jest typem szerszym, który dziedziczy z typu a właśnie na typ a. To taki wybieg do przodu…fA() to funkcja, która jest w klasie A. To rzutowanie jest w ostatniej linijce. A jest nadklasą.

Void fAref(A&);fAref(a); // ok., bez kopiowaniafBref(b); // ok

voidf fAwsk(A*);fAwsk(&a); //ok.

void fB(B);fB(a) // błądfB(b) // ok, kopiowanie B::B(B&)

Nadpisywanie

Class C{

Public: Int a;

Page 22: Programowanie obiektowe (object oriented programming) to ...kolos.math.uni.lodz.pl/~archive/Programowanie obiektowe/Notatki pod... · Język uml to język generyczny (takie modelowanie

Wykłady z Programowania Obiektowego 22

Void f();};

Class D: public C{

Public:Int a;Void f();

};

Klasa ma metody I pola – przypomnienie ;)

Na co wskazują wskaźniki?

Zwróćmy uwagę na interesującą konsekwencję zgodności typów:D d;C *cw = &d;Cw->f();

Wskazywanie szerszego typu na węższy typ. Wprawdzie cw wskazuje na obiekt klasy D, ale sam jest wskaźnikiem do obiektu klasy C, zatem wywołana zostanie metoda z tej klasy. Czasem jednak chcemy innego zachowania…

Class C{

Int a;Voif f(){printf(„C”):}

Classs D: public C{`Void f(){printf(“D”)}}

To tak jak zwierzak ma metodę daj głos …Zwierzak z=kz.daj glos()z=piesz.daj glos()z=kot

a gdybyśmy teraz dla kota zdefiniowali metodę daj glos dla kota printf(„miau”) toz=kotz.daj glosto wyświetli się miau.

Rozważmy przykład

Class Figura{Protected: int x,y; // położenie na ekranieVoid ustaw(int ax,int ay) {x=ax; y=ay}

Page 23: Programowanie obiektowe (object oriented programming) to ...kolos.math.uni.lodz.pl/~archive/Programowanie obiektowe/Notatki pod... · Język uml to język generyczny (takie modelowanie

Wykłady z Programowania Obiektowego 23

Void pokaz(){} // nie umiemy narysowaćVoid schowaj(){};Void pzesun();

Figura:: przesun(int ax, int ay){

Schowaj();Ustaw(ax,ay);Pokaz();

}

Teraz definiujemy figurę okrąg

Class Okrag: public Figura{Protected: int promien;Public:Okrag(int,int,int);Pokaz(); // umiemy zdefiniowacSchowaj();}

Okrag o(30,40,10); // zadany srodek I promieno.pokaz(); // rysuje okrago.przesun(100,100) // nie przesuwa!!

Metoda figura::przesun wywołuje metodę figura::pokaz, a nie okrag::pokaz. Rozwiązaniem naszego problemu są metody wirtualne

Metody wirtualneMetoda wirtualna różni się od zwykłej tym, że wybór metody zostaje dokonany dopiero w czasie wykonania na podstawie faktycznego (a nie zadeklarowanego) typu obiektu.

Struct A{

Void virtual f(int);}

Struct B: A{};Struct C: B{

Void f(int);// ta metoda jest wirtualna}

W sumie nasze miau byłoby metodą wirtualna…Metoda wirtualna nie ma ciała, nie jest zdefiniowana, jest tylko zadeklarowana.

Sprawdzić, gdzie może wystąpić słowo virtual w sensie w jakiej kolejności powinno być virtual void protected…

Main(){

A *p = New A;p->f(3)

UZUPELNIC

Page 24: Programowanie obiektowe (object oriented programming) to ...kolos.math.uni.lodz.pl/~archive/Programowanie obiektowe/Notatki pod... · Język uml to język generyczny (takie modelowanie

Wykłady z Programowania Obiektowego 24

Chodzi o to, że nie ma obiektu typu zwierzak – zwierzak jest wirtualny, ale istnieje obiekt kot…wiec te metody które będą dalej przekazywane i przeładowywane w zwierzaku powinny być metodami wirtualnymi.

Konstruktory i destruktory w hierarchiach

Obiekt podklasy składa się z wielu warstwKażda warstwa odpowiada jednej z nadklasMusimy zadbać o inicjalizację wszystkich warstwKlasy mogą też mieć składowe będące obiektamiW podklasie musimy zadbać o inicjalizację: (bezpośredniej nadklasy, własnych składowych)Konstruktor naszej nadklasy zainicjalizuje swoje nadklasy.

A <- C to w A może nie być konstruktora, ale w C już musi być zainicjalizowany chyba konstruktor nadklasy A.

Inicjalizacja nadklas

Class MyFrame: public Frame// przykład inicjalizacji nadklasy:MyFrame::MyFrame()

: Frame(0, „Basic Test”,0,0,640,480)// przykładowa inicjalizacja składowychMWindow::MWindow(int x, int y, int u, int h UZUPELNIC

Kolejność inicjalizacji

Najpierw inicjalizuje się klasę bazowąNastępnie składowe w kolejności deklaracji, niezależnie od kolejności inicjalizatorówSłuży to zagwarantowaniu ze podobiekt i składowe będą niszczone w odwrotnej kolejności niż były inicjalizowane

Struct Bar{ Bar() { cout << „Bar” << e=UZUPELNIC

Znaczenie inicjalizacji składowych

Struct A {A(int); A(););Striuct B {A a; B(A&);}

Rozważmy dwie wersje konstruktora dla B UZUOLENIC

Destrukcja obiektuTreść destruktora wykonuje się przed destruktorami dla obiektów składowychDestruktory dla obiektów składowych wykonuje się przed destruktorami klas bazowych w konstruktorach i destruktorach można wywoływać metody, także wirtualneDestruktor może być wirtualny, powinien być wirtualny w klasach zawierających metody wirtualne. Destruktor nie jest dziedziczony. Zwierzak miałby wirtualnego destruktora, bo przecież nie ma obiektu typu zwierzak, czyli nie ma czego niszczyć, ale już kot czy pies powinny mieć swoje destruktory.

Operatory

Przeciążanie operatorów

Wywoływanie operatorów

Page 25: Programowanie obiektowe (object oriented programming) to ...kolos.math.uni.lodz.pl/~archive/Programowanie obiektowe/Notatki pod... · Język uml to język generyczny (takie modelowanie

Wykłady z Programowania Obiektowego 25

Operatory można wywołać w postaci operatorowejA = b + c;Jak i funkcyjneja.operator=(b.operator+(c));Są one równoważne. Postaci funkcyjnej praktycznie się nie stosuje.

Definiowanie operatorów

Można dowolnie ustalać typy argumentów i wyniku operatoraNie można zmieniać priorytetu łączności ani liczby argumentówJeśli definiujemy operator jako funkcję, to musi mieć co najmniej jeden argument będący klasą lub referencją do klasyW takim wypadku operator jest zwykle zaprzyjaźniony z klasą np.

Class Zespolona{Double Re,im;////UZUPELNICPublic://Zespolona operator+(zespolona& z);Friend zespolona // zaprzyjaźniony jest operator a nie klasa tutaj…Operator*(zespolona z1, zespolona z2);};

Definiowanie operatorów – ograniczenia

Jak zdefiniować x++

Operatorów ++ i – można używać w w postaci tak prefiksowej jak i postfiksowej. Dla zdefiniowania ich w wersji postfiksowej wprowadza się „ślepy” argument typu intNp. Struct X{X operator++(); // preX operator++(int); // post

Uzupelnic

Operatory dwuargumentowe

Definiować funkcję czy metodę

Wejście wyjście

Operacje we-wy wykonuje się na strumieniach. Nie jest to tak w ogóle element języka C++.

StrumienieStrumienie są ciągami znaków. Operacje we-wy polegają na przekształcaniu obiektów na ciągi znaków i vice versa. Zaleta strumieni: wygodne i jednolite traktowanie typów wbudowanych i zdefiniowanych przez użytkownika.

Standardowe strumienie cout i cerr (odpowiada stderr, jakieś cerror- do wysyłania błędów, jest to wyjście priorytetowe, pozwala komunikować się z systemem operacyjnym

Page 26: Programowanie obiektowe (object oriented programming) to ...kolos.math.uni.lodz.pl/~archive/Programowanie obiektowe/Notatki pod... · Język uml to język generyczny (takie modelowanie

Wykłady z Programowania Obiektowego 26

). Ponadto clog (jak cerr ale buforowany). Wszystkie mają swoje odmiany dla Unicode: wcout, …

Operator <<

Ostream& operator<<(ostream&, T)T może być i często jest typem referencyjnymTyp wyniku umozliwia skróty takie jak cout << „i=” << i;Operatory << i >> wiążą w lewo . Priorytet << jest niższy niż operacji arytmetycznych. Dzięki temu można napisać np. cout << „a*x+b”= << a*x+b;Są jednak operatory które mają jeszcze niższe priorytety:Cout << „x^y|z=” << x^y|z; <- błądOperator ten zwraca referencje na strumień i można ją przekazywać przy kolejnych wywołaniach tego operatora.UZUPELNIC

W treści operatora należy jako wynik przekazać strumień będący parametrem operatora. Ponieważ pierwszy argument pochodzi z klasy ostream, nie można go zdefiniować jako metodę klasy Y lecz tyko jako funkcję. Zwykle powinna to być funkcja zaprzyjaźniona z klasą T. Zamiast operatora << można dla znakó3. używać funkcji put np.UZUPELNIC

Class Zespolone{

Double Re,im;Public:

Friend ostream&Operator << (ostream& os, Zespolone& z);

}

Ostream& operator << (ostream& os, Zespolone& z){

Os << ‘(‘ z.re <<’,’<<z.im<<”)”;Return os; // przekazuje znów referencje na strumień, by mógł działać wielokrotnie w jednej linijce, to takie wywołania cykliczne wyjdą z tego.}

// tu musi być referencja lewostronna na strumień…by było możliwe wykorzystanie go wielokrotnie, po to. Jak widać można zastosować zarówno ‘’ jak i „”. Co w sytuacji, gdy ten szablon klasy nie będzie referencją ? <- pytanie do nas.

Klasa ostreamW uproszczeniu:

class osream: public virtual ios{//…Public:Ostream& operator << (char);Ostream& operator << (const char*);Ostream& operator << (int);//…Ostream& operator << (ostream& (*pf)(stream&));Ostream& put(char);Ostream& write…UZUPELNIC

Page 27: Programowanie obiektowe (object oriented programming) to ...kolos.math.uni.lodz.pl/~archive/Programowanie obiektowe/Notatki pod... · Język uml to język generyczny (takie modelowanie

Wykłady z Programowania Obiektowego 27

Wejście

Istream& operator >> (istream&, T)ImplementacjaIstream& operator>>(istream& is, T& zmienna){// pomiń białe znaki typu spacja itp// wczytaj tekstową reprezentację T na zmiennąReturn is;}Uwaga pamiętajmy, że strumienie wyjściowe mają typ ostream. Na egzaminie pewnie będzie trzeba przeładować jakiś operator, szczególnie wyjścia.

Zapis if(s>>zmienna)… jest poprawny i oznacza sprawdzene czy wczytywanie zmiennej się powiodło. Taki zapis jest możliwy dzięki operatorowi konwersji typu istream do int przykładMain(){

int i;while(cin>>i) cout << i;

}

Metody get

Zamiast operatora >> możemy użyć jednej z metod get. Char buf[100];Cin >> buf; // tu grozi nam wyjście poza tablicęCin.get(buf.100); // tu jesteśmy bezpieczni

Class istream: public virtual ios{//…Istream& get (char* s, int n, char delim=’\n”);Istream& get (char c);

Cin<<c pomija białe znaki, a cin.get już nie.,Cin>>buf wczyta tylko do pierwszego białego znaku, a cin.get(buf) do pierwszego wystąpienia delim (domyślnie jest to koniec linii).

Funkcje pomocnicze

Nagłówek ctype.h zawiera użyteczne funkcje klasy znaków, np.Isspace(char) – czy biały znakIsalpha – czy literaIsdigit – czy cyfra i wiele innych, w nagłówku są wypisaneMetoda putback(char) pozwala na wstawienie znaku z powrotem do strumienia (ale ostrożnie). Metoda peek() pozwala na podejrzenie następnego znaku bez jego pobierania.

Stany strumienia

Z każdym strumieniem związany jest jego stan. Klasa podstawowa strumieni iops definiuje metody testowania stanu np.Int eof();// napotkano koniec strumieniaInt good(); // operacja się udała

Page 28: Programowanie obiektowe (object oriented programming) to ...kolos.math.uni.lodz.pl/~archive/Programowanie obiektowe/Notatki pod... · Język uml to język generyczny (takie modelowanie

Wykłady z Programowania Obiektowego 28

Int fail(); // operacja się nie udałaInt bad();// strumień jest do niczego, znaczy że coś jest z nim nie tak, jest złego typu czy coś takiego.

Bity stanu

W rzeczywistości stan strumienia jest reprezentowany UZUPELNIC x3

Formatowanie

Klasa ios zawiera operacje służące do określania sposób wypisywania danych, np. int width(int w); określa minimalną szerokość pola, na którym będzie wypisywany następny element, np. Cout <<’(‘;Cout.width(4);Cout << 12<<’)’;Spowoduje wypisanie 12 w polu o szerokości 4, tj ( 12)Uwaga width dotyczy tylko jednej następnej operaji. Domyślnie jest 0, czyli tylko tyle miejsc ile potrzeba.

UZUPELNIC

Strumienie i pliki

Mechanizmu strumieni można używać dla wejścia wyjścia plikowego. Należy w tym celu włączyć nagłówek <fstream> Plik otwiera się dla wyjścia przez utworzenie obiektu klasy ofstream z nazwą pliku jako argumentem. Podobnie dla wejścia, tyle że używamy ifsream UZUPELNIC

Przykład

Int main(int argc, char* argv[]){Ifstream skad(Arg[1]);If !(skad) cerr << “Blad…”;

Ofstream dokad(argv[2]);If !(dokad) cerr << “blad…”;

Char ch;While (skad.get(ch)) dokad.put(ch);

If(!skad.eof() || dokad.bad()) cerr << “Blad…”;}

Zamykanie strumieni

Strumień związany z plikiem powinien być na końcu zamknięty. Zwykle nie musimy się o to martwić, pamięta o tym destruktor strumienia. Jeśli jednak potrzeba zamknąć strumień przed końcem jego zasięgu , można to uczynić metodą close(). Oczywiście zamkniętego strumienia nie można już używać.

Jeszcze o napisach

Do tej poru do przechowywania napisów używaliśmy tablic. Wadą tablic jest ich stały rozmiar. Mechanizm z klas pozwala na lepsze rozwiązanie. Biblioteka standardowa c++

Page 29: Programowanie obiektowe (object oriented programming) to ...kolos.math.uni.lodz.pl/~archive/Programowanie obiektowe/Notatki pod... · Język uml to język generyczny (takie modelowanie

Wykłady z Programowania Obiektowego 29

zawiera klasę string., implementującą ciągi składające się ze strumieni liczby znaków. By jej używać, należy włączyć nagłówek <string>.

Wycinanie

Sklejanie

Porównywanie i wyszukiwanie

Zakres widoczności składowych dziedziczonychZakres widoczności składowych dziedziczonych w klasie pochodnej określa się poprzedzając w definicji klasy klasę bazową słowem public, protected lub domyślnym private. UZUPELNIC

Dziedziczenie wielokrotne

Zdarzają się konflikty nazw, nieścisłości…

Class A{

Public : Int a,i;

}

Class B{

Public : Int b,i;

}

Class C: public A, public B{Void f(){

A = b // poprawneI = 0; // błąd bo niejednoznaczne nie wiadomo o które I chodzi, z której klasyA::i=0; // poprawne

}}

Klasa C dziedziczy obie składowe i, są to różne składowe w klasie C. |Dopiero odwołanie się do składowane i jest błędem przez niejednoznaczność, która można usunąć stosując operator zakresu.

PolimorfizmPolimorfizm to cecha języka programowania umożliwiająca operowanie na danych różnego typu za pomocą jednolitego interfejsu. Tu chodzi oto jak to szło ze zwierzakiem, potem kotem itp…

UZUPELNIC

Definicję metody wirtualnej poprzedza się słowem virtual. Metody wirtualne są normalnie dziedziczone, mogą być w klasach pochodnych redefiniowane, jak inne, przy czym we wszystkich klasach pochodnych nadal są metodami wirtualnymi (redefiniując taką metodą w klasie pochodnej…).

Page 30: Programowanie obiektowe (object oriented programming) to ...kolos.math.uni.lodz.pl/~archive/Programowanie obiektowe/Notatki pod... · Język uml to język generyczny (takie modelowanie

Wykłady z Programowania Obiektowego 30

Metody wirtualne generują koszty. Obiekty klas zawierających choć jedną metode wirtualną są wiuekse,. Obiekt taki zawiera dodatkowo informację pzowalającą zidentyfikować jego klasę,. Informacja ta jest wykorzystywana w trakcie wywołania metody wirtualnej, Wywołanie metody wirtualnej jest bardziej czasochłonne UZUPLENIC

Metody abstrakcyjneMetoda abstrakcyjna to metoda wirtualna, którą wprowadza się bez UZUP:ENICOna nie ma ciała.

Klasa abstrakcyjna

To taka klasa która zawiera choć jedną metodę abstrakcyjną. Nie ma możliwości tworzenia obiektów takiej klasy. Klasa abstrakcyjna określa jedynie pewien zestaw własności które wszystkie klasy potomne będą posiadać klasy abstrakcyjne są narzędziem ułatwiającym modularyzację kodu.

UZUPELNIC

Szablony

Szablony to technika realizacji polimorfizmu na innym poziomie niż za pomocą funkcji wirtualnych i dziedziczenia. Mechanizm ten można rozumieć jako ‘inteligentniejsze’ makrodefinicje. Szablony nie są w bezpośredni sposób związane z programowaniem obiektowym. Szablony pozwalają w łatwy sposób agregować informacje gromadzoną w klasach lub przekazywaną przez funkcję.

Jak mamy funkcję do porównywania dwóch liczb, ale różnych liczb a to dwie liczby rzeczywiste, a to dwie całkowite itp. Możemy też porównywać klasy. Zatem w takich funkcjach pewne elementy się powtarzają.

Szablon funkcjiSzablon funkcji jest sparametryzowaną definicją funkcji. Szablon funkcji definiuje się w zakresie globalnym, Parametrem szablonu funkcji jest typ (klasa) bądź lista typów. Wszystkie parametry szablonu muszą wystąpić w opisie argumentów funkcji szablonowej (kompilator odnajduje szablon na podstawie wywołania funkcji).

Składnia:Template<opis parametrów>Definicja funkcji

Przykład:Class Pudelko{

Public:Float dl, sz, wy;Pudelko(float d..Int operator

};

Template<class T>Int compare(T a, T b){

If (a < b) return -1; else….}

Parametry szablonuParametrem szablonu funkcji jest typ (klasa) bądź lista typów.

Page 31: Programowanie obiektowe (object oriented programming) to ...kolos.math.uni.lodz.pl/~archive/Programowanie obiektowe/Notatki pod... · Język uml to język generyczny (takie modelowanie

Wykłady z Programowania Obiektowego 31

Wszystkie parametry szablony muszą wystąpić w opisie argumentów funkcji szablonowej (kompilator odnajduje szablon na podstawie wywołania funkcji)Oprócz obowiązkowego użycia parametrów szablonu w opisie argumentów funkcji szablonowej można ich używać w dowolnym miejscu w definicji tej funkcji (jako nazwy typów)

Template <class S, class T>T * jakasfunkcja(S a, T b){

T *l = New (T)Int r = sizeof……….}

Jedynym ograniczeniem jakie w deifnicji szablonu można nałożyć na typy argumentów funkcji szablonowej jest by niektóre z nich były takie same np. szablonTemplate <class K, class M…Pasuje do róznych rzeczy

Natrafiając na wywołanie funkcji kompilator sprawdza, czy isnieje funkcja o podanej nazwie, liczbye I typie argumentów. Jeśli nie, sprawda, czy istnieje szablon pozwalający taką funkcję wygenerować, jeśli tak, generuje funkcjęJeśli nie, sprawdza czy istnieje funkaj ,którą można odpasować dlokonjąc konwersji typów arugmenów jeśli tak, zastosuje wiązania….

Szablon klasy Stos którego parametrem jest typ elementów [przechowywanych na stosie

Template <class T>Cl;ass Stos{Publ;ic:Stos() : n(0) {}Stos& push(T e) {dane [n++] = e, return *this;} // dodanie elementuT pop() {return dane [--n]; } // pobranie elementuInt empty() {return n==0;} // test czy pustyOperator int () {return n;} // dodatkowy bajer

Private:T dane [100];Int n;};

Pozwala to zmodularyzować kod programu, w jednym miejscu jest on przygotowany I może być wykorzystany do różnego rodzajów typu.

Po zdefiniowaniu szablonu klasTemplate <opis parametrów>Class nazwa klasy{…};Nazwą klasy szablonowej jest nazwa klasy <parametry>UZUPL:ENICInt main(){Stos<char> stosznaków; // generowana jest klasa Stos<char>

Page 32: Programowanie obiektowe (object oriented programming) to ...kolos.math.uni.lodz.pl/~archive/Programowanie obiektowe/Notatki pod... · Język uml to język generyczny (takie modelowanie

Wykłady z Programowania Obiektowego 32

Stos<int> stosliczb; // generowana jest klasa stos <int>Stosznakow.push(‘A’).push(‘1’).push(‘a’);Stos<char> dryugistosznakow = stosznakowUZUPLENIC

Szablon klasy może mieć wiele parametrów (separatorem jest przecinek). Parametrem szablonu klasu może być- typ (class nazwa)- wartość całkowita STAŁA (int nazwa)Template <class Typ,. Int rozmiar>

-także stałe wyrażenie UZUPLENIC

Template <class T>Cl;ass Stos{Publ;ic:Stos() : n(0) {}Stos& push(T e) {dane [n++] = e, return *this;} // dodanie elementuT pop() {return dane [--n]; } // pobranie elementuInt empty() {return n==0;} // test czy pustyOperator int () {return n;} // dodatkowy bajer

Private:T dane [100];Int n;};

Template<class T>Stos<t>::stos() : n(0) {}UZUPLENIC

W szablonie stosów dodajemy parametr określający rozmiarTemplate < class T, int max>Cl;ass Stos{Publ;ic:Stos() : n(0) {}Stos& push(T e) {dane [n++] = e, return *this;} // dodanie elementuT pop() {return dane [--n]; } // pobranie elementuInt empty() {return n==0;} // test czy pustyOperator int () {return n;} // dodatkowy bajer

Private:T dane [max];Int n;};

Int main(){Stos<char,20> stos;Stos.push(‘A’).While(stos) cout << UZUPLENIC

Klasa szablonowa może być klasą bazową innej klasy. Klasa szablonowa może być klasą bazową w szablonie innej klasy

Page 33: Programowanie obiektowe (object oriented programming) to ...kolos.math.uni.lodz.pl/~archive/Programowanie obiektowe/Notatki pod... · Język uml to język generyczny (takie modelowanie

Wykłady z Programowania Obiektowego 33

Template <class T>Class L{…}

Class L : K<int>{…}

Template <class S>Class M : K<int>{…}

UZUPELNIC Funkcje zaprzyjaźnione

Funkcja zaprzyjaźniona z klasą to taka, która ma dostęp do wszystkich składowych klas (włącznie z chronionymi I prywatnymi)To, które funkcje są zaprzyjaźniona z klasą deklaruje się w definicji klasyPrzyjaźni się nie dziedziczy.

Class Pudelko{Public:Pudelko (float d, dfloat s, dloat w ) : dl(d), sz(s), wy(w) {}Friend int equ (Pudelko a, Pudelko b ) ;

PriwateFloa…};

Int equ…

Dlatego było to wygodne gdy pisaliśmy operator =

Biblioteka zaprzyjaźniona

<bitset> dostarcza klasy pojemnikowej std :: bitset(tablica bitowa)<deque> dostarcza szablonu klasy pojemnikowej stdf::deque kolejka o dwóch końcach<list> dostarcza szablonu klasy pojemnikowej std::listlista dwukierunkowa<map> dostarcza szablonów klasy pojemnikowych std::map(tablica asocjatywna), std::multimap(wielowartościowa tablica asocjatywna) to są typy słownikow mamy parametr i dla tego parametru definiujemy wartość, czyli możemy tu przeszukiwać rzeczy za pomocą parametru lub wartość, pierwszy element słownika nie może się powtarzać, ale wartość dla niego już tak<queue> dostarcza klasy pojemnikowej std::queue (kolejka o jednym końcu)<set> dostarcza szablonów klas pojemnikowych std::set(zbiór) I std::multiset(torba)<stack> dostarcza klasy pojemnikowej class std::stack, a stack<vector> dostarcza szablonu klasy pojemnikowej std::vector (tablica dynamiczna)

<algorithm> dostarcza dewfinicji wielu podstawowych algorytmów związanych z pojemnikami )(sortowanie, wyszkiwanie, odwracanie)

Page 34: Programowanie obiektowe (object oriented programming) to ...kolos.math.uni.lodz.pl/~archive/Programowanie obiektowe/Notatki pod... · Język uml to język generyczny (takie modelowanie

Wykłady z Programowania Obiektowego 34

<functional> dostarcza obiektów funkcyjnych do wykorzystania w standardowych algorytmach<iterator> dostarcza klas I szablonów związanych z iteratorami<locate> dostarcza klas I szablonów związanych z ustawieniami lokalnymi (locate)<memory> dostarcza narzędzi do zarządzania pamięcią w c++<stdexcept> zawiera strandardowe klasy wyjątków<utility> dostarcza szablonu klas std::pair(para)

<string> dostarcza standardowych klas I szablonów związanych z łańcuchami (np. znaków)

<fstream><ios><iostream><istream><ostream><sstream> dostarcza m.in. szablonu klasuy std::sstream (strumien…)I inne

<complex> Pozwala operować na liczbach zespolonych<numeric> dostarcza algorytmów numerycznych

<exception><limits><typeinfo> dostarcza narzędzi do pracy z RTI

LIPPMAN Podstawy c++ tu jest ładnie stl zrobiony

Makefile na egz….

Stl::set.h

Java jest wysoce przenośna, ale nie da się przenieść wszystkiego i na wszystko. Jak mamy języki typu c / c++ to jest tak, że nasz kod jest przez kompilator gcc kompilowany do postaci języka maszynowego 010010 itp. Natomiast jak jest Java czy c# to kod jest przez kompilator kompilowany do Byte Code i działa w ramach wirtualnej maszyny Javy, dlatego powiedzmy, że jest przenośna. Czyli w Javie jest pewna warstwa pośrednicząca, zatem potrzebne są większe zasoby związane z procesorem i pamięcią. Dlatego Java w stosunku do c/ c++ jest wolniejsza , szczególnie długo się uruchamia. W Javie nie tyle chodzi o efektywność ile bardziej o łatwość pisania aplikacji, zarządzanie nią i utrzymanie jej w sensie rozbudowywanie.

Aplet uruchamia się w ramach przeglądarki i jeśli jest on dość duży, to w połączeniu z firefoxem zaczyna być znaczne zużycie miejsca/ pamięci. Ale stara się to wszystko zmienić na lepsze. Można aplikację wczytać z Internetu, aplikacja Javy może się wtedy ładować d pamięci podręcznej w naszym systemie i wtedy jest łatwiej. Wtedy użytkownicy nie muszą instalować niczego.

Nazwa pliku jest nazwą klasy. Nie ma rozróżnienia na plik nagłówkowy i ten drugi.

Sterta

Java docs object w gogle wpisać, potem Java docs string itp.

Page 35: Programowanie obiektowe (object oriented programming) to ...kolos.math.uni.lodz.pl/~archive/Programowanie obiektowe/Notatki pod... · Język uml to język generyczny (takie modelowanie

Wykłady z Programowania Obiektowego 35

Wirtualna maszyna Javy instaluje GC czyli Garbate collector – nie ma tu czegoś takiego jak destruktor, bo Java sama zarządza sobie pamięcią. Pozbycie sie projektu to utracenie referencji na ten obiekt.

Zmienna w Javie nie jest typem, czyli jeśli napiszemy string s, to w tej sytuacji s jest za każdym razem referencja do obiektu który za chwile utworzymyString s = New String()String b;B = s; to wskazujemy na ten sam obiekt w pamięci. Jak potem napiszemy b = null, s = null, to w c++ wywołałby się destruktor, a tutaj on trafi do GC.

Nazwy klasy piszemy z dużej litery, fajnie by to był jakiś rzeczownik, potem definiujemy pola tak samo jak w c++.

Punktem wejścia jest funkcja, od której program wie, że ma zacząć wykonywać aplikację, tutaj jest to funkcja main i nie wolno tego zmienić, nie wolno nam napisać int main.

Są interfejsy, je można dziedziczyć wielokrotnie, tam są same zachowania dziedziczone z róznych obiektów bez ciała.

Dokumentacja jest znacznie bardziej elastyczna, mamy Tagi np. @see to otrzymamy fajna dokumentację.

Najpierw coś typu package nazwa;import org.jdesktop.swingworker np.

public class vnazwa extends to z czego dziedziczymy (dziedziczymy zawsze z jednej klasy){

@Override protected void startup()

}

Public static void main() // tak to ma wyglądać {

System.out.println(„Hello world”);}

JDK Java Development KidTam jest możliwość- rejestracji klas- jeśli chcemy korzystać z rmi- przykładowe aplikacje i aplety- a pomocą Java night interface sprawia ze możemy się komunikować z plikami z C

Narzędzia programistyczne

Kompilator JavyWirtualna maszyna JavyTo za pomocą czego możemy skompilować aplikacjeTo co pozwala nam tworzyc apletyDebugger

BezpieczeństwoPodpisywanie pakietów

Page 36: Programowanie obiektowe (object oriented programming) to ...kolos.math.uni.lodz.pl/~archive/Programowanie obiektowe/Notatki pod... · Język uml to język generyczny (takie modelowanie

Wykłady z Programowania Obiektowego 36

Appletviewer – pozwala nam podglądać aplety.

Musimy rozróżniać aplet i aplikację. Pierwsze uruchamiamy w ramach przeglądarki, drugie możemy zainstalować.

Archiwa JarJar to takie coś co pozwala nam popakować w pakiety, bo możemy zostawić niespakowane, ale po co, gdy jest spakowane to się dużo szybciej pobiera i jest w ogóle fajniej ;) Poza tym można to rozpakować zipem, bo to algorytm zipowy, po prosty jest to troszkę szersze. To pozwala nam na przenośność i wersjonowanie .

ZmienneMamy pola nonstatic takie jka int itp.Static fileds SA takie jakby globalneOraz mamy takie, które SA widoczne w danym polu

Nazwy zmiennych prosimy pisać z małych literW Javie duzo klas jest generowanych automatycznie i to one zaczynają się od $

Są tradycyjne typu jak float czy int oraz String (z dużej litery) czyli ciągi znaków.

Static final cos tam to znaczy ze widoczna na całym programie i nie można jej modyfikować

Operator porównywania typów jest po to bo przy dziedziczeniu są różne akcje , rzutowania zatem możemy sprawdzić, czy dana klasa jest instancje of inna klasa…

Klasa anonimowa to typ który nie ma nazwy czyli tworzymy dynamicznie typ i od razu instancje tego typu, czyli jest wykorzystywany tylko przez chwilę.

Każda zmienna jest referencją, czyli adresem obiektu, jeśli nic nie ma, to znaczy ze wskazuje na Nulla.

Nie ma tu żadnych alloc itp., jest tylko New.

40% egz to łamigłówka30% to część teoretyczna c++ + programowanie obiektowe10-20% Java

Obsługa wyjątków krok po krokuAby rzucić wyjątek należy otworzyć obiekt wyjątku oraz użyć instrukcji języka throwClass stosprzepelnionywyjatek{

Const char* msg; // komunikat powiązany z wyjątkiemPublic:

Stosprzepelnionyexception char *Cos..}

Void naStos(int El){

This -> wierzcholek++;It (this->wierzcholek >=50)

Throw stsoprzepelnionywyjatek(„Przepełniłeś stos”);

Page 37: Programowanie obiektowe (object oriented programming) to ...kolos.math.uni.lodz.pl/~archive/Programowanie obiektowe/Notatki pod... · Język uml to język generyczny (takie modelowanie

Wykłady z Programowania Obiektowego 37

This -> elementy stosu (this->wierzcholek) = El;}

Try{

//kod który może wygenerować wyjątek}Catch (type1 id1){

// obsługa wyjątku typu 1}Catch(type2 id2){

//obsługa wyjątku 2}

Catch może być dowolnie wiele

U nas:Try{Stos stos;Stos.nastos(5);For(int i=0;i<40;u++)Stos.naStos(rand() % 100);For(int i=0; i < 15; i++)Stos.naStos(rand()%100);}Catch (stosPrzepełniony wyjątek e){

Cout << Stos przepełniony}

W Java możemy rzucić tylko obiektem który dziedziczy po obiekcie exception, w c++ to przygotowanie własnego typu jakim będziemy rzucali, a potem ujmujemy newralgiczne miejsce w klauzurę try i catch. W Java wyjątkiem może rzucić dana funkcja w c++ wyjątkiem można rzucić w dowolnym miejscu. Jeśli nie otoczymy klauzurą try catch to kompilator będzie krzyczeć. W Java pomaga IDE gdzie należy klauzurę try catch wsadzić.

Konstruktor Specjalna metoda wywoływana automatycznie lub jawnie w momencie tworzenia obiektuNazwa taka sama jak nazwa klasyKonstruktor nie zwraca wartości, może mieć argumenty, może mieć przeładowany

Funkcje zaprzyjaźnioneSpecyficzna budowa konstruktora

Wysłać maila odnośnie tego czy jestem zainteresowana zerówką.

Programowanie obiektowe to metodologia tworzenia programów komputerowych która definiuje program za pomocą obiektów czyli elementów łączących stan (czyli dane) i zachowanie( czyli procedury tu metody)

Obiektowy program wyrażony jest jako zbiór obiektów i cos tam

Podejście obiektowe

Page 38: Programowanie obiektowe (object oriented programming) to ...kolos.math.uni.lodz.pl/~archive/Programowanie obiektowe/Notatki pod... · Język uml to język generyczny (takie modelowanie

Wykłady z Programowania Obiektowego 38

Wszystko jest obiektem (w java wszystko jest obiektem, nie ma zmiennych globalnych ani wyrzucania poza klasę, wszystko co nie jest typem prymitywnym dziedziczy po klasie object)Program jest zbiorem obiektów które wysyłają sobie komunikaty, czyli mogła się porozumiewać, do tego stosujemy metody, to jest element związany z zachowaniemKażdy obiekt posiada pamięć na którą składają się inne obiektyKażdy obiekt posiada swój typu (Najpierw typ potem instancja tego typu)Wszystkie obiekty tego samego typu mogą otrzymywać te same komunikaty

Obiekty i klasyKlasa oto złożony typ danych składający się z pól przechowujących dane oraz posiadający metody wykonujące zaprogramowane czynoscia

Obiekt może reprezentować cokolwiek

Pola i metodyObiekty zawierają pola czyli zmienne ich rola jest przechowywanie pewnych informacji o obiekcie jego charakterystykiObiekt może wykonywa na sobie pewne działania, a wiec uruchamiać zaprogramowane funkcje nazywamy je metodami albo funkcjami składowymi czynią one obiekt tworem aktuenym, nie jest on jedynie pojemniczkiem na dane tylko może nimi samodzielnie manipulować

Cechy obietku

Metoda

Konstruktory i destruktorySA to specjalne metody wywoływane podczas tworzenia obiektu oraz jego usuwania (destruktory w Java nie występują)Konstruktor nie może posiadać definicji zwracanego typu

Konstruktor bez Destruktor nie posiada definicji typu zwracanego oraz Ne otrzymuje żadnych argumentówKonstruktor i destruktor musza być zadeklarowane w publicznej? Części klasy

ParadygmatyAbstrakcjaEnkapsulacja (hermetyzacja)DziedziczeniePolimorfizm

Dwa ostatnie są ściśle związane z programowaniem obiektowym, a 3 od dołu (tworzenie warstwy abstrakcyjnej) powinno było już być wcześniej.

AbstrakcjaUmiejętność wyodrębnienia cech istotnych dla danego problemuSpojrzenie od strony generycznej, bardzo ogólnej, jak podzielić obiekt z czego on się składa, jak on się odnosi do wcześniej utworzonych projektów, myślimy tu już tez w kontekście enkapsulacji i dziedziczenia, tworzymy pewien model świata rzeczywistego poprzez uogólniania cech elementu. Patrzymy na obiekt jak na live, on mówi w jaki sposób się zachowuje, nie interesuje nas jak to zostało zrobione, jak został zaimplementowanym, nas interesuje jakie dane ten obiekt wystawia, jak mogę z tego obiektu korzystać. Klasyfikacja podobnych obiektów za pomocą klas.

Klasa abstrakcyjna nie posiada obiektów używana de definicji interfejsu dla klas z niej wywiedzionych. W Java SA interfejsy, tam jest ta klasa rozszerzona o zmienne statyczne

Page 39: Programowanie obiektowe (object oriented programming) to ...kolos.math.uni.lodz.pl/~archive/Programowanie obiektowe/Notatki pod... · Język uml to język generyczny (takie modelowanie

Wykłady z Programowania Obiektowego 39

mogące się pojawić w konstrukcji klasy abstrakcyjnej, a interfejsy to czyste deklaracje metod, mówi jak ta klasa się zachowuje nic więcej.

Rozróżniać deklaracje i definicje metody

Metoda abstrakcyjnaNie została jeszcze zaimplementowana tylko zadeklarowana aby zaimplementować ją w klasach potomnych Deklarowana jedynie wewnątrz klasy abstrakcyjnej klasa posiadająca przyPodczas dziedziczenia po klasie abstrakcyjnej….

EnkapsulacjaUkrywanie implementacjiZapewnia ze obiekt nie może zmieniać stanu wewnętrznego innych obiektów nieoczekiwany sposób, tylko wewnętrzne metody obiektu SA uprawnione do zmiany jego stanu każdy typ obiektu prezentuje innym obiektom swój interfejs który określa dopuszczalne metody współpracy. Pewne jerzyku osłabaja To założenie dopuszczając pewien poziom bezpośredniego kontrolowanego dostępu do wnętrzności obiektu. Ograniczają w ten sposób poziom abstrakcji Ukrycie wewnętrznej implementacji Dostęp do obiektów poprzez wyspecyfikowany interfejsOchrona i elastyczność koduInterakcja z obiektami poprzez wysyłania komunikatów (wywołania publicznych metod)

Nie należy wystawiać Pol jako public, dostęp do nich powinien być realizowany tylko przez metody gettery i settery, za ich pomocą ustawiały wartości

Enkapsulacja Możliwość wielokrotnego wykorzystania kodu

Poziomy kontroli dostępuPublic – wszyscy widzaPrivate – tylko twórca kasy i chyba funkcje zaprzyjaźnioneProtected – dostęp maja tylko dana klasa i klasy dziedziczące

DziedziczeniePorządkuje i wspomaga polimorfizm i enkapsulacje dzięki umożliwieniu definiowania i tworzenia specjalizowanych obiektów na podstawie bardziej ogólnych. Dla ogólnych specjalizowanych nie trzeba redefinować całej funkcjonalności lecz tylko tę, której nie ma obiekt ogólniejszy. W typowym przypadku powstają grupy obiektów zwane klasa mi, oraz grupy klas zwane drzewami,. Odzwierciedlają one wspólne cechy obiektów0technika wykorzystywania istniejących fragmentów kodu polega na tworzeniu nowych klas na bazie już istniejącychCechy wspólne dla wszystkich podklas definiowane SA w nadklasiePodklasa może nadpisywać zachowanie nadklasy, dodawać nowe atrybuty i zachowania.

PolimorfizmReferencje i kolekcje obiektów mogą dotyczyć obiektów różnego typu, a wywołanie metody dla referencji spowoduje zachowanie odpowiedniego dla pełnego typu obiektu wywoływanego (uwaga w która stronę można rzutować _ kot zwierze), niektóre jezyki udostępniają bardziej statyczne (w trakcie kompilacji) rozwiązania polimorfizmu nma przykład szablony i przeciążanie operatorów w c++- pozwala w jednolity sposób traktować obiekty klas z hierarchii dziedziczenia przy zachowaniu ich charakterystycznego zachowania

Niektóre języki wprowadzają modyfikacje do założeń obiektowości np.W niektórych językach każda klasa musi mieć swoja nadklasę

Page 40: Programowanie obiektowe (object oriented programming) to ...kolos.math.uni.lodz.pl/~archive/Programowanie obiektowe/Notatki pod... · Język uml to język generyczny (takie modelowanie

Wykłady z Programowania Obiektowego 40

- w niektórych językach nadklas może być więcej niż jedna (dziedziczenie wielobazowe)

Break continua switch caseDeklaracja dykcji podaje typ wyniku funkcji jej nazwę oraz typy argumentów. , czyli mamy średnikDefinicja funkcji czyli implementacja

Return w pętli, w metodzieRekurencjaModyfikacja obiektów zewnętrznych, uwaga na zagnieżdżanieReferencje, wskaźniki / nie będzie na zerówceCall back ? wywołanie metody za pomocą innej metody, callback to mechanizm wzorcem programistycznym który można zrobić za pomocą wskaźniki do funkcji

Podział programu na wiele plików – czy warto, jak to zrobić, jak je skonstruować, Kompilacja i łączenieMakefile – bardziej co to jest i po co, czy warto niż jak wygląda dokładniej, jak skonstruowany

Modyfikator static w c++ a w java, szczególnie w Java tam SA rodzaje zmiennych static, nonstatic, parametry metod, podział nazw i zmiennych

Inkrementacja i dekrementacja post i pre czyli co jak wsadzimy i—a co jak i++, ++i, --i(wypisanie zmiennej przed inkrementacja, po inkrementacji)

Stałe jak definiujemyVolatileSpecyfikator rozmiaru i znaku unsignedPodwójny :: operator zakresy, jak go wykorzystujemyZmienna this w c++ a w Java

Jak dziedziczymy w Java(jednokrotnie tylko, extend) jak w c++

Na zerówce więcej c++, mało pytań porównawczych, mniej Java ?

Co zawiera klasa pochodna, jak się odwołać do elementów z klasy bazowej

Zachowanie public, protected i private przy dziedziczeniu w ramach łamigłówki

Dziedziczenie wielokrotne i problem z konfliktem nazw, tutaj fajny ::, łamigłówka może tu być jakiś haczyk

Polimorfizm definicja i zastosowanie w c++Co to SA metody wirtualne, jak je wywołujemy

Abstrakcyjna metoda w łamigłówce. Deklaracja klasy abstrakcyjnej

Domyślne wartości parametrów, czy poprawne wywołanie metodyDomyślne wartości parametrów które mogą być inną funkcją

Przeciążanie funkcji Operator warunkowy itp.

Rzutowanie (bazowe na typ dziedziczony? Zwierze kot)

Konstrukcja operator – przypisanie

Page 41: Programowanie obiektowe (object oriented programming) to ...kolos.math.uni.lodz.pl/~archive/Programowanie obiektowe/Notatki pod... · Język uml to język generyczny (takie modelowanie

Wykłady z Programowania Obiektowego 41

Zmienne lokalne dla pętli

Delete New dynamiczne tworzenie obiektów, w jaki sposób© jest ta pamięć przydzielana, jak go zniszczyć

Metody w miejscu

Lista inicjalizacyjna konstruktora, do czego może być wykorzystana

Konstruktor domniemany (wywoła się bez żadnych argumentów tworzony przez kompilator)

Konstruktor kopiujący jego postać, const

Operatory, przeładowanie operatorów (np. <<), w przypadku Javy nie ma możliwości przeładowania operatorów Może być pytanie czy przykład przeładowania operatora jest poprawny, co jest nie tak.

Pamiętamy ze jest dwuargumentowy musimy dostać info o tym z jakiego strumienia i o elemencie który będziemy zapisywali do strumienia, ten strumień odebrany jako parametr do niego będziemy pisać wykorzystujemy funkcjonalność operatora pisana do strumienia zanim go rozładujemy, rozbijamy obiekt n poszczególne elementy i musimy zwrócić strumień pisany, pamiętamy ze operator działa lewostronnie , co jeśli nie zwrócimy referencji na operator

Konwersji typów czyli rzutowanie, jak można to robić (class zespolona) raczej to będzie w pierwszym terminie, a nie w zerówce.

Funkcje zaprzyjaźnione raczej 1 terminKlasy zaprzyjaźnione\biblioteka stl co to jest, jak to stosować, umieć skorzystać z Victora

Szablony funkcji i szablony klas bardo ogólnie, jak to stosować i co to jest , ważne w przypadku stl-a.

Bez formatowania ciągu wyjściowego

Java:Podstawy z wykładu 1, wiedzieć ze jest GC, jak zbudowany program, ze jest import zamiast include ze SA pakiety, co to JAR, Java doc co to , J2E,(J2Me?) aspekty obiektowości, co to interfejsy

saper.exe: main.o map.o pool.o user.o rank.o game.o menu.og++ -o saper main.o map.o pool.o user.o rank.o game.o menu.o

main.o: main.cppg++ -c main.cpp

map.o: map.cppg++ -c map.cpp

pool.o: pool.cppg++ -c pool.cpp

Page 42: Programowanie obiektowe (object oriented programming) to ...kolos.math.uni.lodz.pl/~archive/Programowanie obiektowe/Notatki pod... · Język uml to język generyczny (takie modelowanie

Wykłady z Programowania Obiektowego 42

user.o: user.cppg++ -c user.cpp

rank.o: rank.cppg++ -c rank.cpp

game.o: game.cppg++ -c game.cpp

menu.o: menu.cppg++ -c menu.cpp

clean:rm -f *.o

#g++ nazwa kompilatora# kolejność była: cel: wymagania; polecenie bez średnika i kolejna linia# szuka plików w katalogu bieżącym bo nie mam vpath# plik idzie z kompilatora do asemblera, tam dostaje rozszerzenie .o linker go przerabia # i składa całość w program wykonywalny# pierwsza linijka to wymienienie elementów składowych, potem jest próba ich połączenia# w jeden projekt, ale by sie to udało trzeba je stworzyć po to sa kolejne linijki# na koniec usuwam pliki z rozszerzeniem .o