Jump to content

[Programarea Orientata Pe Obiecte - C++] Referințe și Transferul de Parametri


Soulrayne
 Share

Recommended Posts

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 !!

 

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.