Poznaj C++ w$ godziny0183

Poznaj C++ w$ godziny0183



172 Godzina 12

172 Godzina 12

EFEKT DZIAŁANIA:


Tworzenie kota... Konstruktor zwykłego kota...

Frisky ma 5 lat Friksy ma 10 lat Wywołanie FunkcjaDruga...

FunkcjaDruga. Powrot...

Frisky ma teraz 10 lat Frisky ma 10 lat

Wywołanie destruktora zwykłego kota...

Do klasy ZwyklyKot dodaliśmy dwie funkcje dostępu: w linii 12 PobierzWiek()

_ zadeklarowaną jako const i w linii 13 UstawWiek() zadeklarowaną

ANALIZA:


normalnie, bez słowa kluczowego const. Dodaliśmy również zmienną wewnętrzną jegoWiek.

Konstruktor, konstruktor kopiujący oraz destruktor, podobnie jak w poprzednim przykładzie, wypisują jedynie stosowne komunikaty pozwalające określić, kiedy są wywoływane. W tym przykładzie konstruktor kopiujący nie jest nigdy wywoływany, ponieważ obiekt jest przekazywany do funkcji przez wskaźnik i nie jest wykonywana jego kopia. W linii 41 tworzony jest nowy obiekt. Domyślna wartość zmiennej jegoWiek jest wypisywana w linii 42.

W linii 45, za pomocą funkcji dostępu UstawWiek(), zostaje zmieniona wartość zmiennej jegoWiek. Efekt przypisania wypisywany jest w linii 47. Funkcja-Pierwsza() nie występuje w programie ale jest wywoływana FunkcjaDruga (). Została jednak ona nieco zmieniona. Parametr i wartość zwracana zostały zadeklarowane (w linii 35 i 36) tak, aby funkcja pobierała stały wskaźnik (const) do stałego (czyli również const) obiektu i żeby zwracała również stały wskaźnik do stałego obiektu.

Ponieważ zarówno parametr jak i wartość zwracana są przekazywane przez wskaźnik, to nie jest tworzona żadna kopia obiektu i, co się z tym ściśle wiąże, nie jest wywoływany konstruktor kopiujący. Wskaźnik występujący w funkcji FunkcjaDruga () jest stały i nie mamy możliwości wykorzystania go do wywołania funkcji UstawWiek() (zadeklarowanej bez użycia słowa kluczowego const). Gdybyśmy usunęli komentarz w linii 62 to kompilator zgłosiłby błąd.

Zauważ, że zadeklarowany w funkcji main () obiekt Frisky nie jest stały i mamy prawo wywołać z niego metodę UstawWiek (). Adres tego obiektu jest przekazywany do funkcji FunkcjaDruga (). Jednak tam, ze względu na odpowiednią deklarację parametru, obiekt jest traktowany jako stały.

Alternatywne rozwiązanie - referencje

Listing 12.2. rozwiązał problem tworzenia nadmiarowych kopii obiektów i zbyt częstego wywoływania konstruktorów i destruktorów. Wykorzystywał on w tym celu stałe wskaźniki do stałych obiektów aby zabezpieczyć się przed próbą zmiany obiektu. Jednak to rozwiązanie jest dosyć zawiłe, głównie dlatego, że obiekty przekazywane do funkcji są wskaźnikami.

EFEKT DZIAŁANIA:


_ Tworzenie kota... Konstruktor zwykłego kota...

Frisky ma 5 lat Friksy ma 10 lat Wywołanie FunkcjaDruga...

FunkcjaDruga. Powrot...

Frisky ma teraz 10 lat Frisky ma 10 lat

Wywołanie destruktora zwykłego kota...

Do klasy ZwyklyKot dodaliśmy dwie funkcje dostępu: w linii 12 PobierzWiek()

__zadeklarowaną jako const i w linii 13 UstawWiek() zadeklarowaną

ANALIZA


normalnie, bez słowa kluczowego const. Dodaliśmy również zmienną wewnętrzną jegoWiek.

Konstruktor, konstruktor kopiujący oraz destruktor, podobnie jak w poprzednim przykładzie, wypisują jedynie stosowne komunikaty pozwalające określić, kiedy są wywoływane. W tym przykładzie konstruktor kopiujący nie jest nigdy wywoływany, ponieważ obiekt jest przekazywany do funkcji przez wskaźnik i nie jest wykonywana jego kopia. W linii 41 tworzony jest nowy obiekt. Domyślna wartość zmiennej jegoWiek jest wypisywana w linii 42.

W linii 45, za pomocą funkcji dostępu UstawWiek(), zostaje zmieniona wartość zmiennej jegoWiek. Efekt przypisania wypisywany jest w linii 47. Funkcja-Pierwsza() nie występuje w programie ale jest wywoływana FunkcjaDruga()Została jednak ona nieco zmieniona. Parametr i wartość zwracana zostały zadeklarowane (w linii 35 i 36) tak, aby funkcja pobierała stały wskaźnik (const) do stałego (czyli również const) obiektu i żeby zwracała również stały wskaźnik do stałego obiektu.

Ponieważ zarówno parametr jak i wartość zwracana są przekazywane przez wskaźnik, to nie jest tworzona żadna kopia obiektu i, co się z tym ściśle wiąże, nie jest wywoływany konstruktor kopiujący. Wskaźnik występujący w funkcji FunkcjaDruga () jest stały i nie mamy możliwości wykorzystania go do wywołania funkcji UstawWiek() (zadeklarowanej bez użycia słowa kluczowego const). Gdybyśmy usunęli komentarz w linii 62 to kompilator zgłosiłby błąd.

Zauważ, że zadeklarowany w funkcji main () obiekt Frisky nie jest stały i mamy prawo wywołać z niego metodę UstawWiek (). Adres tego obiektu jest przekazywany do funkcji FunkcjaDruga (). Jednak tam, ze względu na odpowiednią deklarację parametru, obiekt jest traktowany jako stały.

Alternatywne rozwiązanie - referencje

Listing 12.2. rozwiązał problem tworzenia nadmiarowych kopii obiektów i zbyt częstego wywoływania konstruktorów i destruktorów. Wykorzystywał on w tym celu stałe wskaźniki do stałych obiektów aby zabezpieczyć się przed próbą zmiany obiektu. Jednak to rozwiązanie jest dosyć zawiłe, głównie dlatego, że obiekty przekazywane do funkcji są wskaźnikami.


Wyszukiwarka

Podobne podstrony:
Poznaj C++ w$ godziny0187 176 Godzina 12 EFEKT DZIAŁANIA: Compile error: Attempting to return a refe
Poznaj C++ w$ godziny0077 Funkcje 63EFEKT DZIAŁANIA: Podaj temperaturę w stopniach Fehrenheit-a: 212
Poznaj C++ w$ godziny0099 Proste klasy85 unsigned int Waga; void Miaucz(); Kot.Frisky; Frisky.Wiek =
Poznaj C++ w$ godziny0105 Proste klasy 91 Linia 58 zawiera definicję obiektu Frisky (będącego klasy
Poznaj C++ w$ godziny0028 12 Godzina 1 Przepisz program dokładnie. Pamiętaj o wszystkich znakach. Np
Poznaj C++ w$ godziny0063 48 Godzina 4 12:    cout « "


Poznaj C++ w$ godziny0066 Instrukcje i wyrażenia 51 11:    if (x > 10) 12:  &
Poznaj C++ w$ godziny0084 70 Godzina 5 70 Godzina 5 8: 9: 10 11 12 13 14 15 16 17 18 19 20
Poznaj C++ w$ godziny0100 86 Godzina 6 86 Godzina 6 11 12 13 14 15 16 17 18 19 20
Poznaj C++ w$ godziny0101 Proste klasy 87 Linia 12 rozpoczyna sekcję prywatną, która w tym wypadku s
Poznaj C++ w$ godziny0121 Zaawansowane sterowanie programem 109 W liniach 12-15 wprowadzamy wartości
Poznaj C++ w$ godziny0130 118 Godzina 8 11:    { 12:    lieznik++; 13:
Poznaj C++ w$ godziny0179 168 Godzina 12 Występuje tutaj jeszcze jeden, dodatkowy koszt. Każda kopia
Poznaj C++ w$ godziny0181 170 Godzina 12 wyrzucany z pamięci poprzez wywołanie destruktora. Widać to
Poznaj C++ w$ godziny0185 174 Godzina 12 52:    // FunkcjaDruga pobiera referencje do
Poznaj C++ w$ godziny0189 178 Godzina 12 problem. Do jakiego obiektu odnosi się rKot po wykonaniu li
Poznaj C++ w$ godziny0227 218 Godzina 15 9:    cout « Tablic*[i] [j]« andl; 10:  
Poznaj C++ w$ godziny0231 222 Godzina 15 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
Poznaj C++ w$ godziny0254 246 Godzina 16 11:    protected: 12:    int

więcej podobnych podstron