constant object (tsz. constant objects)
Ha egy objektumot const-nak jelölünk, akkor garantáljuk, hogy nem lehet megváltoztatni az objektum állapotát (az adattagokat) az objektum élettartama alatt.
Ez különösen fontos a nagyobb projektekben, könyvtárakban, és ha API-t tervezel → így más programozók sem tudnak véletlenül hibázni.
const Szemely s("Kiss", "Jozsef", 32);
👉 s
most egy const objektum.
Mit jelent ez?
Mi az a const-tagfüggvény?
bool fiatalabb(const Szemely& masik) const;
👉 Ez azt jelenti, hogy a függvény nem módosítja az objektumot.
Ha ilyet írsz:
unsigned int getEletkor() const;
akkor ezt const object-en is meghívhatod.
De ha így írod:
unsigned int getEletkor(); // nincs const
akkor const Szemely
-en nem hívható meg — fordítási hiba.
A const
kulcsszó segít abban, hogy garantáld: bizonyos függvények csak olvasni fognak az objektumból.
Ez csökkenti a hibák esélyét.
A fordító optimalizálni tudja a kódot, ha tudja, hogy a függvény nem változtat semmit.
Ha egy osztályt könyvtárban adsz ki más fejlesztőknek, fontos, hogy pontosan megmondd, melyik függvény biztonságos, és melyik nem.
class Szemely {
std::string nev;
unsigned int kor;
public:
Szemely(std::string n, unsigned int k) : nev(n), kor(k) {}
std::string getNev() { return nev; } // nincs const!
};
Most nézd:
const Szemely s("Anna", 20);
std::cout << s.getNev() << std::endl; // HIBA!
Miért? → getNev()
nem const-tagfüggvény, tehát const Szemely
-en nem hívható meg.
std::string getNev() const { return nev; }
Most már meghívható const Szemely
objektumon is.
Nagyon gyakori, hogy const referencia-ként adsz át paramétert:
void printPerson(const Szemely& p) {
std::cout << p.getNev() << std::endl;
}
Miért?
Szemely p
→ lemásolná az egész objektumot → lassú lehet.Szemely& p
→ lehet, hogy módosítanád véletlenül.const Szemely& p
→ nincs másolás, és garantáltan nem tudod módosítani.
Ha const objectet használsz, figyeld meg:
const Szemely s("Anna", 20);
s.getNev(); // OK, ha a getNev() const
s.getEletkor(); // OK, ha a getEletkor() const
s.setEletkor(25); // HIBA! Mert módosító művelet.
Tehát:
const
-ként jelölt függvényeket tudsz hívni const Szemely
-en.
Ha az adattag is const
, akkor azt semmilyen körülmények között nem lehet módosítani:
class Szemely {
const std::string nev;
unsigned int kor;
};
A nev
itt soha nem lesz módosítható → még a nem-const objektumoknál sem.
Fontos különbség van:
const Szemely* p; // pointer to const object → nem módosítható, de a pointer mozgatható
Szemely* const p; // const pointer → a pointer nem mozdítható, de az objektum módosítható
const Szemely* const p; // const pointer to const object → se a pointer, se az objektum nem módosítható
✅ egy objektumot csak olvasni akarsz ✅ paramétert adsz át referenciaként → mindig const Szemely&
ha nem módosítod ✅ API-t írsz másoknak → egyértelműen jelezni akarod, hogy mi olvas, mi ír ✅ jobb optimalizációt akarsz
❌ a függvényben szándékosan módosítanod kell az objektumot
const
objectekkel nem fogod tudni meghívni a saját függvényeidet
Dolog | Milyen const? |
---|---|
const int i
|
változó nem változhat |
const Szemely s
|
objektum nem változhat |
const Szemely&
|
paraméterként → nem másol, nem változik |
std::string getNev() const
|
tagfüggvény nem változtat objektumot |
const Szemely* p
|
pointer → objektum nem változhat |
Szemely* const p
|
pointer maga nem mozdítható |
👉 Const object = védelem 👉 Const tagfüggvény = biztonságos olvasás 👉 Const reference = hatékony és biztonságos átadás