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''':
 
<sourcesyntaxhighlight lang="cpp">
const Klasa obiekt;
const std::string = "wikibooks.pl";
</syntaxhighlight>
</source>
 
Analogicznie przy przekazywaniu argumentu do funkcji:
 
<sourcesyntaxhighlight lang="cpp">
void funkcja(const Klasa obiekt) {
// działania na obiekcie
}
</syntaxhighlight>
</source>
 
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.
 
<sourcesyntaxhighlight lang="cpp" highlight="16">
class Klasa {
private:
Linia 52:
return obiekt.wartosc(); // wartosc jest const, tylko odczyt
}
</syntaxhighlight>
</source>
 
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.
 
<sourcesyntaxhighlight lang="cpp" highlight="16">
#include <iostream>
 
Linia 85:
wyswietl(p);
}
</syntaxhighlight>
</source>
 
==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'''.
 
<sourcesyntaxhighlight lang="cpp">
class Terminal {
const int kolumny;
Linia 103:
}
};
</syntaxhighlight>
</source>
 
==Pola mutable==
Linia 111:
Zacznijmy od klasy bez pamięci podręcznej:
 
<sourcesyntaxhighlight lang="cpp">
#include <vector>
 
Linia 129:
}
};
</syntaxhighlight>
</source>
 
(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.
 
<sourcesyntaxhighlight lang="cpp" highlight="3,4,12,13">
class KolekcjaZCache: public Kolekcja {
 
Linia 153:
}
};
</syntaxhighlight>
</source>