C++/Obiekty stałe: Różnice pomiędzy wersjami
Usunięta treść Dodana treść
m Revert |
Nie podano opisu zmian |
||
Linia 3:
Obiekty mogą być stałe już w chwili deklaracji (np. napisy), albo stać się takie w obrębie funkcji do której zostały przekazane jako argument. Aby zadeklarować obiekt stały należy poprzedzić nazwę typu słowem kluczowym '''const''':
<
const Klasa obiekt;
const std::string = "wikibooks.pl";
</syntaxhighlight>
Analogicznie przy przekazywaniu argumentu do funkcji:
<
void funkcja(const Klasa obiekt) {
// działania na obiekcie
}
</syntaxhighlight>
Można bardziej formalnie powiedzieć, że typy <tt>Klasa</tt> oraz <tt>const Klasa</tt> są różne; co więcej, konwersja z typu <tt>Klasa</tt> na <tt>const Klasa</tt> jest dopuszczalna, odwrotna jest zabroniona.
Linia 22:
Metody stałe mogą wywoływać tylko inne metody stałe i odczytywać pola (z małym wyjątkiem, o czym w kolejnych sekcjach) - zapis wartości do pól obiektu oraz wołanie nie-stałych metod jest zabronione. UWAGA: To ograniczenie nie zależy od tego, czy sam obiekt na którym wołana metoda jest stały.
<
class Klasa {
private:
Linia 52:
return obiekt.wartosc(); // wartosc jest const, tylko odczyt
}
</syntaxhighlight>
Istotne jest, że już istniejący obiekt może być używany jako stały. Funkcja <tt>wyswietl</tt> nie zmieni szerokości ani wysokości, jednak legalnie wywołuje inną funkcję, która również jedynie czyta parametry prostokąta.
<
#include <iostream>
Linia 85:
wyswietl(p);
}
</syntaxhighlight>
==Stałe pola klasy==
Linia 91:
Pola klasy również mogą być zadeklarowana jako stałe, ich wartości muszą zostać ustawione na '''liście inicjalizacyjnej'''.
<
class Terminal {
const int kolumny;
Linia 103:
}
};
</syntaxhighlight>
==Pola mutable==
Linia 111:
Zacznijmy od klasy bez pamięci podręcznej:
<
#include <vector>
Linia 129:
}
};
</syntaxhighlight>
(Celowo został tu użyty nieoptymalny algorytm wyszukiwania liniowego, żeby wykazać potrzebę zastosowania pamięci podręcznej. Normalnie należałoby użyć typu <tt>std::map</tt> lub <tt>std::unordered_map</tt> albo jakiejś własnej, lepszej struktury danych.)
Linia 135:
Teraz klasa, która ma cache. Najistotniejsze są tutaj dwa pola: <tt>ostatnia_wartosc</tt> i <tt>ostatni_wynik</tt>, oba zostały poprzedzone słowem kluczowym '''mutable''', to znaczy, że zgadzamy się, żeby metody stałe je modyfikowały.
<
class KolekcjaZCache: public Kolekcja {
Linia 153:
}
};
</syntaxhighlight>
|