this în C++

Pointer către obiectul curent, disponibil în orice metodă nestatică a unei clase.

Sintaxă
this->membru
return *this;

Ce face this

În interiorul unei metode, this este adresa obiectului pe care a fost apelată metoda. Când scrii sold_ într-o metodă, compilatorul înțelege de fapt this->sold_.

Îl scrii explicit în trei situații frecvente: când un parametru are același nume ca un membru (this->nume = nume;), când returnezi obiectul curent (return *this;) ca să înlănțuiești apeluri și când trimiți obiectul curent altei funcții. În metodele const, this este un pointer la obiect constant.

Metodele static nu au this, pentru că nu sunt apelate pe un obiect.

Exemple

Exemplul 1: Parametru cu același nume ca membrul

#include <print>
#include <string>

class Elev {
public:
    void seteaza(const std::string& nume, int nota) {
        this->nume = nume;  // membrul = parametrul
        this->nota = nota;
    }
    void afiseaza() const { std::println("{}: {}", nume, nota); }
private:
    std::string nume;
    int nota = 0;
};

int main() {
    Elev e;
    e.seteaza("Ioana", 10);
    e.afiseaza();
}

Rezultat

Ioana: 10

Exemplul 2: Apeluri înlănțuite cu return *this

Fiecare metodă returnează o referință la același obiect, deci următoarea metodă se poate apela direct pe rezultat.

#include <print>
#include <string>

class Mesaj {
public:
    Mesaj& catre(const std::string& d) { destinatar_ = d; return *this; }
    Mesaj& subiect(const std::string& s) { subiect_ = s; return *this; }
    void trimite() const { std::println("Către {}: {}", destinatar_, subiect_); }
private:
    std::string destinatar_, subiect_;
};

int main() {
    Mesaj().catre("ana@exemplu.ro").subiect("Ședința de luni").trimite();
}

Rezultat

Către ana@exemplu.ro: Ședința de luni

Greșeli frecvente

  • Scrii nume = nume; în metodă, unde parametrul și membrul au același nume. Parametrul este atribuit lui însuși, iar membrul rămâne neschimbat; scrie this->nume = nume; sau dă-le nume diferite (de exemplu nume_ pentru membru).
  • Returnezi *this prin valoare (Mesaj catre(...)) în loc de referință. Fiecare apel din lanț lucrează pe o copie nouă, iar modificările se pierd.

Comenzi înrudite

  • class: Definește un tip nou care grupează date (membri) și funcțiile care lucrează cu ele (metode); baza programării orientate pe obiecte.
  • static: Are trei sensuri: variabilă locală care își păstrează valoarea între apeluri, membru comun al clasei sau nume vizibil doar în fișierul curent.
  • operator: Definește ce face un operator (+, ==, <<, [], () etc.) pentru tipurile tale, ca obiectele să se folosească la fel de natural ca numerele.
  • lambda ([](){}): O funcție fără nume, scrisă direct acolo unde e folosită; poate „captura” variabile din jur.