Ugrás a tartalomhoz

mutable

A Wikiszótárból, a nyitott szótárból

Főnév

mutable (tsz. mutables)

  1. (informatika) A mutable kulcsszó C++-ban arra szolgál, hogy lehetővé tegye egy adattag módosítását akkor is, ha az osztály példánya const objektumként van deklarálva. Ez különösen hasznos, ha egy cache értéket, naplózási információt vagy egyéb módosítható állapotot akarunk kezelni egy egyébként változatlan objektumban.



1. Alapvető mutable példa

#include <iostream>

class Auto {
private:
    mutable int futottKm; // Ez változtatható akkor is, ha az objektum const
public:
    Auto() : futottKm(0) {}

    void novelKilometer() const {
        futottKm++; // `mutable` miatt ez megengedett
    }

    int getKilometer() const {
        return futottKm;
    }
};

int main() {
    const Auto a; // `const` objektumot hozunk létre
    a.novelKilometer(); // Működik, mert `futottKm` mutable
    std::cout << "Futott km: " << a.getKilometer() << std::endl;
    return 0;
}

🔹 Mi történik itt? - Az Auto osztályban a futottKm változó mutable, ezért akkor is módosítható, ha az osztály példánya const. - A novelKilometer() függvény const, de mégis tudja módosítani a mutable adattagot.



2. mutable használata lambdákkal

A mutable a C++ lambda kifejezésekben is használható! Normál esetben egy lambda érték szerint befogott változókat nem módosíthatja ([=]), de a mutable kulcsszóval ezt engedélyezhetjük.

Példa lambda mutable használatára

#include <iostream>

int main() {
    int x = 10;
    
    auto lambda = [x]() mutable {
        x++; // `mutable` nélkül ez nem engedélyezett
        std::cout << "Lambda x: " << x << std::endl;
    };

    lambda();  // Kiírja: Lambda x: 11
    std::cout << "Eredeti x: " << x << std::endl; // x változatlan marad: 10
    
    return 0;
}

🔹 Fontos tudni: - A mutable nélkül a lambda nem tudná módosítani a befogott x értéket. - A mutable csak a lambda belső másolatát módosítja, nem a külső változót.



3. Mikor használjuk a mutable kulcsszót?

✅ Használjuk, ha:

✔ Egy const osztálymetódusnak naplóznia kell az adatokat.
✔ Egy const objektumban gyorsítótárazott (cache) adatokat akarunk frissíteni.
✔ Egy lambdában egy érték szerint befogott változót akarunk módosítani.

🚫 Ne használjuk, ha:

❌ Az adattagnak valójában változatlannak kellene maradnia.
❌ Ha a const objektum módosítása logikailag hibás lenne.



4. Összegzés

  • A mutable kulcsszó lehetővé teszi egy adattag módosítását akkor is, ha az objektum const.
  • Elsősorban cache-elt értékek, naplózási információk vagy számlálók esetében használatos.
  • Lambda kifejezéseknél lehetővé teszi az érték szerint befogott változók módosítását.
  • Ne használjuk indokolatlanul, mert megkerüli a const által nyújtott biztonságot.