w14

w14, Studia PK, JiPP, Wykłady - Chmaj
[ Pobierz całość w formacie PDF ]
//-->Klasy – c.d.Inicjalizacja obiektów klaschcemy, by typy definiowane (klasy) miały taką samąfunkcjonalność jak wbudowanena razie – nie można inicjalizować obiektów - egzemplarzyklasporównanie: int i klasa rejestr:class rejestr {int liczba;public:void schowaj(int l) {liczba=l;}int zwracaj() {return liczba;}};rejestr – schowek na liczby całkowiteinicjalizacja:int a=6;int a(6); //inna wersjarejestr a;a.schowaj(6);brak inicjalizacji zmiennych – częsty powód błędówpytanie – czy dla typu zdefiniowanego da się osiągnąćmożliwość inicjalizacji w momencie definicji?odpowiedź: tak, należy zdefiniować specjalną funkcjęskładową klasy zwaną konstruktoremKonstruktorfunkcja składowa klasy, która:onazywa się tak samo jak klasaonie zawiera określenia typu zwracanej wartości(nawet void)ojest automatycznie wywoływana w momencietworzenia obiektu klasyPrzykład: klasa rejestr z konstruktoremclass rejestr {int liczba;public:rejestr(int l) {liczba=l;}void schowaj(int l) {liczba=l;}int zwracaj() {return liczba;}};// konstruktorposługiwanie się konstruktorem: zawsze przy definicjiobiektu typu rejestr uruchamia się on automatycznie – dajegwarancję inicjalizacji,rejestr a(5);cout << ”a zawiera liczbe ” << a.zwracaj()) << endl;uwaga 1: teraz nie można zdefiniować zmiennej rejestrbez inicjalizacji – potrzeba zaradzenie temuuwaga 2: konstruktor nie „buduje” obiektu (nie rezerwujepamięci), tylko go inicjuje (nie budowniczy, raczejdekorator wnętrz)uwaga 3: konstruktor – funkcja składowa jak inne; to co gowyróżnia to fakt, że jest automatycznie wywoływanyJak umożliwić definicję bez inicjalizacji – modyfikacjakonstruktora (wykorzystanie argumentu domyślnego):#include <iostream>using namespace std;class rejestr {int liczba;public:rejestr(int l=0) {liczba=l;}void schowaj(int l) {liczba=l;}int zwracaj() const {return liczba;}};main(){rejestr a(10), b;cout << "zawartosc: " << a.zwracaj() << endl;cout << "zawartosc: " << b.zwracaj() << endl;}Przeładowanie konstruktoraInne wyjście z poprzedniej sytuacji – przeładowaniekonstruktora:class rejestr {int liczba;public:rejestr(){liczba=0}rejestr(int l) {liczba=l;}void schowaj(int l) {liczba=l;}int zwracaj() {return liczba;}};konstruktor – najczęściej przeładowywana funkcjazazwyczaj – definiujemy kilka różnych egzemplarzykonstruktora by ułatwić sobie inicjalizację obiektówkonstruktory mogą pełnić też inne funkcje (np. dokonywaćkonwersji typów)Przykład: klasa do zapisu ilości czasu (w sekundach); chcemymieć możliwość inicjalizacji również przez podanie minut lubgodzinclass czas {int sec;public:czas(int s=0) {sec=s;}czas(int s, int m) {sec=s+60*m;}czas(int s, int m, int g) {sec=s+60*m+3600*g;}};Przykład użycja - definicje zmiennych:czas start, bieg(10), jazda(20,19); lot(2,10,30);Składnik statyczny klasyzwykle – każdy obiekt klasy ma własny zestaw danych; topozwala niezależne przechowywanie obiektachczasami – różne obiekty tej samej klasy powinnyposługiwać się tą samą informacjązwykle ma to miejsce, gdy nie chodzi nam o informację nieo poszczególnych obiektach a o klasie jako całościoprzykłady: klasa samochod; cena producenta taka sama dlawszystkich obiektów; ilość wyprodukowanych aut – teżjak to zrobić?oklasycznie (w C) - zmienne globalne; wykluczaukrywanie informacji i ochronę danychpytanie: czy da się zrobić, by dane takieobyły składnikami klasyobyły tworzone w pamięci pojedynczo dla klasy jako całościodpowiedź: tak, składniki takie należy zadeklarować jakoskładniki statyczneskładowe wspólne dla klasy opatrujemy klauzulą static –dotyczy to zarówno składowych prywatnych jak teżpublicznychclass samochod {int nr;static int ile_aut;public:static int cena;samochod() {ile_aut++;}static void raport() {cout << “liczba aut: “ << ile_aut << endl;}};deklaracja składników publicznych w ciele klasy nie jest ichdefinicją; muszą one być dodatkowo zdefiniowane pozazakresem klasy, w miejscu o zasięgu pliku (tak, jakdefinicja zmiennej globalnej)ta definicjaonie zawiera słowa staticozawiera pełne odniesienie do składnika (z nazwą klasy)omoże być inicjalizacją (nawet składników prywatnych !!!)int samochod::cena=15000;int samochod::ile_aut=100;do składnika statycznego (oprócz normalnego odniesieniaobiekt.składnik lub wskaźnik->składnik) można sięodnieść: klasa::składnik, np.:samochod::cena;do składnika statycznego można się odnieść zanimzostanie zdefiniowany jakikolwiek obiekt klasydo rozmiaru obiektu klasy nie są wliczane składnikistatyczneStałe całkowite określające własności klasy owartościach ustalonych w trakcie kompilacjiPrzykład:klasa zawierają tablicę o ustalonym rozmiarze (np.100); metody też zależą od tej liczby – musi ona byćtaka sama dla wszystkich egzemplarzy klasywymagamy łatwej reparametryzacji (najlepiej w jednejlinii w nagłówku definicji klasyclass tablice {int tab[100];public:tablice(int p=0);double srednia();int najmiejszy() ;int najwiekszy() ;};rozwiązanie klasyczne – ”enum hack”odefiniujemy w klasie (bezimienny typ wyliczeniowy);ookreślamy potrzebne nam stałe jako stałe typuwyliczeniowegooclass tablica {enum { ile = 1000};int ttt[ile];public:spis(int k=0){for(int i=0;i<ile; i++) ttt[i]=k;}double srednia();}; [ Pobierz całość w formacie PDF ]
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • diabelki.xlx.pl
  • Podobne
    Powered by wordpress | Theme: simpletex | © Spojrzeliśmy na siebie szukając słów, które nie istniały.