Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

Programowanie strukturalne i obiektowe C++ Powtórzenie wiadomości z C++ Robert Nowak.

Podobne prezentacje


Prezentacja na temat: "Programowanie strukturalne i obiektowe C++ Powtórzenie wiadomości z C++ Robert Nowak."— Zapis prezentacji:

1 Programowanie strukturalne i obiektowe C++ Powtórzenie wiadomości z C++ Robert Nowak

2 Schemat prostego programu #include using namespace std; int main() { instukcje; return 0; }

3 Dyrektywy preprocesora Wszystkie dyrektywy preprocesora poprzedzone są znakiem #. Wszystkie dyrektywy preprocesora są wykonywane przez specjalny program zwany preprocesorem stąd ich nazwa. Najczęściej wykorzystywaną dyrektywą preprocesora jest dyrektywa include – służy ona do dołączania plików nagłówkowych. Każdy z tych plików rozszerza możliwości C++. Dzięki plikowi iostream możemy wypisywać zarówno liczby jak i tekst oraz wczytywać w prosty sposób dane wprowadzane przez użytkownika programu.

4 Przestrzenie nazw Wraz z rozwojem języka ilość bibliotek stale rosła, a unikatowych nazw dla funkcji i zmiennych zaczynało brakować. Wymyślono wówczas przestrzenie nazw, mające zapobiegać problemowi nakładania się nazw. Dawniej, aby wyświetlić tekst wystarczyło napisać: cout<<"napis"<<endl; teraz natomiast trzeba pisać std::cout<<"napis"<<std::endl; lub poinformować kompilator, że chcemy używać przestrzeni nazw std bez przedrostka. Linijka, którą informujemy kompilator o takiej zmianie to: using namespace...; gdzie za wielokropek wstawiamy nazwę przestrzeni.

5 Główna funkcja programu - main Kiedy uruchamiamy nasz program, zaczyna on wykonywać kod zawarty w funkcji main(). Od niej więc rozpoczyna się działanie aplikacji – a nawet więcej: na niej też to działanie się kończy. Zatem program (konsolowy) to przede wszystkim kod zawarty w funkcji main() – determinuje on bezpośrednio jego zachowanie. Funkcja ta musi mieć zawsze nazwę main – tak ktoś sobie wymyślił, że główna funkcja programu tak się nazywa i tak już pozostało do dzisiaj.

6 Najprostsza funkcja main (która nic nie robi), wygląda tak: int main() { return 0; } Jeśli chcemy, aby nasz program cokolwiek wykonał, musimy umieścić dodatkowy kod pomiędzy { oraz return 0 ;

7 Operacje Wejścia/Wyjścia Do wypisywania i wczytywania danych używamy tzw. strumieni. cout - obsługuje wyprowadzanie danych na standardowe wyjście, czyli ekran. cin - obsługuje wprowadzanie danych ze standardowego wejścia, czyli klawiatury. Używamy do tego dodatkowo operatorów wstawiania > danych do i ze strumienia.

8 Zatrzymanie wykonywania programu Aby obejrzeć wyniki wykonania programu używaliśmy funkcji getchar(), która służy do wczytywania znaków z klawiatury. W naszym przypadku zatrzymywała wykonywanie programu do naciśnięcia dowolnego klawisza

9 Określenie typu zmiennej W języku C++ musimy jawnie określić typ zmiennej. Określenie typu zmiennej jest bardzo proste. Symbolicznie, robi się to następująco: nazwa_typu nazwa_zmiennej; Określenie nazwa_typu to typ, jaki będziemy chcieli, aby miała nasza zmienna. Tutaj nie możemy wpisać dowolnego słowa. Typy w języku C++ są określone i musimy użyć jednego ze specjalnych słów. Z kolei nazwa_zmiennej to nazwa, jaką wymyślimy dla zmiennej. Nazwa zmiennej to tzw. identyfikator.

10 Podstawowe typy liczbowe Podstawowe typy liczbowe występujące w języku C++ to: int - typ całkowity, zakres wartości: - 2147483648 ÷ 2147483647, zajmuje 4 bajty pamięci float- typ zmiennopozycyjny (ułamkowy), zakres wartości: 1,2  10 -38 ÷ 3,4  10 38 dokładność 7 cyfr, zajmuje 4 bajty pamięci double - typ zmiennopozycyjny podw ó jnej precyzji (dokładniejszy niż typ float), zakres wartości: 2,2  10 -308 ÷ 1,8  10 308 dokładność 15 cyfr, zajmuje 8 bajty pamięci

11 Typ znakowy Typ znakowy umożliwia przechowywanie jednego znaku. Typ znakowy w języku C++ to: char - typ znakowy Znaki zapisujemy w pojedynczych cudzysłowach ' (apostrofach). Na przykład poniższa instrukcja spowoduje wypisanie litery a, spacji, a następnie litery b. cout <<'a'<<' '<<'b';

12 Czym są operatory Operatory w C++ pełnią funkcję podobną jak operatory w matematyce. Umożliwiają one po prostu przeprowadzanie różnych działań na zmiennych. Samych grup operatorów jest co najmniej kilka, dlatego czas je poznać, bowiem bez nich dalsza nauka języka nie będzie możliwa.

13 Najważniejszy operator – operator przypisania Jednym z najważniejszych operatorów w języku C++ jest operator przypisania. Operator ten umożliwia przypisywanie wartości danej zmiennej. = operator przypisania (to nie jest operator równości!) Aby dokonać przypisania, po lewej stronie operatora musimy mieć nazwę zmiennej, a po prawej stronie wyrażenie którego wartość chcemy przypisać zmiennej. zmienna = wyrażenie;

14 Operatory arytmetyczne Kolejną grupę stanowią operatory arytmetyczne. Operatory te działają jak znane z matematyki operatory. Oto lista dostępnych operatorów arytmetycznych: + operator dodawania, - operator odejmowania, * operator mnożenia, / operator dzielenia, % operator reszty z dzielenia (zwany operatorem modulo) + operator znaku liczby (np. +3), liczba domyślnie jest zawsze dodatnia - operator znaku liczby (np. -45, -5.678).

15 Instrukcja złożona Instrukcją złożoną nazywa się sekwencję instrukcji ujętą w parę nawias ó w klamrowych: { instrukcja-1; instrukcja-2;... instrukcja-n; } W składni języka taka sekwencja jest traktowana jako jedna instrukcja. Instrukcje złożone mogą być zagnieżdżane.

16 Instrukcja warunkowa „jeśli” Og ó lna postać instrukcji „ jeśli ” jest następująca: if (wyrażenie) instrukcja lub if (wyrażenie) instrukcja1; else instrukcja2; gdzie wyrażenie musi wystąpić w nawiasach okrągłych, zaś żadna z instrukcji nie może być instrukcją deklaracji.

17 Opis działania instrukcji „jeśli” Wykonanie instrukcji if zaczyna się od obliczenia wartości wyrażenia. Jeżeli wyrażenie ma wartość różną od zera (prawda), to będzie wykonana instrukcja (lub instrukcja1 ); jeżeli wyrażenie ma wartość zero (fałsz), to w pierwszym przypadku instrukcja jest pomijana, a w drugim przypadku wykonywana jest instrukcja2. Każda z występujących tutaj instrukcji może być instrukcją prostą lub złożoną, bądź instrukcją pustą. Pierwsza postać instrukcji „ jeśli ” nazywana jest instrukcją warunkową „ jeśli ” prostą, a druga instrukcją warunkową „ jeśli ” z alternatywą.

18 Operatory relacyjne Operatory relacyjne (dwuargumentowe) służą do konstrukcji wyrażeń porównania. Operatorami tymi są: ==„równy” !=„nierówny” <„mniejszy” >„większy” <=„niewiększy” lub „jest zawarty” >=„nie mniejszy” lub „zawiera” Wynik wyrażenia porównania jest typu bool i posiada wartość 0, gdy relacja jest prawdziwa oraz wartość 1, gdy relacja jest fałszywa.

19 Operatory logiczne Operatory logiczne służą do wykonywania operacji logicznych na wartościach typu bool. Operatorami tymi są: &&i !nie ||lub

20 Instrukcje iteracyjne Instrukcje iteracyjne umożliwiają wielokrotne wykonywanie pewnych sekwencji instrukcji, czyli pętli, które są podstawą programowania. W języku C++ są trzy instrukcje iteracyjne: instrukcja „ dla ” ( for ), instrukcja „ dop ó ki ” ( while ), instrukcja „ wykonuj dop ó ki ” ( do… while )

21 Instrukcja „dla” (for) W por ó wnaniu z analogiczną instrukcją pascalową, instrukcja „ dla ” języka C++ ma szersze możliwości i jest bardziej elastyczna. Jej og ó lna postać przedstawia się następująco: for (w.-inicjujące; w.-warunkowe; w.-zwiększające) instrukcja Wyrażenie inicjujące może być dowolnego rodzaju, najczęściej jest ono wyrażeniem wyliczeniowym, zawierającym listę inicjacji liczników pętli. Język C++ dopuszcza w wyrażeniu inicjującym również deklaracje zmiennych.

22 Wartość wyrażenia warunkowego musi być typu skalarnego, zaś wyrażenia zwiększające mogą być dowolnymi poprawnymi wyrażeniami języka C++. Każde z wyrażeń występujących w instrukcji „ dla ” może zostać pominięte.

23 Wykonywanie pętli „dla” Wykonywanie pętli „ dla ” odbywa się w następujący spos ó b: 1. 1.Obliczane są wyrażenia inicjujące, co najczęściej powoduje zainicjowanie licznik ó w pętli. 2. 2.Obliczane jest wyrażenie warunkowe, jeśli jest ono niezerowe (prawda) wykonywana jest instrukcja związana z instrukcją for. 3. 3.Obliczane są wyrażenia zwiększające, co powoduje zwykle zwiększenie lub zmniejszenie licznik ó w pętli. 4. 4.Ponownie obliczane jest wyrażenie warunkowe, jeżeli jego wartość jest r ó żna od 0 – wykonywane są ponownie czynności z punktu 2.

24 Instrukcja „dopóki” (while) Og ó lna postać instrukcji „ dopóki ” ( while ): while (wyrażenie-warunkowe) instrukcja Instrukcja instrukcja jest wykonywana do momentu, kiedy wyrażenie warunkowe osiągnie wartość 0 (fałsz), czyli instrukcję while można by przetłumaczyć: dopóki wyrażenie warunkowe ma wartość oznaczającą prawdę (różne od zera), wykonuj instrukcję instrukcja.

25 Instrukcja „wykonuj dopóki” (do… while) Og ó lna postać instrukcji „ wykonuj dopóki ” ( do… while ) przedstawia się następująco: do instrukcja while (wyrażenie-warunkowe);

26 Instrukcja instrukcja jest wykonywana do momentu, gdy wyrażenie warunkowe osiągnie wartość zero (fałsz). Instrukcję do…while można więc przetłumaczyć jako: wykonuj instrukcję instrukcja, dopóki wartość wyrażenia warunkowego oznacza prawdę. Instrukcje tę stosujemy zamiast instrukcji while wówczas, gdy zależy nam, aby wykonana została przynajmniej jedna iteracja.

27 Postać instrukcji wyboru Instrukcja wyboru ma następującą postać og ó lną: switch (wyrażenie-sterujące) instrukcja Instrukcja switch działa podobnie (ale nie tak samo), jak instrukcja case znana z Pascala. Na podstawie wartości wyrażenia sterującego pozwala ona przenieść wykonywanie programu do wskazanego miejsca. Wyrażenie sterujące musi być typu całkowitego, zaś instrukcja instrukcja jest dowolną instrukcją języka C++.

28 Zwykle jednak instrukcja wyboru przybiera postać: switch (wyrażenie-sterujące) { etykieta-wyboru instrukcje … etykieta-wyboru instrukcje } Etykieta wyboru może przyjąć jedną z postaci: case wyrażenie-stałe-typu-całkowitego: default: Etykieta default jest nazywana domyślna etykietą wyboru. W obrębie jednej instrukcji wyboru nie wolno stosować etykiet zawierających wyrażenia stałe o tej samej wartości.

29 Wykonanie instrukcji wyboru Wykonanie instrukcji wyboru polega na obliczeniu wartości wyrażenia sterującego i kontynuowaniu wykonywania programu począwszy od etykiety wyboru, której wyrażenie stałe ma wartość równą obliczonej wcześniej wartości wyrażenia sterującego. Jeśli żadne z wyrażeń stałych nie spełnia tej równości, wówczas wykonywany jest skok do miejsca określonego domyślną ( default ) etykietą wyboru lub jeśli jej nie ma – wykonywanie instrukcji wyboru ulega zakończeniu.

30 Uwaga Po wykonaniu skoku do etykiety wyboru wykonywane są kolejno instrukcje programu bez względu na występujące po drodze etykiety wyboru. Jeśli więc skok nastąpił do pierwszej z dziesięciu etykiet wyboru, wykonane zostaną r ó wnież instrukcje związane z pozostałymi etykietami. Za pomocą instrukcji break można wymusić zakończenie wykonywania instrukcji wyboru np. W momencie zakończenia wykonywania instrukcji dla danego przypadku.

31 Przykład 1 switch (miesiac) { case 1 : dni=31; break; case 2 : dni=28; break; case 3 : dni=31; break; case 4 : dni=30; break; case 5 : dni=31; break; case 6 : dni=30; break; case 7 : dni=31; break; case 8 : dni=31; break; case 9 : dni=30; break; case 10 : dni=31; break; case 11 : dni=30; break; case 12 : dni=31; break; }

32 … char z; … switch (z) { case ‘ w ’ : cout<<"wysoki" break; case ‘ n ’ : cout<<"niski"; break; default : cout<<"nijaki" } Przykład 2

33 Pojęcie tablicy Tablica jest złożoną strukturą danych, składającą się z określonej liczby element ó w tego samego typu. Dostęp do elementów jest możliwy za pośrednictwem indeksu(ów) – liczby (liczb) określającej położenie elementu w tablicy.

34 Deklaracja tablicy Deklaracja tablicy N-wymiarowej (zwanej także zmienną tablicową) o wymiarach wymiar1, wymiar2,…, wymiarN wygląda następująco typ-elemetu-tablicy ident-tablicy[wymiar1][wymiar2]…[wymiarN] Wymiar tablicy, który określa liczbę elementów zawartych w tablicy, jest ujęty w parę nawiasów prostokątnych i musi być większy lub równy jedności. Jego wartość musi być wyrażeniem stałym typu całkowitego, możliwym do obliczenia w fazie kompilacji; oznacza to, że nie wolno używać zmiennej dla określenia wymiaru tablicy.

35 Dostęp do elementów tablicy Najprostszym sposobem dostępu do elementu tablicy jest podanie jego pozycji (indeksu(ów)) w nawiasach kwadratowych, np. tablica [20][11]. Należy pamiętać, że w języku C++ pierwszy element tablicy ma wszystkie indeksy r ó wne zero – dostęp do pierwszego elementu tablicy wygląda następująco: tablica[0]…[0]. W ten sposób pozycję ostatniego elementu tablicy określają indeksy [wymiar1-1]…[wymiarN-1]

36 Funkcje Funkcją nazywamy wyodrębnioną część programu, stanowiącą pewną całość, posiadającą jednoznaczną nazwę i ustalony sposób wymiany informacji z pozostałymi częściami programu. Funkcje są stosowane do wykonania czynności, które mogą być wykorzystane w różnych programach lub i wykonania czynności wielokrotnie powtarzanych przez dany program. W przypadku programów rozwiązujących obszerne problemy, w których wyróżnić można kilka podprogramów, zastosowanie funkcji umożliwia opracowanie każdego z tych podproblemów oddzielnie. Wystarczy wówczas dla zbudowania programu zestawić funkcje oraz odpowiednio je połączyć.

37 Prototyp funkcji Prototyp (deklaracja) funkcji to wstępne określenie jej nagłówka. Stanowi on informację dla kompilatora i programisty o sposobie, w jaki funkcja może być wywołana. Składnia prototypu funkcji ma postać: typ_zw_wart nazwa_funkcji (typ_par nazwa_par,...);

38 Definicja funkcji Składnia definicji funkcji jest następująca: identyfikator-funkcji (lista-deklaracji-parametrów) { instrukcje } Definicja funkcji składa się z nagłówka funkcji oraz z jej ciała. Nagłówek przypomina prototyp funkcji, w którym wszystkie parametry muszą być nazwane a na końcu nagłówka nie występuje średnik. Ciało funkcji jest ujętym w nawiasy klamrowe zestawem instrukcji. Ostatnią instrukcją przed nawiasem klamrowym zamykającym blok funkcji musi być instrukcja return.

39 Instrukcja return Instrukcja return występuje często w postaci: return wyrażenie; gdzie wyrażenie określa wartość zwracaną przez funkcję. Jeżeli typ tego wyrażenia nie jest identyczny z typem funkcji, to kompilator będzie próbował osiągnąć zgodność typów drogą niejawnych konwersji. Jeżeli okaże się to niemożliwe, to kompilacja zostanie zaniechana. Zgodność typu zwracanego z zadeklarowanym typem funkcji można również wymusić drogą konwersji jawnej.

40 Funkcja typu void Jeżeli funkcja jest typu void to nie zwraca ona żadnej wartości i odnosząc się do języka programowania Pascal możemy ja nazwać procedurą, chociaż zawodowi programiści języka C++ nie stosują tej nazwy tylko taką funkcję nazywają funkcją nie zwracającą wyniku (wartości).

41 Zmienne w programie i funkcjach Zmienne zadeklarowane na zewnątrz funkcji nazywamy zmiennymi globalnymi, a zmienne opisane wewnątrz funkcji – zmiennymi lokalnymi. Rozr ó żnienie to wynika ze sposobu przydziału pamięci. Wszystkie zmienne globalne umieszczane są w tzw. segmencie danych, dla którego pamięć przydzielana jest raz, w chwili rozpoczęcia wykonywania programu. Zmienne lokalne umieszczane są w tzw. segmencie stosowym. Przy każdorazowym wywołaniu procedury lub funkcji zmiennym lokalnym przydzielana jest w stosie pamięć, a po zakończeniu wykonywania procedury lub funkcji, pamięć jest zwalniana.

42 Zmienne lokalne o takich samych nazwach, jak zmienne globalne nie zmieniają zmiennych globalnych. Jednak zmienna lokalna o takiej samej nazwie, jak zmienna globalna przesłania „ ukrywa ” zmienną globalną. Jeśli funkcja posiada zmienną o takiej samej nazwie jak zmienna globalna, to nazwa użyta wewnątrz funkcji odnosi się do zmiennej lokalnej, a nie do globalnej.

43 Definicja struktury Struktura (typ strukturalny) jest złożonym typem danych służącym do grupowania informacji opisujących jakiś obiekt. Dane te mogą być i najczęściej są różnych typów. Poszczególne dane zgrupowane w strukturze nazywamy polami lub składowymi struktury.

44 Zacznijmy od przykładu Aby zapamiętać dane pewnej osoby, takie jak imię, nazwisko, wiek i płeć (zatem dane różnego typu), musielibyśmy umieścić je w kilku zadeklarowanych zmiennych. Chcąc wyświetlić informacje o tej osobie, musielibyśmy wyświetlić wartości poszczególnych zmiennych. Należałoby więc zapamiętać, że wszystkie te zmienne dotyczą tej samej opisywanej wielkości. Można jednak zgrupować wszystkie informacje i umieścić w jednej zmiennej. Typ tej zmiennej to właśnie struktura. Aby korzystać z tego typu, musimy go najpierw zdefiniować, a potem możemy tworzyć zmienne zdefiniowanego przez siebie typu.

45 Składnia definicji struktury struct nazwa_typu { typ_pola_1 nazwa_pola_1; typ_pola_2 nazwa_pola_2; … typ_pola_n nazwa_pola_n; };

46 Przykład struktury struct osoba { char imie[14]; char nazwisko[20]; int wiek; char plec[10]; }; Aby pokazać, jak informacje o osobie umieścić w jednej zmiennej, możemy przykładowo zdefiniować strukturę o nazwie osoba:

47 Zmienne strukturalne Mając tak zdefiniowany typ, możemy z niego korzystać, deklarując zmienne strukturalne. Zmienne strukturalne są to zmienne, które są typu struktury przez nas zdefiniowanej. Dla typu osoba mogą być to zmienne mama. babcia, stryjek. Ich deklaracja wygląda następująco: osoba mama, babcia, stryjek;

48 Nadawanie wartości polom Aby zapamiętać poszczególne informacje w polach musimy posłużyć się operatorem odniesienia do pola struktury, który oznacza się kropką. Przykładowo aby zapisać dane w polu imie zmiennej mama musimy napisać: mama.imie="Anna";

49 Zmienne typu referencyjnego Poza podstawowymi typami w języku C++ istnieje tzw. typ referencyjny. Zmienne typu referencyjnego służą do reprezentacji innych zmiennych w programie. Operacje na zmiennej x są równoważne operacjom na zmiennej referencyjnej związanej z tą zmienną. W praktyce typy i zmienne referencyjne są wykorzystywane podczas przekazywania parametrów do funkcji oraz zwracania wartości funkcji.

50 Deklaracja zmiennej referencyjnej Deklaracja zmiennej referencyjnej przedstawia się następująco: typ &identyfikator_ref=identyfikator_zmiennej;

51 Referencja - ważne zasady i cechy Referencja musi zostać zainicjalizowana - nie możemy zadeklarować zmiennej typu referencyjnego, a później dokonać przypisania, połączenia jej z jakąś inną zmienną. Musi to być koniecznie inicjalizacja. Referencja jest w swojej istocie stała - referencja wskazuje zawsze na konkretną zmienną i nie możemy nagle jej powiedzieć, że ma pokazywać na inną zmienną; referencja jest na zawsze związana ze zmienną, którą została zainicjalizowana.

52 Referencja - ważne zasady i cechy Referencja musi zawsze być dokładnie takiego samego typu jak zmienna, z którą jest powiązana Referencją poza linijką deklaracji (i jednocześnie inicjalizacji) posługujemy się jak zwykłą zmienną Wartość zmiennej typu referencyjnego jest równa wartości zmiennej, z którą referencja jest powiązana - ponieważ referencja jest tylko dodatkową nazwą dla danej zmiennej, to jej wartość jest dokładnie taka sama jak wartość zmiennej, której dotyczy referencja.

53 Zmienne w pamięci operacyjnej Każda zmienna, która jest zadeklarowana w programie zostaje umieszczona w pamięci operacyjnej na czas działania programu. Pamięć operacyjna to zbiór komórek pamięci. Każda komórka w pamięci ma określone położenie - adres. Adres jest liczbą, która jednoznacznie określa położenie komórki w pamięci. Każda zmienna, którą deklarujemy w programie jest umieszczana w komórkach pamięci. W zależności, jakiego typu jest ta zmienna, może ona zostać umieszczona w jednej, dwóch lub większej liczbie komórek pamięci. Jednak adres zmiennej pokazuje zawsze na pierwszą komórkę pamięci - tam zaczyna się właśnie nasza zmienna.

54 Operator pobrania adresu w C++ Do pobierania adresu zmiennej dowolnego typu służy operator pobrania adresu – w języku C++ takim operatorem jest &. W rzeczywistości z operatora & – operatora pobrania adresu korzystaliśmy już w przypadku referencji. Kiedy deklarowaliśmy (i jednocześnie inicjowaliśmy) zmienną typu referencyjnego, mówiliśmy kompilatorowi tak naprawdę, że adres referencji ma być równy adresowi zmiennej, z którą została związana referencja. Zapis jednak w tym przypadku był nieco mylący, bowiem operator pobrania adresu znajdował się tylko i wyłącznie po stronie referencji, a po stronie zmiennej operatora tego już nie było.

55 Pojęcie wskaźnika W języku C++ istnieje możliwość definiowania zmiennych zawierających adres jakiegoś obszaru w pamięci, przy czym obszar ten może być interpretowany jako zmienna określonego typu. Zmienne zawierające adres obszaru pamięci nazywamy zmiennymi wskaźnikowymi lub krótko wskaźnikami. Wskaźnik więc, jest zmienną, przechowującą adres pamięci.

56 Deklaracja wskaźnika Schematycznie wskaźnik deklarujemy następująco: typ *nazwa_wskaznika; Jak widać wskaźnik oznaczamy za pomocą gwiazdki pojawiającej się przed nazwą zmiennej. Deklarację taką odczytujemy od końca. Na widok gwiazdki mówimy: „jest wskaźnikiem do pokazywania na zmienne typu…”.

57 Przykład wskaźnika int *wska; Jest to deklaracja wskaźnika wska mogącego pokazywać na zmienne (obiekty) typu int. wska – jest wskaźnikiem do pokazywania na zmienne typu int.

58 Powiązanie wskaźnika ze zmienną Wskaźniki przechowują adresy! Wartością każdego wskaźnika jest adres zmiennej, na którą ten wskaźnik wskazuje o ile tylko wskaźnik został ustawiony na daną zmienną. Ustawienia takiego dokonujemy następująco: nazwa_wskaznika=&nazwa_zmiennej; przy czym typ wskaźnika i typ zmiennej muszą być zgodne.

59 Deklaracja wskaźnika wraz z inicjalizacją Schematycznie deklaracja wskaźnika wraz z jego inicjalizacją wygląda następująco: typ *nazwa_wskaznika = &nazwa_zmiennej; typ *nazwa_wskaznika; nazwa_wskaznika = &nazwa_zmiennej; Jest to równoważne:

60 Operator wyłuskania Operator wyłuskania oznaczamy za pomocą * i poprzedzając nazwę wskaźnika tym operatorem, uzyskujemy wartość zmiennej, na którą dany wskaźnik wskazuje.

61 Definicja klasy Aby w C++ móc w programie stworzyć obiekt, musimy zdefiniować klasę, do której obiekt należy. Klasa jest to złożony typ danych będący opisem (definicją) pól i metod obiektów w programie. Relację między obiektem a klasą możemy określić w następujący sposób: Obiekt jest zmienną typu zdefiniowanego w klasie. Definicja klasy nie wiąże się z utworzeniem obiektu, jest to jedynie zdefiniowanie nowego typu obiektów (zmiennych). Klasa jest typem obiektu, a nie samym obiektem.

62 Definiowanie klasy w programie class nazwa_klasy { specyfikator_dostępu: pola metody }; Składnia definicji klasy wygląda natomiast następująco:

63 Przykład definicji klasy class samochod { public: char marka[15]; float moc_silnika; float predkosc_akt; float waga; float przyspieszenie (float przys); void tankowanie (int litry); };

64 Specyfikatory dostępu Nazwa specyfikator_dostępu określa prawa dostępu do części składowych klasy (czyli pól lub metod), wyróżniając ich trzy rodzaje: prywatne (ang. private), publiczne (ang. public) oraz zabezpieczone (ang. protected). Prywatne składowe klasy (wpisane po słowie private: w jej definicji) są dostępne jedynie wewnątrz samej klasy, tj. tylko dla jej własnych metod oraz dla funkcji zaprzyjaźnionych. Publiczne składowe klasy (wpisane po słowie public: w jej definicji) widoczne są zawsze i wszędzie - nie tylko dla samej klasy (jej metod), ale na zewnątrz - np. dla jej obiektów. Zabezpieczone składowe klasy (wpisane po słowie protected: w jej definicji) są dostępne jedynie wewnątrz samej klasy, tj. tylko dla jej własnych metod.

65 Definiowanie metod klasy Definicje metod klasy możemy w programie umieszczać na dwa sposoby: wewnątrz definicji klasy i poza definicją klasy. Wewnątrz definicji klasy umieszczamy definicję krótki metod (nie zawierających instrukcji iteracyjnych – pętli). Poza definicją klasy umieszczamy definicję dłuższych metod. Wtedy dodatkowo nazwę metody musimy poprzedzić nazwą klasy i tak zwanym operatorem zakresu oznaczanym :: (podwójnym dwukropkiem).

66 Definicja konstruktora Konstruktorem nazywamy specjalną metodę (funkcję) automatycznie uruchamianą w trakcie definiowania (tworzenia) obiektu pozwalającą na zainicjowanie go określonymi danymi. Metoda ta nie zwraca żadnej wartości (nawet void ), a jej nazwa odpowiada nazwie zawierającej ją klasy. Jeśli programista nie utworzy konstruktora dla klasy, kompilator automatycznie utworzy konstruktor, który nic nie będzie robił. Konstruktor nie pojawi się nigdzie w kodzie, jednak będzie on istniał w skompilowanej wersji programu i będzie wywoływany za każdym razem, gdy będzie tworzony obiekt klasy.

67 Zalety zdefiniowanego konstruktora Mając w klasie ulamek konstruktor teraz obiekt np. ul1 możemy zadeklarować i zainicjować go danymi następująco: ulamek ul1 (3,5); Jest to łatwiejsze niż ulamek ul1; ul1.zapisz (3,5); oraz przypomina sposób deklarowania i inicjowania zwykłej zmiennej np.. liczba int liczba=4;

68 Definicja funkcji zaprzyjaźnionej Funkcja zaprzyjaźniona z klasą to funkcja, która (mimo, że nie jest składnikiem klasy) ma dostęp do wszystkich (nawet prywatnych) składników klasy. W definicji klasy umieszczona jest wówczas deklaracja przyjaźni z funkcją za pomocą słowa kluczowego friend.

69 Przeładowania operatorów Projektując klasę możemy zadbać o to, by pewne operacje na obiektach tej klasy wykonywane były na zasadzie przeładowania operator ó w. M ó wiąc najkr ó cej w tej części zajmiemy się tym, jak sprawić by znaczki takie jak: ‘ + ’, ‘ - ’ itd. pracowały dla nas i robiły to, co my im każemy. Sam znaczek ‘ + ’ nie dodaje dw ó ch liczb. Kiedy on występuje w tekście programu, kompilator wywołuje specjalną funkcję, kt ó ra zajmuje się dodawaniem liczb. Nazwijmy tę funkcję operatorem dodawania.

70 Zasady przeładowania operatorów Przeładowania operatora dokonuje się definiując swoją własną funkcję kt ó ra: nazywa się operator@ (@ oznacza symbol operatora kt ó ry przeładowujemy np.: +, -, *, itd.) co najmniej jeden z argument ó w jest obiektem danej klasy (musi być obiekt, nie wskaźnik do obiektu)

71 Definicja przeładowanego operatora typ_zwracany operator@ (argumenty) { //ciało funkcji }


Pobierz ppt "Programowanie strukturalne i obiektowe C++ Powtórzenie wiadomości z C++ Robert Nowak."

Podobne prezentacje


Reklamy Google