Junior
Co wiesz o metodach stałych i niestatycznych?
sobes.tech AI
Odpowiedź od AI
Metody stałe (const methods) w C++ to metody klasy, które są deklarowane ze słowem kluczowym const po liście parametrów.
class MyClass {
public:
void nonConstMethod(); // Metoda niekonstansowa
void constMethod() const; // Metoda stała
};
Słowo kluczowe const po liście parametrów gwarantuje, że metoda nie zmieni stanu obiektu, na którym jest wywoływana. Oznacza to, że wewnątrz metody stałej:
- Nie można modyfikować nie-statycznych członków danych obiektu.
- Można wywołać tylko inne metody stałe tego samego obiektu.
Cel metod stałych:
- Bezpieczeństwo: Zapobiegają przypadkowym zmianom stanu obiektu.
- Użycie z obiektami stałymi: Obiekty stałe (zadeklarowane słowem
const) mogą wywoływać tylko metody stałe. Metody nie-stałe nie są dla nich dostępne. - Przeciążanie: Metody mogą być przeciążane pod względem stałości. Pozwala to na posiadanie dwóch metod o tej samej nazwie i sygnaturze parametrów, ale jedna będzie stała, a druga nie. Kompilator wybierze wersję w zależności od tego, czy wywołanie następuje na obiekcie stałym czy nie.
class MyClass {
int value;
public:
int getValue() const { // Wersja stała
return value;
}
int getValue() { // Wersja nie-stała
return value++; // Możliwość zmiany stanu
}
};
void test(const MyClass& objConst, MyClass& objNonConst) {
objConst.getValue(); // Wywołanie wersji stałej
objNonConst.getValue(); // Wywołanie wersji nie-stałej
}
Metody nie-stałe:
To zwykłe metody klasy, które mogą zmieniać stan obiektu. Są deklarowane bez słowa kluczowego const po liście parametrów.
Użycie:
| Typ obiektu | Wywołanie metody | Która metoda zostanie wywołana | Wyjaśnienie |
|---|---|---|---|
const T |
obj.method() |
Tylko wersja stała | Nie można zmienić stanu obiektu stałego. |
T |
obj.method() |
Metoda nie-stała (jeśli istnieje) | Metody nie-stałe mogą zmieniać stan. |
T |
obj.method() const |
Wersja stała (jeśli istnieje) | Jeśli obie wersje istnieją i wywołuje się na obiekcie nie-stałym, priorytet ma wersja nie-stała. Można też jawnie rzutować obiekt, aby wywołać wersję stałą (rzadko). |
Użycie stałości jest dobrą praktyką, ponieważ poprawia czytelność i bezpieczeństwo kodu, a także pozwala kompilatorowi na wykonywanie dodatkowych optymalizacji.