this
Kiejtés
Determináns
this
Névmás
this
- ez
- (informatika) A
thiskulcsszó egy speciális implicit pointer C++-ban, amely mindig az aktuális objektumra mutat egy osztály tagfüggvényein belül. Segítségével az objektum saját tagjait érhetjük el, és megkülönböztethetjük azokat a lokális változóktól.
1. Mi az a this pointer?
A this egy implicit (rejtett) pointer, amely minden nem statikus tagfüggvényben elérhető. Ez azt az objektumot mutatja, amelyen a függvényt meghívták.
this általános szintaxisa
this->tagváltozó;
A this önmagában egy pointer, tehát a -> operátorral kell elérni az objektum tagjait.
2. Egyszerű példa this használatára
#include <iostream>
using namespace std;
class Ember {
public:
string nev;
Ember(string nev) {
this->nev = nev; // `this->` megkülönbözteti az osztálytagot a paramétertől
}
void mutat() {
cout << "Nev: " << this->nev << endl;
}
};
int main() {
Ember e("Péter");
e.mutat(); // "Nev: Péter"
return 0;
}
Mi történik itt? - A this->nev = nev; sorban a bal oldali nev az osztálytag, míg a jobb oldali nev a konstruktor paramétere. - A this segít megkülönböztetni a két azonos nevű változót.
3. this nélkül mi történne?
Ha nincs this, akkor a paraméter prioritást élvez, és nem módosítanánk az osztály tagváltozóját:
Ember(string nev) {
nev = nev; // Ez itt NEM módosítja az osztály tagváltozóját!
}
Ebben az esetben a bal oldali nev is a paramétert jelenti, így az osztály nev adattagja változatlan marad.
A helyes megoldás a this használata:
this->nev = nev;
4. this pointer visszatérése egy függvényből
A this pointert gyakran visszaadjuk egy függvényből láncolt (chained) metódushívásokhoz.
Példa láncolt metódushívásokra
#include <iostream>
using namespace std;
class Auto {
public:
string marka;
int evjarat;
Auto* setMarka(string m) {
this->marka = m;
return this; // Visszaadja az aktuális objektum címét
}
Auto* setEvjarat(int ev) {
this->evjarat = ev;
return this;
}
void mutat() {
cout << "Márka: " << marka << ", Évjárat: " << evjarat << endl;
}
};
int main() {
Auto a;
a.setMarka("BMW")->setEvjarat(2022)->mutat(); // Láncolt metódushívás
return 0;
}
Kimenet:
Márka: BMW, Évjárat: 2022
Itt a this pointer lehetővé teszi, hogy metódushívásokat egymás után láncoljunk.
5. this használata konstans tagfüggvényekben
Ha egy tagfüggvényt const-ként definiálunk, akkor a this is konstans pointerré válik:
#include <iostream>
using namespace std;
class Ember {
public:
string nev;
Ember(string n) {
this->nev = n;
}
void mutat() const { // A függvény nem módosíthatja az objektumot
cout << "Nev: " << this->nev << endl;
}
};
int main() {
const Ember e("Anna");
e.mutat(); // "Nev: Anna"
return 0;
}
Itt a mutat() függvény nem módosíthatja az objektum adatait, mert const-ként van megjelölve.
6. this és operátor túlterhelés
A this pointer hasznos, amikor operátorokat terhelünk túl, például értékadásnál (=) vagy összehasonlításnál (==).
Értékadó operátor (=) túlterhelése
#include <iostream>
using namespace std;
class Ember {
public:
string nev;
Ember(string n) {
nev = n;
}
// Értékadó operátor túlterhelése
Ember& operator=(const Ember& masik) {
if (this != &masik) { // Önvisszaadás ellenőrzése
this->nev = masik.nev;
}
return *this; // Visszatérünk az aktuális objektummal
}
void mutat() {
cout << "Nev: " << nev << endl;
}
};
int main() {
Ember e1("Péter");
Ember e2("Judit");
e2 = e1; // Az e2 objektum megkapja e1 adatait
e2.mutat(); // "Nev: Péter"
return 0;
}
Miért használjuk itt a this pointert? - Önvisszaadás ellenőrzés: if (this != &masik), hogy ne másoljuk magunkat. - Visszatérési értékként használjuk a *this-t, hogy láncolható legyen az értékadás.
7. this és dinamikus memóriafoglalás
A this segíthet dinamikusan foglalt objektumoknál, amikor az objektum saját magát szabadítja fel.
#include <iostream>
using namespace std;
class Ember {
public:
string nev;
Ember(string n) {
this->nev = n;
}
void felszabadit() {
delete this; // Az objektum saját magát törli!
}
};
int main() {
Ember* e = new Ember("László");
cout << "Létrehozva: " << e->nev << endl;
e->felszabadit(); // Az objektum saját magát törli!
return 0;
}
⚠️ Vigyázat!
- Ha egy nem dinamikusan létrehozott objektum hívja meg a delete this;-t, az undefined behavior-t eredményezhet!
8. Összegzés
| Használat | Leírás | Példa |
|---|---|---|
| Konstruktorokban | Osztálytagok és paraméterek megkülönböztetése | this->nev = nev; |
| Metódusláncolás | Metódusok egymás utáni hívása | return this; |
| Konstans tagfüggvények | A this pointer is const lesz |
void mutat() const; |
| Operátor túlterhelés | Önvisszaadás és önmásolás ellenőrzése | if (this != &masik) {...} |
| Dinamikus memória | Az objektum saját magát szabadítja fel | delete this; |
Konklúzió
A this kulcsszó egy alapvető eszköz C++-ban, amely segít az objektum saját maga kezelésében és az osztálytagok megkülönböztetésében. Különösen hasznos konstruktorokban, operátor túlterhelésben, metódusláncolásban és dinamikus objektumok esetén.