Ugrás a tartalomhoz

this

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

Kiejtés

  • IPA: /ðɪs/
  • hallgatás (US)

Determináns

this

  1. ez

Névmás

this

  1. ez
  2. (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.

  • this - Szótár.net (en-hu)
  • this - Sztaki (en-hu)
  • this - Merriam–Webster
  • this - Cambridge
  • this - WordNet
  • this - Яндекс (en-ru)
  • this - Google (en-hu)
  • this - Wikidata
  • this - Wikipédia (angol)