Niezbędnik made by Siuda.doc

(115 KB) Pobierz
Niezbędnik made by Siuda

Niezbędnik made by Siuda

 

ten niezbędnik jest to zbior, pewnego rodzaju esencja najważniejszych informacji zawartych w greboszu. Obejmuje on zakres od klas po funkcje wirtualne włącznie. Przeznaczony jest glownie dla osob zaliczających kolo u Głowackiego. Nie ma tu zbędnych opisow i wytłumaczeń. Aby zrozumiec o co chodzi trzeba się podeprzeć symfonia.

 

Na początku powiem ze czeka was w chuj czytania J i duzo nauki J

Klasy nazwaklasy- tak się nazywa przykladowa klasa  składnik tej klasy to – skladnik i wiadomo o co chodzi

Klasa jest to nowy typ zdefiniowany przez użytkownika tak jak np. int short float

Deklaracja klasy to nazwaklasy { cialo klasy};

Nasz własny obiekt klasy tworzymy pisząc nazwaklay abc    obiekt czyli egzemplarz klasy

Możemy utworzyć typ pochodny od własnych typów np. wskaźnik nazwakasy*wsk ;

Albo referencje nazwaklasy obiekcik; nazwaklasy & przezw=obiekcik;

W ciele klasy definiuje się składniki klasy  mogą to być int float itd

Aby odnieść się do tych składników możemy uzyyc : nazwaklasy.skladnik lub wskaźnik -> składnik  referencja.skladnik

Składnikami klasy mogą być funkcje. Nie ma znaczenia w którym miejscu w klasie będzie i tak będzie znany w calej

Składnikiem klasy może być obiekt innej klasy

Zakresem ważności funkcji jest klasa w której się znajduje

Enkapsulacja – zawarcie w klasie składników i funkcji. Tworzony jest zwarty obiekt

W klasie funkcje mogą być spokojnie przeładowane.

Boze to dopiero początek pisania a mi się już nie chce

Jeśli składniki są private to tylko funkcje bedace składnikami klasy maja do nich dostep

Jeśli funkcje są private to tylko inne funkcje składowe tej klasy mogą je wywołać

Jeśli funkcje i składniki SA publiczne to jest do nich dostep spoza klasy

Jeśli nie zdefiniujemy dostępu to jest on domyślnie na private

Do składników private maja dostep tez klasy zaprzyjaźnione

Jeśli dostep jest protected to dostep maja klasy zaprzjaznione, i klasy pochodne

Po stworzeniu klasy nazwaklasy możemy stworzyc kilka egzemplarzy tej klasy piszac   naszaklasa a,b,c,d

Trzeba powiedziec ze klasa to tylko definicja tak jak int czy float a obiekt to już konkretny „obiekt „ :P tak jak int a int b

Jeśli nie stworzymy obiektu klasy to definicja klasy nie zajmuje miejsca w pamieci

Definicja klasy nie może mieć inicjalizatora czyli składniki klasy nie mogą mieć przypisanej wartości

Funkcje składowe są w pamieci jednokrotne a składniki tyle razy ile klas bo funkcje działają identycznie a składniki są rozne

Funkcje składowe maja pelny dostep do składników swojej klasy

Wywolanie funkcji dla konkretnego składnika to   nazwaklasy.nazwafunkcji(jakies argumenty);

Funkcje możemy wywołać wskaźnikiem i przez referencje  nazwaklasy * wsk ;  wsk =&nazwaobiektu;    referencja :

Nazwaklasy & przezwisko = nazwaobiektu;   przezwisko.nazwafunckcji(argumenty)

Definicja funkcji może znaleźć Się w ciele klasy albo poza nim ( tylko w klasie musimy zdefiniowac funkcje )

Poza klasa wyglada to tak : void nazwaklasy::nazwafunkcji(argumenty){cialo funkcji};

Nie ma znaczenia i zadnej roznicy gdzie jest tworzona funkcja

Jeśli jednak umieścimy w ciele klasy to będzie funkcja traktowana jako inline

Jeśli chcemy aby funkcja umieszczona poza klasa była inline musimy napisac przed nazwa funkcji inline void

W funkcji bez naszej wiedzy przesylany jest wskaźnik do konkretnego obiektu

Moglibyśmy sami to zrobic ale jeśli tego nie zrobimy to kompilator sam to zrobi i będzie fajnie bo mniej pracy dla nas

A i taki wskaźnik ma typ staly czyli cosnt i nie wolno nim poruszac

skladniki bedace w klasie zasłaniają skladniki o takiej samej nazwie ale globalne lub lokalne staja się one niedostępne

w klasie tez możemy sobie stworzyc zakres lokalny i skladniki z tego zakresu zasłonią skladniki klasy --- takie jaja

nazwa zaslania inna nazwe bez znaczenia czy to jest funkcja czy zmienna

kuzwa ze tez nikt się nie pokusil o stworzenie niezbędnika tylko ja teraz musze czas marnowac no… szczyt lenistwa ludzie !

jeśli nazwa funkcji jest przeslonieta przez zmienna to kompilator zaprotestuje jak pracownicy PKP

jeśli jednak chcemy bardzo ja wywołać to musimy uzyc :: w sposób następujący nazwaklasy::nazwafunkcji

funkcja skladowa ma zakres klasy a nieskladowa zakres pliku

jeśli funkcja globalna jest zaslonieta przez funkcje która jest przeladowana to i tak będzie brane pod uwage przeladowanie

przez domniemanie zaklada się ze obiekt jest przesylany do funkcji przez wartość

inline oznacza ze wszedzie gdzie jest wywolywana kompilator wstawi tresc funkcji

Nie dziala to Gdy funkcje jest definiowana poza klasa

Wysylanie przez wartość to znaczy ze funkcja tworzy na stosie ( do spalenia ) kopie danego obiektu i nadaje nazwe inna

Wysylanie przez wartość wydluza prace trwania programu i spowalnia go

Wysylanie przez referencje to stosowanie konkretnego przezwiska czyli funkcja ma dostep do oryginalu i nie kopiuje go

Jedyna roznica miedzy definiowaniem przez referencje i przez wartość to znak ameprsant czyli &

Przykladowa funkcja przez referencje nazwafunkcji( nazwaklasy & przezwisko )  proste jak funkcja liniowa

Co za tym idzie przy referencji funkcja może dokonywac zmian na oryginale

Konstruktor nazywa się tak samo jak klasa

Jest on automatycznie wywoływany gdy tworzymy nowy obiekt klasy

Konstruktor możemy definiowac wewnątrz lub poza cialem klasy

Wspomne ale tylko dla wlasnej informacji ze znaczek :: mowi nam ze dana funkcja odnosi się do danej klasy

Jak to nie rozumiesz przeciez to proste !

Dwa konstruktory możemy definiowac tak jak inty po przecinku np. nazwaklasy konstr1( argumenty ), kontr2( argumenty)

Naturalnie konstruktory mogą mieć przeladowane nazwy, to który zostanie wywolany wynika z kolejności i typow argumento

Konstruktor jest wywoływany raz. Tylko wtedy gdy obiekt jest powoływany do zycia

Konstruktor to nie konstruktor. To znaczy ze nie konstruuje tylko nadaje wartość poczatkowa

Przeciwieństwem konstruktora jest destruktor. Wywoływany jest gdy obiekt klasy ma być zlikwidowany

Destruktor to funkcja skladowa klasy i definiuje się ~nazwaklasy ()

Destruktory i konstruktory nie maja określonego typu zwracania !

Nie wiem czy mowilem już ale zmienna globalna jest dostepna wszystkim i w calym programie

Dana statyczna jest definiowana jednokrotnie ijest dostepna dla wszystkich obiektow klasy w której jest zdefiniowana

Definiujemy ja piszac przed deklaracja skldnika slowo static      for example static int składnik;

Deklaracja takiego składnika to nie jego definicja. Musimy go zdefiniowac tak aby był globalny i możemy mu nadac wartość

Składnik statyczny może być typu private

Mamy 3 sposoby odniesienia się do składnika static nazwaklasy::składnik , obiekt.skladnik , nazwaklasy*wsk ; wsk->składnik

Jeśli nie zainicjalizujemy ( trudne slowo ) składnika statycznego to jest on domyślnie z wartością 0

Jeśli funkcja pracuje tylko na statycznych składnikach to można ja zadeklarowac jako statyczna

Funkcje statyczna można wywołać nie tylko na rzecz obiektu ale także klasy

Wewnątrz funkcji składowej nie możemy się odnosic do wskaźnika his oraz niestatecznego składnika klasy

funkcje static możemy wywołać nawet wtedy gry nie istnieje żaden obiekt klasy

mam nadzieje ze podpierasz to co tu pisze czytaniem grebosza

ostatecznie funkcja static może się odwoływać do niestatecznych składników poprzez obiekt.nazwaskladnika albo wskaznikie

wazne ze za pomoca funkcji static możemy się odwołać do elementu private klasy

skladniki z dopiskiem const nie mogą być zmieniane. Maja jedna ustalona wartość.

Obiekt const mogą wywołać tylko funkcje które go nie zmienia czyli cosnt

Jak znow nie rozumiesz…. Doczytaj z grebosza a zrozumiesz…. LENIU !

Funkcja const możemy wywołać skladniki niecosnt

Funkcja volatile sięga zawsze po prawdziwe dane składowe bez względu na etap programu który się wykonuje cofnie się na pocza

Rozniez ona pracuje na składnikach niecosnt i ma się dobrze

Funkcja może być zarówno const jak i volatile jednoczesnie

Konstruktory nie mogą mieć takich przydomkow a mimo to pozwalaja pracowac na takich obiektach ( łaskawcy )

Funkcje składowe aby moc być przeladowanymi musza się roznic lista argumentow. Nie ma znaczenia czy będzie cosnt czy Volat

Jeśli przeladujemy funkcje const to kompilator będzie próbował dopasowac tylko z tych które maja const reszte odrzuci

To samo się tyczy tych z volatile

Funkcja zaprzyjazniona to taka która mimo iż nie jest składnikiem klasy ma dostep do wszystkich nawet prywatnych sklad klasy

Wazne jest to ze to klasa musi mowic ze się przyjazni z jakas funkcja. Wiec w klasie głównej piszemy słówko friend J

Powtorze ze jeśli jakies skladniki klasy SA prywatne to tylko funkcje tej klasy maja do nich dostep.

Funkcja może być przyjacielem wiecej niż jednej klasy

Funkcja zaprzyjazniona może wykonywac konwersje na argumentach jej wywolania zdefiniowane przez nas

Przy deklaracji przyjazni może być tylko deklaracja klasy

Funkcja zaprzyjazniona nie ma wskaźnika this bo nie jest składnikiem klasy w takich sytuacjach albo . albo ->

Przyjacielem się jest albo nie jest wiec nie ma znaczenia w którym miejscu klasy zdefiniujemy sobie frienda

Jeśli w klasie będzie cala definicja funkcji zaprzyjaźnionej to jest to funkcja inline, jest przyjacielem

W przypadku przeladowania przyjacielem jest funkcja która odpowiada liscie argumentow z deklaracji przyjazni

Funkcja zaprzyjazniona może być funkcja skladowa innej klasy i ma dostep wtedy do obu klas

Funkcja zaprzyjazniona nie zawiera wskaźnika this do obiektow klas zaprzyjaźnionych jednak do swojej wlasnej tak

Możemy deklarowac zaprzyjaźnienia z klasami. Wystarczy napisac friend nazwaklasy nazwaobiektu

Przyjazn jest jednostronna i klasa która jest przyjacielem nie deklaruje żeby ta druga mogla w niej grzebac

Deklaracja funkcji zaprzyjaźnionych jest możliwa tylko względem istniejących już funkcji. Tzn musza  być zdefiniowane

Czyli nie ma możliwości przyjazni funkcji klasy a z klasa b i jednoczesnie sytuacji odwrotnej.

Jedyny sposób to deklaracja przyjazni calej klasy. Tam ma racje bytu definicja zapowiadajaca

Przyjazn Nie jest przechodnia tzn przyjaciel mojego przyjaciela to nie mój przyjaciel

Wazna uwaga. Funkcja jest zaprzyjazniona z klasa a nie z obiektem. To znaczy ze ma dostep do wszystkich obiektow

Przyjazn nie jest dziedziczona

Struktury:

Struktura to klasa w której przez domniemanie wszystkie składniki są publiczne

Definiujemy przez napisanie struci nazwastructu

Unie

Unia służy do przechowywania w pamięci   jednego obiektu.

Rozmiar Uni jest taki jak rozmiar jej największego składnika

Odnoszenie się do składnika obdyba się za pomoca kropki tzn nazwaibiektu.naswaskladnika

Jeśli mamy zapisana w unii np. liczbe 4 i zapiszemy nastepnie w niej np. litere d to liczba jest usuwana na rzecz litery

Jak wczytujemy do uni dany typ to tez taki musimy z niej odczytac

Oczywiście tu tak jak w strukturze domniemanie jest public wszystko

Tak jak klasach i strukturach możemy używać slowa public i private

Unia nie może być dziedziczona

Składnikiem unii nie może zostac obiekt klasy która ma konstruktor lub destruktor

Powiadam Ci ze to 3 strona gesto zapisanego tekstu a jest jeszcze ich 270 w książce:p do tej pory zapisałem ok. 60 str z ksiazki

Składnikiem unii nie może zostac obiekt klasy która ma operator przypisania = zdefiniowany przez nas

Unia nie może mieć funkcji wirtualnej

Unie inicjalizujemy piszac union nazwa uniona :p

Do składników unii która nie ma nazwy odnosimy się piszac wprost składnik=cos

Jak definiujemy w takiej unii sklanik aaa to nigdzie indziej takiego składnika globalnego być nie może

Taka unia nie może mieć składnika private i tez nie może mieć funkcji składowej

Unia która nie ma nazwy typu ale ma obiekt lub skalnik wskazujący na nia nie jest już unia anonimowa

Pole bitowe to typ skalnika klasy na którym jest przechowywana informacja na danej ilości bitow

Pole bitowe może mieć wszystkie typy  i zapisujemy go tak typ nazwapola : ilość zajmowanego miejsca

Dane z Pol bitowych układane SA wedlug kolejności implementacji

Do składników dostajemy się przez nazwaklasy.skladnik

Nie można na pole bitowe pokazac wskaźnikiem i nie może ono mieć referencji

Konstruktor sam nie przydziela sobie pamieci na obiekt on ja inicjalizuje

Jeśli klasa ma odpowiedni konstruktor to jest on uruchamiany przy każdym definiowaniu obiektu

Konstruktor może być przeladowany

Nie zwraca zadnej danej i nie ma zdefiniowanego typu zwracania

Konstruktor może być wywolany aby stworzyc obiekt const lub volatile ale sam taki być nie może i być static i virtual nie może

Konstruktor ma nazwe taka jak klasa

Konstruktor jest uruchamiany automatycznie gdy napotka definicje obiektu

Konstruktory globalnych i sttycznych obiektow ruszaja zanim Się main zacznie

Operator New. Tworzymy nim nowe obiekty które zyja do momentu Az nie napotkaja delete

Obiekt taki jjest dostępny tylko wtedy gdy istnieje przynajmniej jeden wskaźnik pokazujący na niego

Zadaniem konstruktora jest utworzyc obiekt  nazwaklasy(argumenty)

Konstruktor jest wywoływany gdy tworzymy obiekty chwilowe i gdy powstaje obiekt klasy zawierający w sobie obiekt innej klas

Destruktor jest wywoływany gdy jest likwidowany obiekt

Klasa nie musi mieć obowiązkowo destruktora, destruktor nie likwiduje obiektu i nie zwlnia pamieci która obiekt zjmowal

Przydaje się wtedy gdy trzeba posprzątać

Destruktor nie zwraca zadnej wartości i nie może być przeladowany

Destruktor jest automatycznie wywoływany gdy obiekt chwilowy lub automatyczny wychodzi z zkaresu swojej ważności

Obiekt klasy majacej destruktor nie może być składnikiem unii

Destruktor nie ma przydomkow cons i volat… ale może pracowac na obiektach swojej klasy z czyms takim

Destruktor można wywołać jawnie  nazwaobiektu.~nazwaklasy()

Bo destruktor to nazwaklazy poprzedzona wezykiem

Z wnętrza klasy w której dziala destruktor możemy go wywołać piszac this ->~nazwaklasy()

Konstruktor domniemany to taki który możemy wywolac bez argumentow             

Jeśli klasa nie ma konstruktora to go sobie sama wywola i będzie on domniemany

Konstruktor wyglada tez tak nazwaklasy::nazwaklay (argumenty) : lista inicjalizacyjna {}

Konstruktor może być w klasie zdeklarowany a poza nia dopiero zdefiniowany

Lista inicjalizacyjna to lista prac które ma  konstruktor wykonac

Jeśli na liscie jest napis costam(f) to oznacza to składnik costam zainincjalizowac watroscia argumentu f

Czyli składnikowi const możemy nadac wartość tylko przez liste inicjalizacyjna

Lista inicjalizacyjna nie może zainicjalizowac składnika static

Składnik static jest staly dla wszystkich obiektow klasy w której powstal

Obiekt jakiejs klasy ktory jest składnikiem innej klasy może być inicjalizowny tylko w liscie inicjalizacyjnej

Jeśli obiekt składówy nie posiada konstruktora to się go nie umieszcza na liscie inicjalizacyjnej

Jeśli klasa ma konstruktor domniemany to można go na liscie pominąć

Jeśli klasa ma kilka konstruktorow i wszystkie z argumentami trzeba określić który konstruktor uruchomic

Najpierw do pracy rusza destruktor klasy zawierającej obiekty a dopiero potem destruktor obiektow składowych

Pierwsze 100 stron zrobione

Obiekty składowe w klasie maja pierszenstwo z konstruktorami a dopiero po nich wskakuje konstruktor klasy

Klasa która nie ma publicznych konstruktorow jest nazywana prywatna

Konstruktory mogą być w klasie jedne prywatne a drugie publiczne

Jeśli konstruktor jest protected to zachowuje się jak private tylko klasy pochodne tez maja do niego dostep

Kuzwa ale mi się nie chce tego pisac…

Konstruktor kopiujący kopiuje już instniejacy obiekt nazwaklasy::nazwaklasy(nazwaklasy &)

Konstruktor kopiujący nie jest obowiązkowy jeśli sami go nie napiszemy to sam się skubany wygeneruje

Konstruktor kopiujący dziala na zasadzie inicjalizacji

Niejawne wywolanie konstruktora nastepuje w sytuacji :podczas przesylania argumentow do funkcji jeśli argumentem funkcji jest obiekt klasy X a przeslanie odbywa Się przez wartość, druga sytuacja to podczas gdy funkcja jako rezultat swoiej pracy zwraca obiekt klasy X przez wartość

To ze konstruktor przyjmuje jako argument referencje klasy daje mu możliwość pracowania na oryginale i może go modyfikowac

Konstruktorowi kopiującemu nie można ufac bo to wredna bestia jest i może zmienic wartość poczatkowa argumentu

Obiekty const nie mogą być wykorzystane aby robic z nich kopie

Jeśli chcemy zagwarantowac ze konstruktor kopiujący nic nie zmieni piszemy nazwaklasy::nazwaklasy( const nazwaklasy&kopi)

Boze jak to wytłumaczyć …. Jeśli nasza klasa ma skladniki bedace obiektami innych klas to sposób ten możemy zastosowac tylko wtedy gry konstruktory wewnętrznych obiektow można wywołać dla obiektow typu const

Jeśli sami nie napiszemy konstruktora kopiującego to komputer sam go wygeneruje i będzie składnik po składniku kopiowal

Do indentycznych kopii wystarczy nam automatyczny konstruktor wiec nie ma sensu się piedrolic z pisaniem tego samemu

Zrob przerwe i piwa się napij J

Możemy sobie stworzyc tablice obiektow naszej klasy robimy to tak nazwaklasy nazwatablicy [ilość kratek]

Możemy się odnosic do elementow tych tablic za pomoca wskaźników i kropki

Pamiętaj człowieku mlody ze jak masz 8 element tablicy to jest on tak naprawde 9

Agregat to skupisko danych

Takim skupiskiem jest np. tablica obiektow klasy k lub obiekt klasy k gdy klasa k nie ma składników danych prywatnych lub zastrzezonych , nie ma konstruktorow ani klas podstawowych i funkcji wirtualnych

Agregat można inicjalizowac za pomoca listy inicjalizacyjnej

Sama tablica jest agregatem

W liscie inicjalizacyjnej możemy zamieszczac mniej argumentow niż dany obiekt wymaga.

Gdy czegos nie wypelnimy danymi wtedy przyjmowana jest wartość 0 lub null dla strongow

Jeśli tablica lub obiekt nie jest agregatem to nie można ich inicjalizowaz za pomoca listy inicjalizacyjnej

Lista inicjalizatorow lezy poza obszarem ważności kalsy wiec skladniki private nie SA obejmowane

Tablice które tworzone SA w zapisie pamieci za pomoca operatora New nie mogą mieć jawnie wpisanej inicjalizacji

Takie tablice możemy wykreowac gdy klasa nie ma konstruktora i wśród swoich konstruktorow ma kontr domniemany

Bo konstruktor domniemany zajmuje się inicjalizacja tej tablicy

Konwersje może sobie definiowac sam użytkownik

Sluzy do tego albo konstruktor klasy X przyjmujący jako jedyny argument obiekt typu A albo operator konwersji

Operator konwersji to specjalna funkcja skladowa

Konwersje mogą być wywoływane jawnie lub nie. Kompilator sam sobie może ich używać

Konstruktor przyjmujący jeden argument okresla konwersje od typu tego argumentu do tpu klasy do której sam należy

Generalnie wyskakuje konstruktor który zamienia typy i to tyle w temacie konwersji

Konstruktor wyglada tak  na przykładzie funkcji zespolonej chyba     nazwa klasy nazwaobiektu = nazwafunkcji( argumenty)

Typem który konwertujemy nie musi być np. int może to być tez klasa

Aby było to możliwe klasa musi udostępnić skladniki. Najlepiej przez public funkcje które dadza te skladniki ub deklaracje firiend

Funkcja konwertujaca wygląda następująco K::operator t() t-jest to typn na który chcemy konwertowac

Musimy wyposażyć w taka funkcje nasza klase

Funkcja konwertujaca nie musi być funkcja skladowa klasy. Jest w niej wskaźnik This do obiektu który ma podac konwersji

Funkcja –II—nie ma określonego typu rezultatu zwracanego i nie może być przeladowana, jest dziedziczona i może być wirtualna

Konstruktor jednoargumentowy przeksztalca nam od obcego typu na typ swojej klasy.

Funkcja konwertujaca od typu swojej klasy na typ obcy

Możemy wybrac jeden odpowiedni sposób. Oba razem wywołają blad. No chyba ze my jawnie napiszemy co ma zrobic to ok.

Wady konstruktora do konwersji : nie można zdefiniowac go do typu wbudowanego, nie można napisac go do klasy do której nie mamy dostępu, musimy mieć dostep do obu klas z których chcemy konwertowac, tu argumenty musza pasowac ten przy konstruktorze konwertującym do tego deklarowanego w konstruktorze

Jego się nie dziedziczy

Funkcje konwertujaca możemy dziedziczyc

Wszedzie tam gdzie się nie zgadzaja typy argumentow wylezie nam konwersja i zrobi porządek do tego niejawnie

Nie można stosowac konwersji 2 razy. X na Y a potem Y na Z żeby mieć X na Z tyczy to tylko niejawnych konwersji

...

Zgłoś jeśli naruszono regulamin