LCS PREMIUM NOT a MERCEDES Postat Decembrie 10, 2024 LCS PREMIUM Postat Decembrie 10, 2024 ** Referintele ** Referintele sunt tipuri de date complexe , gasite in C++ (nu in C) , care au abilitatea de a primi o referinta a oricarei variabile fara a se construi o copie . De ce ne ajuta referintele ? Cu ajutorul lor , putem transfera variabile catre o alta functie , intr-o maniera mai optima , fara a construi o copie acestuia . Cu aceasta modalitate , deducem ca exista 3 mari optiuni de transfer a parametrilor de la o functia la alta : prin valoare , argumentul va prelua o copie pe care o putem folosi pentru accesarea unei informatii . NU SE MODIFICA DUPA IESIREA DIN SUBPROGRAM ; (VALABIL IN C & C++) ; prin adresa , argumentul primeste o adresa pe care o poate folosi pentru accesarea sau inserarea/stergere/modificare a informatiei . SE MODIFICA DUPA IESIREA DIN SUBPROGRAM ; (VALABIL SI IN C SI C++) prin referinta , argumentul primeste o referinta (alias) care o poate folosi precum adresa (inserare,stergere,modificare) dar evitand pointeri . SE MODIFICA DUPA IESIREA DIN SUBPROGRAM . (RETINE : SE REGASESTE DOAR IN C++ , NU IN C) INDICATIE 1 * : Daca avem o variabila simpla (tipuri de date simple , arrays sau pointeri) folosim transferul prin valoare . (DOAR IN ACEST CONTEXT) !! INDICATIE 2* : Daca transferam obiecte (mai ales, cu multe campuri) , preferam transferul prin referinta !! ** Exemplu in C++ ** : *Transfer prin valoare : void setNrPosts(const unsigned nrPosts) // Transfer prin valoare (DOAR ACCESAM DATE DIN EL NU SI MODIFICAM) // IN ACEST CONTEXT SE PREFERA TRANSFERUL PRIN VALOARE (NU MODIFICAM SI AVEM DATE SIMPLE) { if (nrPosts > 0) // doar daca numarul de Posturi e mai mare decat 0 { this->nrPosts = nrPosts; // Atribuim membrului valoarea argumentului } } *Transfer prin adresa : void atribuireSirCaractere(char** target, const char* source) // Transfer prin adresa { // SE APLICA MODIFICARI ASUPRA ARGUMENTULUI + TREBUIE SA FIE POINTER DEOARECE ALOCAM NOI ZONE DE MEMORIE PENTRU SIRUL DE CARACTERE (TRANSFER PRIN ADRESA) // IN ACEST CONTEXT , TREBUIE SA OPTAM PENTRU TRANSFERUL PRIN ADRESA (AVEM NEVOIE CA ARGUMENTUL SA FIE POINTER!!) size_t bufferString = strlen(source) + 1; *target = new char [bufferString]; strcpy_s(*target, bufferString, source); } *Transfer prin referinta : void objectToString(Utilizator& const user) // Transferam obiectul prin referinta constanta (TRANSFERAM UN OBIECT) { // OBIECTULUI II SE VA CONSTRUI O REFERINTA CONSTANTA (NU APLICAM MODIFICARI PE ACEL OBIECT) // IN ACEASTA SITUATIE , ESTE DE PREFERABIL TRANSFERUL PRIN REFERINTA !! // DOAR AFISAM CAMPURILE OBIECTULUI cout << "\n{" << "\nID Utilizator : " << user.getId() << " ,\n" << "Nume Utilizator : " << user.getUsername() << " ,\n" << "Adresa Mail : " << user.getEmail() << " ,\n" << "Parola Utilizator : " << user.getPassword() << " ,\n" << "Numar Posturi : " << user.getnrPosts() << ", \n" << "Este Banat : " << (user.getisBanned() ? "ESTE BANAT" : "NU ESTE BANAT") << " ,\n}"; } Bineinteles , putem aplica modificari asupra referintei : .... RESTUL CODULUI (IL REGASITI IN TUTORIALELE DE POO TRECUTE) void changeObjectContent(Utilizator& user) // TRANSFER PRIN REFERINTA MODIFICABILA { user.setNrPosts(5); // APLICAM MODIFICARE ASUPRA REFERINTEI !! } int main() { Utilizator utilizator; changeObjectContent(utilizator); // Schimbam Continutul objectToString(utilizator); // Afisam Obiectul return 0; // Aici se declanseaza destructorul VASILE (La finalul functiei/programului) } Si vom avea ca rezultat : { ID Utilizator : 0 , Nume Utilizator : IMPLICIT , Adresa Mail : implicit@gmail.com , Parola Utilizator : implicitParola , Numar Posturi : 5, Este Banat : NU ESTE BANAT , } DESTRUCTORUL utilizatorului IMPLICIT A FOST DECLANSAT CU SUCCES !! 1
Global-Moderators Dexter. @ GOV.RO Postat Decembrie 11, 2024 Global-Moderators Postat Decembrie 11, 2024 Salutare, tovarăș' Este bine explicată distincția dintre cele trei metode de transfer a parametrilor în C++: prin valoare, prin adresă și prin referință. Se evidențiază avantajele și limitările fiecărei metode. Exemplele oferite sunt utile pentru înțelegerea practică a fiecărei metode de transfer. În special, diferențierea dintre transferul prin valoare pentru date simple și transferul prin referință pentru obiecte este esențială pentru optimizarea codului. Utilizarea const pentru parametrii transmiși prin referință sau valoare este bine subliniată, însă ar putea fi specificat mai clar de ce aceasta este o bună practică. Exemplele ar putea include și situații mai complexe (de ex., transferul prin referință la funcții lambda sau utilizarea cu clase template). În exemplul cu transferul prin adresă, codul alocă memorie folosind new. În C++ modern, este recomandat să utilizez smart pointers (de exemplu, std::unique_ptr sau std::shared_ptr) pentru a evita scurgerile de memorie. De exemplu: Citat void atribuireSirCaractere(std::unique_ptr<char[]>& target, const char* source) { size_t bufferString = strlen(source) + 1; target = std::make_unique<char[]>(bufferString); strcpy_s(target.get(), bufferString, source); } Dacă actualizezi codul să respecte standardele recente, cum ar fi std::move pentru transferuri de resurse, folosirea constexpr acolo unde e posibil și evitarea explicită a funcțiilor de tip raw. Dacă aplici aceste modificări, codul devine mai robust, mai ușor de citit și mai sigur, evitând probleme comune precum scurgerile de memorie sau copierea inutilă, în rest sunt foarte impresionant de modul tău vizual programativ. 2
LCS PREMIUM NOT a MERCEDES Postat Decembrie 11, 2024 Autor LCS PREMIUM Postat Decembrie 11, 2024 Intr-adevar , e mult mai usor sa gestionezi un smart pointer care ne fac toate lucrurile (alocare prin constructor,eliberare prin destructor etc.) dar vreau sa arat , totusi , mecanismele din spate intr-un mod cat mai interactiv pentru incepatori (sau macar incerc) . Asa as fi putut sa folesesc string pentru "char*" , vectori si iteratori pentru colectii samd. (imi era extrem de usor) dar tind cititorului , sa i ofera o intelegere mai buna asupra cum functioneaza pointeri si colectiile , intr-un mod cat mai simplu de inteles. Oricum , voi tine si tutoriale viitoare si despre containere STL pentru a ne usura munca si a evita erorile . Multumesc frumos pentru obiecte , o seara faina !
Postări Recomandate