Sobes.tech
Junior

Ką žinote apie konstantinius ir nekonstantinius metodus?

sobes.tech AI

Atsakymas iš AI

Konstanta metodai (const methods) C++ yra klasės metodai, kurie deklaruojami su raktiniu žodžiu const po parametrų sąrašo.

class MyClass {
public:
    void nonConstMethod();         // Nekonstanti metodas
    void constMethod() const;      // Konstanti metodas
};

Raktinis žodis const po parametrų sąrašo užtikrina, kad metodas nepakeis objekto būsenos, kuriam jis yra iškviestas. Tai reiškia, kad viduje konstanto metodo:

  • Negalima keisti nestatinių duomenų narių.
  • Gali būti iškviesti tik kiti konstanto metodai to paties objekto.

Konstanto metodų tikslas:

  1. Saugumas: Užkerta kelią atsitiktiniam objekto būsenos pakeitimui.
  2. Naudojimas su konstantiškais objektais: Konstantiški objektai (deklaruoti su const) gali iškviesti tik konstanto metodus. Nekonstantiški metodai jiems nėra prieinami.
  3. Perkrovimas: Metodai gali būti perkrauti pagal konstantiškumą. Tai leidžia turėti du metodus su tuo pačiu pavadinimu ir signatūra, bet vienas bus konstantiškas, o kitas — nekonstantiškas. Kompiliatorius pasirinks versiją priklausomai nuo to, ar metodas iškviečiamas ant konstantiško ar nekonstantiško objekto.
class MyClass {
    int value;
public:
    int getValue() const { // Konstantiška versija
        return value;
    }
    int getValue() {       // Nekonstantiška versija
        return value++;    // Galimybė keisti būseną
    }
};

void test(const MyClass& objConst, MyClass& objNonConst) {
    objConst.getValue();    // Iškviečiama konstantiška versija
    objNonConst.getValue(); // Iškviečiama nekonstantiška versija
}

Nekonstantiški metodai:

Tai įprasti klasės metodai, kurie gali keisti objekto būseną. Jie deklaruojami be const raktažodžio po parametrų sąrašo.

Naudojimas:

Objekto tipas Metodo iškvietimas Kuris metodas bus iškviestas Paaiškinimas
const T obj.method() Tik konstantiškas Negalima keisti konstantiško objekto būsenos
T obj.method() Nekonstantiškas (jei yra) Nekonstantiški metodai gali keisti būseną
T obj.method() const Konstantiškas (jei yra) Jei yra abi versijos ir iškviečiama ant nekonstantiško objekto, prioritetas — nekonstantiškas. Bet galima aiškiai iškviesti konstantišką versiją, jei reikia (retai naudojama).

Naudojant konstantiškumą, tai yra gera praktika, nes tai didina kodo skaitomumą ir saugumą, taip pat leidžia kompiliatoriui atlikti papildomas optimizacijas.