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:
- Saugumas: Užkerta kelią atsitiktiniam objekto būsenos pakeitimui.
- Naudojimas su konstantiškais objektais: Konstantiški objektai (deklaruoti su
const) gali iškviesti tik konstanto metodus. Nekonstantiški metodai jiems nėra prieinami. - 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.