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.
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.
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.