[C++] Ce este pointerul 'this'?

Despre limbajul de programare C++ si biblioteca standard STL (forum moderat)
Post Reply
User avatar
Marius Bancila
Fondator
Fondator
Posts: 2344
Joined: 11 Jul 2007, 11:45
Judet: Timiş
Location: Timisoara
Contact:

[C++] Ce este pointerul 'this'?

Post by Marius Bancila » 25 Jul 2007, 16:48

Intrebare: Ce este pointer-ul this?

Raspuns: Contrar unor pareri destul de raspandite printre incepatori, pointer-ul this nu este un membru ascuns al unei clase, ci un parametru introdus de compilator la toate functiile ne-statice. Cand declarati o functie, daca e ne-statica, compilatorul adauga un parametru in plus. Tipul sau depinde de modul in care e declarata functia. Standardul C++, la paragraful 9.3.2.1 specifica:
In corpul unei functii membre nestatice, cuvantul cheie this este expresie non-lvalue a carei valoarea este adresa obiectului pentru care a fost apelata functia. Tipul lui this intr-o functie a unei clase X este X*. Daca functia membra e declarata const, atunci tipul sau e const X*; daca acea functie membra este declarata volatile, tipul lui this este volatile X*; iar daca functia este declarata const volatile, tipul lui this este const volatile X*.
De exemplu:

Code: Select all

class T
{
public:
  void foo(int a);
  int goo() const;
};
e de fapt, in urma compilarii:

Code: Select all

class T
{
public:
  void foo(T* this , int a);
  int goo(const T* this) const;
};
Intrebare: Daca incerc sa folosesc o functie membra a unei clase ca fi procedura pentru un thread, compilatorul imi da eroare. De ce?

Raspuns: Acest lucru se intampla in cazul folosirii unei functii ne-statice, tocmai din cauza ca prototipul functie, care in cod poate arata asa:

Code: Select all

class foo
{
   UINT ThreadFunction(LPVOID param);
};
este de fapt:

Code: Select all

class foo
{
   UINT ThreadFunction(T* this, LPVOID param);
};
Prin urmare, acest prototip nu mai se potriveste cu ce asteapta API-ul pentru crearea unui tread. Solutia este folosirea unei functii statice, care nu primeste acest parametru this.


Next FAQ >>


Marius Bancila
Fondator Codexpert, Microsoft MVP VC++
Site personal | Blog

Post Reply