Ugrás a tartalomhoz

const-correctness

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


Főnév

const-correctness (tsz. const-correctnesses)

  1. (informatika) A const-correctness (konzisztens const használat) a C++ nyelv egyik kulcsfontosságú koncepciója, amely segít abban, hogy a program kódja biztonságosabb, átláthatóbb és optimalizálhatóbb legyen. A const kulcsszó használatával deklaráljuk, hogy valami nem változhat meg – és ezt a fordító szigorúan ellenőrzi.

Az alábbiakban részletesen elmagyarázom a const-correctness fogalmát, gyakorlati példákkal:



🧠 Mi az a const-correctness?

A const-correctness azt jelenti, hogy mindig megadjuk, ha egy érték, pointer, referencia vagy tagfüggvény nem változtatja meg az állapotát vagy más objektumot.

Ez:

  • növeli a kód megbízhatóságát (a fordító hibát jelez, ha megszegnéd a szabályt),
  • könnyíti a hibakeresést (látszik, mit változtatsz meg és mit nem),
  • segíti a kód dokumentálását.



🧩 Alkalmazási területek

1. Const lokális változó

const int a = 5;
a = 6; // HIBA: nem módosítható

2. Const pointerek

Különbséget kell tenni a mutatott érték és maga a pointer között:

a) Nem változtatható, amit mutat:

const int* p = &a;   // pointer to const
*p = 10;             // HIBA: nem módosítható, amit mutat

b) Nem változtatható a pointer (de az érték igen):

int* const p = &a;   // const pointer
*p = 10;             // OK
p = &b;              // HIBA

c) Mindkettő const:

const int* const p = &a;

📦 Const referencia (const &)

Használjuk, ha egy nagy objektumot paraméterként adunk át, és nem akarjuk módosítani:

void kiir(const std::string& szoveg) {
    std::cout << szoveg << "\n";
}

Ezzel:

  • elkerüljük a másolást,
  • biztosítjuk, hogy szoveg nem változik meg.



🧩 Const tagfüggvények (class/struct)

class Pont {
    int x, y;
public:
    Pont(int x_, int y_) : x(x_), y(y_) {}

    int getX() const { return x; } // nem módosítja az objektumot

    void setX(int x_) { x = x_; }  // ez viszont igen
};

getX() nem változtathatja meg a tagváltozókat. Ha mégis próbálja, fordítási hiba lesz.


🧠 Const objektumok és azok hívásai

const Pont p(1,2);
p.getX();   // OK
p.setX(5);  // HIBA: nem hívható nem-const tagfüggvény const objektumra

⚙️ Const return típus

const int getVal() {
    return 5;
}

Ez általában nem sokat ér, mert visszatérési érték másolat, így nem lehet módosítani akkor sem, ha nem const. Akkor van értelme, ha referenciát vagy pointert adsz vissza:

const std::string& getNév() const {
    return név;
}

Ez megakadályozza, hogy a hívó módosítsa a belső objektum állapotát.



🚫 Const_cast – konverzió const eltávolítására

const int a = 10;
int* b = const_cast<int*>(&a);
*b = 20; // UNDEFINED BEHAVIOR, veszélyes!

Soha ne használd, kivéve speciális, haladó esetekben.



Jó gyakorlatok

  • Minden, amit nem akarsz módosítani, legyen const.
  • Paramétereknél mindig használd a const T& formátumot nagy objektumokra.
  • Tagfüggvényeknél mindig jelezd a const státuszt, ha nem módosít.
  • A const nemcsak védelem, hanem dokumentáció is.



🧪 Példa: const helyes és helytelen használata

class Szam {
    int ertek;
public:
    Szam(int e) : ertek(e) {}

    int get() const { return ertek; }    // helyes
    void set(int e) { ertek = e; }

    void hibas() const {
        ertek = 0; // HIBA: const tagfüggvény nem módosíthat
    }
};

🧠 Összefoglalás

Mit jelent a const? Hol használjuk?
Nem változtatható Lokális változók, pointerek, referenciák
Biztonságos kód Függvényparaméterek, visszatérések
Dokumentálja a szándékot Tagfüggvények, class metódusok
Fordítóval ellenőrizteti a szándékot Objektumok védelme, API stabilitás