Sobes.tech
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:

  1. Bezpieczeństwo: Zapobiegają przypadkowym zmianom stanu obiektu.
  2. 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.
  3. 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.