this
Kiejtés
Determináns
this
Névmás
this
- ez
- (informatika) A
this
kulcsszó 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.