Moderators NEFERPITOU Postat Decembrie 5 Moderators Postat Decembrie 5 ** " Ce este pointerul "this" " ? ** Pointerul "this" reprezinta o modalitate de a accesa membrii unei clase , in interiorul acesteia . Apare ca necesitate pentru evitarea conflictelor de "nume" (declarat) dintre membrii clasei si parametrii locali (argumentele unei functii , variabile locale etc.) . NOTA ** : Pointerul "this" reprezinta un concept STRICT C++ . Cu alte cuvinte , in celalalte limbaje cu paradigma POO nu avem acest concept deoarece nu exista pointeri . ** Exemplu Utilizare in C++ ** NOTA ** : Codul preluat este preluat din tutorialele trecute !! Sa presupunem ca avem constructorul cu parametrii : Utilizator(unsigned _id, const char* _username, const char* _email, const char* _password) // Constructor cu Parametrii Esentiali (Un utilizator NOU nu poate sa aiba ban sau posturi) { // Variabile cu Alocare Statica id = _id; // Preluam din parametru nrPosts = 0; // IMPLICIT 0 POSTURI LA CONSTRUCTIA UTILIZATORULUI isBanned = false; // NU E BANAT // Variabile cu Alocare Dinamica atribuireSirCaractere(&username, _username); atribuireSirCaractere(&email, _email); atribuireSirCaractere(&password, _password); } Totul e ok deoarece am evitat conflictul de "nume" dintre membrii clasei si parametrii . Practic , am pus un caracter suplimentar , "_" , ce face diferenta . Altfel : Utilizator(unsigned id, const char* username, const char* email, const char* password) // Schimba numele declarat asociate argumentelor constructorului ! // Constructor cu Parametrii Esentiali (Un utilizator NOU nu poate sa aiba ban sau posturi) { /// MEREU O VARIABILA LOCALA SAU UN ARGUMENT VOR AVEA PRIORITATE IN FATA MEMBRIILOR PRIVIND NUMELE !! // Variabile cu Alocare Statica /// APARE CONFLICTUL DE NUME SI VOR AVEA URMATOARELE EFECTE (RUNTIME SI LOGICE) : id = id; // ARGUMENTUL ID = ARGUMENTUL ID ; // Urmatorii doi sunt OK deoarece primesc valori implicite !! (Eventual la setteri vor aparea conflicte daca se pune acelasi nume la argument cu al membrului ) nrPosts = 0; // IMPLICIT 0 POSTURI LA CONSTRUCTIA UTILIZATORULUI isBanned = false; // NU E BANAT // Variabile cu Alocare Dinamica atribuireSirCaractere(&username, username); /// EROARE RUNTIME ==> USERNAME E SIR DE CARACTER CONSTANT IAR LA INCERCAREA DE A ACCESA MEMBRUL "USERNAME" va esua programul cu eroare la accesarea unei zone de memorie neexistenta !! (Pentru ca nu i s-a atribuit nimic) atribuireSirCaractere(&email, email); /// IDEM ca la prima atribuireSirCaractere(&password, password); /// IDEM ca la prima } Daca vrem sa pastram acelasi nume atat pentru membru cat si pentru argument , aplicam pointerul "*this" : Utilizator(unsigned id, const char* username, const char* email, const char* password) // Constructor cu Parametrii Esentiali (Un utilizator NOU nu poate sa aiba ban sau posturi) { // Variabile cu Alocare Statica this->id = id; // Accesam Membru cu pointerul this-> (Sageata ca E POINTER) (*this).nrPosts = 0; // SAU ASA isBanned = false; // Nu exista conflict de nume , NU AVEM DE CE sa l folosim // Variabile cu Alocare Dinamica atribuireSirCaractere(&this->username, username); atribuireSirCaractere(&(*this).email, email); atribuireSirCaractere(&this->password,password); ///// ORI "this->" ORI "(*this)." NU ARE IMPORTANTA (Recomand totusi prima varianta) } NOTA 1 * : IL PUTEM FOLOSI DOAR IN INTERIORUL CLASEI (In constructor,destructor,functii etc.) doar pentru acest scop !! NOTA 2* : NU SE POATE FOLOSI IN CADRUL FUNCTIILOR STATICE SI PENTRU ACCESAREA MEMBRIILOR STATICI (INDIFERENT CA FAC PARTE SAU NU DIN CLASA) !! 1
Postări Recomandate