Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Incalzire in pardoseala etapizata

Suprataxa card energie?!

Cum era nivelul de trai cam din a...

probleme cu ochelarii
 Impozite pe proprietati de anul v...

teava rezistenta panou apa calda

Acces in Curte din Drum National

Sub mobila de bucatarie si sub fr...
 Rezultat RMN

Numar circuite IPAT si prindere t...

Pareri brgimportchina.ro - teapa ...

Lucruri inaintea vremurilor lor
 Discuții despre TVR Sport HD.

Cost abonament clinica privata

Tremura toata, dar nu de la ro...

Renault Android
 

Referințele în C++

- - - - -
  • Please log in to reply
43 replies to this topic

#1
TheOriginals

TheOriginals

    Junior Member

  • Grup: Members
  • Posts: 51
  • Înscris: 30.05.2016
Salut,
Aș avea și eu o întrebare la referințele din C++. Am exemplul ăsta care nu face nimic și are doar rol demonstrativ:
int max(int&a)
{
	int x=12;
	x = a;
	return a;
}

Din ce știu eu dacă am 2 int-uri(int a=1,int b=0) dacă faci a=b se copie valoarea și nu are nici o legătură cu adresa.
Aș avea 2 întrebări mai importante pentru mine ca să zic așa :
1. Dacă x este int si a este int& de ce mă lasă să le egalez?
2. Referința este un alias, 2 entități care țintesc aceiași adresă, ce modifici în una se regăsește și în cealalată, deci care ar fi utilitatea referinței?
3.De ce aș avea nevoie de 2 entități care referă aceiași zonă de memorie?
Am întâlnit exemple de genul:
class complexType
{
public:
	void getComplex(double& real, double& imag) const;
private:
	double realPart; //variable to store the real part
	double imaginaryPart; //variable to store the imaginary part
};

//mod 1 de utilizare
void complexType::getComplex(double & real, double & imag) const
{
	real = realPart;
	imag = imaginaryPart;
}

//mod 2 de utilizare
void complexType::getComplex(double real, double imag) const
{
	real = realPart;
	imag = imaginaryPart;
}

4.Este vreo diferență de utilizare între modul 1 și 2 sau vreun avantaj anume?
Eu de obicei când făcem get și set îi foloseam normal fără referință.

#2
andreim77

andreim77

    Senior Member

  • Grup: Senior Members
  • Posts: 4,233
  • Înscris: 11.04.2006
Referinta e un alias.

Exemplele tale produc confuzie pt ca nu ilustreaza rolul practic al referintelor ci doar cum le-ai putea folosi.

Rolul lor initial a fost sa optimizeze/simplifice utilizarea pointerilor.

Astea-s doar niste idei simple, chestiunea e ceva mai complexa, mai ales dupa aparitia referintelor rvalue. Pt inceput incearca sa intelegi ce-i o referinta simpla si cu ce te ajuta.

Edited by andreim77, 30 May 2016 - 17:16.


#3
TheOriginals

TheOriginals

    Junior Member

  • Grup: Members
  • Posts: 51
  • Înscris: 30.05.2016
Păi tocmai asta nu înţeleg...ce am citit pe net doar spune ce este o referinţă, că este un alias dar nu am găsit nimic care să-mi lămurescă ideiile de mai sus.

#4
OriginalCopy

OriginalCopy

    I'm harmful, fear me please! :))

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006

Vizualizare mesajThefake_fake_fake, pe 30 mai 2016 - 17:44, a scris:

Păi tocmai asta nu înţeleg...ce am citit pe net doar spune ce este o referinţă, că este un alias dar nu am găsit nimic care să-mi lămurescă ideiile de mai sus.
Un pointer stii ce e?

#5
TheOriginals

TheOriginals

    Junior Member

  • Grup: Members
  • Posts: 51
  • Înscris: 30.05.2016
Da...o adresă de memorie.Valoarea unui pointer e o adresă, când îl citeşti să zicem cu * afişează valoarea adresei pe care o conţine.

Din ce am citit cred că am înţeles mai bine la ce sunt bine... nu "obosesc" stiva ca să zic aşa...dar tot nu mi-e clar cum să o provesc. "Returnează" o adresă sau o valoare. Adică declari obiectul prin referinţă, îi face alias-ul iar apoi o poţi trata ca un obiect normal? Nu e o adresă, nu o să aibă nevoie de operatorul " * " pentru a-i afişa valoarea? Asta nu mi-e prea clar.

#6
OriginalCopy

OriginalCopy

    I'm harmful, fear me please! :))

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006
De ce nu scrii tu frumusel cod pentru teoriile pe care le ai, pentru a vedea practic ce se intampla?

Ia formuleaza o singura intrebare / teorie, sa scriem un cod pentru a o verifica / a afla raspunsul.

Asta e frumos la programare: e foarte usor sa faci experimente, pentru a afla adevarul, prin deductii logice.

O referinta este un pointer constant, careia compilatorul ii aplica automat operatorul de derefentiere.

#7
TheOriginals

TheOriginals

    Junior Member

  • Grup: Members
  • Posts: 51
  • Înscris: 30.05.2016
Crede-mă că asta fac...nu ai vrea să vezi cum arată proiectul din visual stdio.Am înţeles cum merge însă nu îmi este clar ce returnează o referinţă.
O referinţă creează un alias spre o variabila (pentru a 10-a oara :)) ) deci e o adresă. De ce îmi dă voie să o egalez cu o variabilă (ex int a) dacă una e int si una e int&.
Asta ar merge numai dacă & e pus doar pt a şti compilatorul să-i facă un alias la variabila dar defapt acolo să fie tot valori şi nu adrese.

#8
OriginalCopy

OriginalCopy

    I'm harmful, fear me please! :))

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006
O referinta nu returneaza nimic.

"A returna" este un verb, iar un verb nu poate fi "executat" decat de instructiuni...well, executabile.

O functie, o metoda, un apel, astea returneaza ceva.

O referinta este o variabila, un pointer este si el tot o variabila.

O variabila, de oricare ar fi ea, doar contine informatii. Ea nu face nimic, ci asteapta ca altii sa faca ceva cu ea.

Vizualizare mesajThefake_fake_fake, pe 30 mai 2016 - 19:00, a scris:

De ce îmi dă voie să o egalez cu o variabilă (ex int a) dacă una e int si una e int&.
Nu stiu exact unde te afli din punct de vedere mental, ce cod vezi acum in fata ta, de iti pui intrebarea asta. Cel mai bine vino cu acel cod.

Insa indiferent de situatia, trebuie sa inveti sa citesti cod. Noi ca programatori, cand ne exprimam, o facem "pe scurtatura", desi ne referim la lucrul corect.

De exemplu, acest cod:

int a;
int b;
b = a;

se citeste:

1. aloca static un bloc de memorie de marime sizeof(int) la o adresa (decizia locatiei o ia compilatorul la compilare, d-aia se numeste "static")
2. aloca static un al doilea bloc de memorie de marime sizeof(int) la o adresa (decizia locatiei o ia compilatorul la compilare, d-aia se numeste "static")
3. copiaza valoarea aflata la locatia de memorie a lui a in locatia de memorie aflata la adresa lui b, deci in "pseudocod" vorbind, compilatorul genereaza cod de genul: &b = *a

In assembler, ai spune: copiaza valoarea lui a la locatia locatia lui b. Niciunde, nicicum, nu se spune "egaleaza". Nu exista "a egala", exista a copia sau a muta.

Daca faci o statistica a instructiunilor executate de CPU, cea mai folosita instructiune e mutarea datelor de colo colo.

#9
TheOriginals

TheOriginals

    Junior Member

  • Grup: Members
  • Posts: 51
  • Înscris: 30.05.2016
Scuză-mi exprimarea.
Referitor la exemplul cu int şi int& ar fi ceva cam pe aici:
int max(int&a)
{
	 int x=12;
	 x = a;
	 return a;
}

Ştiu că ce e mai sus nu e ok din mai multe puncte de vedere dar să-l lăsam doar aşa ca exemplu.
Dacă fac în main ceva de genul:
int main()
{
int k=10;
cout<<max(k);
return 0;
}

Funcţionează, adică k e int, iar în funcţia max am un int&.
Pe mine mai exact mă dezorientează modul de lucru cu o referinţă, adică trebuie să o tratez ca pe un pointer, o adresă de memorie sau e pur şi simplu o un alt nume pentru aceiasi valoare pe care o conţine variabila respectivă si îl pot folosi exact ca şi pe variabila referită.
De exemplu, uite cam la ce mă gândesc şi functionează:
int main()
{
int i = 3;
int &p = i;
p = 1;//tratez p-ul ca pe o variabilă normala cu toate că ea este o referinţă(o adresă din memorie)
cout << p;
getchar();
return 0;
}

Şi mai e aici:
int &p = i;

Aici în p o să se copie adresa lui i, nu-i aşa?

Edited by TheOriginals, 30 May 2016 - 20:01.


#10
OriginalCopy

OriginalCopy

    I'm harmful, fear me please! :))

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006
In exemplul tau nu folosesti in niciun fel referinta la potentialul ei maxim. De fapt, ignori complet faptul ca e referinta.

Uite un astfel de cod subliniaza faptul ca referinta e referinta:

	 1 #include <iostream>
	 2
	 3 void max(int& a) {
	 4	 if (a < 12) {
	 5		 a = 12;
	 6	 }
	 7 }
	 8
	 9 int main() {
	10	 int k = 13;
	11	 max(k);
	12	 std::cout << k;
	13	 return 0;
	14 }


Edited by OriginalCopy, 30 May 2016 - 20:33.


#11
OriginalCopy

OriginalCopy

    I'm harmful, fear me please! :))

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006

Vizualizare mesajThefake_fake_fake, pe 30 mai 2016 - 19:59, a scris:

Pe mine mai exact mă dezorientează modul de lucru cu o referinţă, adică trebuie să o tratez ca pe un pointer, o adresă de memorie sau e pur şi simplu o un alt nume pentru aceiasi valoare pe care o conţine variabila respectivă si îl pot folosi exact ca şi pe variabila referită.
Orice variabila are 4 lucruri: un identificator, un tip de date, o valoare si o adresa la care e salvata acea valoare.

Faptul ca e pointer (sau, in extenso, referinta) e un detaliu aditional.

Un pointer sau o referinta este in primul rand variabila, apoi si pointer sau referinta.

Pe tine te deruteaza faptul ca orice variabila e tratata cand ca valoare, cand ca adresa. De exemplu:

int a;
a = a;

a-ul din partea dreapta a egalului se refera la valoarea variabilei a.
a-ul din stanga egalului se refera la adresa variabilei a.

Asta e esenta exemplului meu anterior:

Vizualizare mesajOriginalCopy, pe 30 mai 2016 - 19:12, a scris:

De exemplu, acest cod:

int a;
int b;
b = a;

se citeste:

1. aloca static un bloc de memorie de marime sizeof(int) la o adresa (decizia locatiei o ia compilatorul la compilare, d-aia se numeste "static")
2. aloca static un al doilea bloc de memorie de marime sizeof(int) la o adresa (decizia locatiei o ia compilatorul la compilare, d-aia se numeste "static")
3. copiaza valoarea aflata la locatia de memorie a lui a in locatia de memorie aflata la adresa lui b, deci in "pseudocod" vorbind, compilatorul genereaza cod de genul: &b = *a

In assembler, ai spune: copiaza valoarea lui a la locatia locatia lui b. Niciunde, nicicum, nu se spune "egaleaza". Nu exista "a egala", exista a copia sau a muta.

Daca faci o statistica a instructiunilor executate de CPU, cea mai folosita instructiune e mutarea datelor de colo colo.

fie codul: int* p; int a; p = &a;
Intrebare de intelegere: care e adresa pointerului p?

#12
TheOriginals

TheOriginals

    Junior Member

  • Grup: Members
  • Posts: 51
  • Înscris: 30.05.2016
Cu încă o chestie te mai stresez şi îţi dau pace (cred că te-am înebunit :)) )
Tu spui : &b = *a
Dacă îi pui & nu aşteaptă o adresă adică ceva gen (0xa7ef45ae) şi tu îi dau o valoare *a. Sau el modifică direct conţinutul variabilei referite de b cu valoarea lui a?

#13
OriginalCopy

OriginalCopy

    I'm harmful, fear me please! :))

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006

Vizualizare mesajOriginalCopy, pe 30 mai 2016 - 19:12, a scris:

deci in "pseudocod" vorbind, compilatorul genereaza cod de genul

Citeste cu atentie toata fraza.

Si da, genereaza o adresa, e o adresa stabilita static de compilator, e fixa.

Si apoi instructiunea se numeste ceva de genul

MOVE 0xa7ef45ae, 10

"muta valoarea 10 la adresa 0xa7ef45ae"

#14
TheOriginals

TheOriginals

    Junior Member

  • Grup: Members
  • Posts: 51
  • Înscris: 30.05.2016
Ok, hai că m-am lămurit in cele din urmă, am făcut un exemplu aici în caz că mai e cinevă nelămurit
//head
class test {
private:
char *nume,*pre;
int a, b;
public:
void setChar( char *&nume,char *&pre);
char* getChar();
};


//metode
void test::setChar( char *& nume, char *& pre)
{
this->nume = new char[strlen(nume) + 1];
this->pre = new char[strlen(pre)+1];
strcpy_s(this->nume,strlen(nume)+1,nume);
strcpy_s(this->pre, strlen(pre) + 1, pre);
}
char * test::getChar()
{
return nume;
}


int main()
{
test t;
t.setInt(1, 2);
char *n = "soft";
char *p = "originalCopy :D";
cout << "Int aici :" << t.get() << endl;
t.setChar(n, p);
cout << "Char aici : " << t.getChar();
	 return 0;
}

Deci în concuzie o referinţă e:
  • o variabilă care referă aceiaşi variabilă, modificările făcute asupra oricăriei dintre ele este vizibilă şi în cealalată
  • variabilei (cea are deţine referinţa) după ce i se atribuie noua valoarespre care trebuie să refere nu este necesar să utilizăm lucrul cu pointeri, o tratezi ca pe o simplă variabila.
Mulţumesc OriginalCopy pentru răspunsuri, am mai încercat pe nişte forumuri dar băieţii nici ei nu ştiu despre ce vorbesc Posted image) Eu am pus întrebarea şi au terminat prin a mă întreba ei.Posted image)
Multumesc încă o dată.

Edited by TheOriginals, 30 May 2016 - 21:43.


#15
andreim77

andreim77

    Senior Member

  • Grup: Senior Members
  • Posts: 4,233
  • Înscris: 11.04.2006
valeu, ai trecut la referinte la pointeri :) esti tare. f rar mi-a fost dat sa vad cod scris asa. nu ca ar fi gresit (programatic) dar in 99.99% din cazuri e inutil si posibil sa nici nu functioneze cum te astepti chiar daca se compileaza.
parerea mea e ca ai ceva lacune in ce priveste teoria limbajelor de programare, a tipurilor de date, structurarea si manevrarea lor in memoria calculatorului, felum cum se compileaza, leaga, incarca si executa programele.
dar e bine ca perseverezi.

#16
TheOriginals

TheOriginals

    Junior Member

  • Grup: Members
  • Posts: 51
  • Înscris: 30.05.2016

Vizualizare mesajandreim77, pe 31 mai 2016 - 10:11, a scris:

valeu, ai trecut la referinte la pointeri Posted image esti tare. f rar mi-a fost dat sa vad cod scris asa. nu ca ar fi gresit (programatic) dar in 99.99% din cazuri e inutil si posibil sa nici nu functioneze cum te astepti chiar daca se compileaza.
parerea mea e ca ai ceva lacune in ce priveste teoria limbajelor de programare, a tipurilor de date, structurarea si manevrarea lor in memoria calculatorului, felum cum se compileaza, leaga, incarca si executa programele.
dar e bine ca perseverezi.
Mă străduiesc. De ce spui că nu e ok?Posted image
Îi tot trag cu pointerii pentru că un pointer ţine o adresă, la o referinţă îi modific adresă şi de asta le mai combin Posted image).Acum îmi e mai clar.
Doar că tot citind am mai dat peste o chestie şi anume scanf-ul din C. Din ce ştiu eu în C nu există referinţe dar totuşi se foloseşte &valoare. În C "&" are alt rol decât cel de referenţiere? Aici mă refer de exemplu la citirea dimensiunii unui vector de exemplu.

#include<stdio.h>

int main() {
   int i, arr[50], num;

   printf("\nEnter no of elements :");
   scanf("%d", &num);

   //Reading values into Array
   printf("\nEnter the values :");
   for (i = 0; i < num; i++) {
	  scanf("%d", &arr[i]);
   }

   //Printing of all elements of array
   for (i = 0; i < num; i++) {
	  printf("\narr[%d] = %d", i, arr[i]);
   }

   return (0);
}


Edited by TheOriginals, 31 May 2016 - 10:30.


#17
andreim77

andreim77

    Senior Member

  • Grup: Senior Members
  • Posts: 4,233
  • Înscris: 11.04.2006
eh, tre sa le iei pas cu pas, operatorul & are mai multe roluri atat in c++ cat si in c. e usor sa le amesteci, ca incepator concentreaza-te pe un singur limbaj. multi (majoritatea) recomanda sa incepi cu C din diverse motive. un limbaj de programare e independent asa ca daca incepi cu c++ e f bine, concentreza-te doar pe el, lasa ce e in C. dar sa stii ca e mult mai greu C++, poate cel mai greu limbaj de programare de nivel inalt.

#18
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,383
  • Înscris: 10.08.2005
unde scrie ca in C nu exista referinte ?

Anunturi

Second Opinion Second Opinion

Folosind serviciul second opinion ne puteți trimite RMN-uri, CT -uri, angiografii, fișiere .pdf, documente medicale.

Astfel vă vom putea da o opinie neurochirurgicală, fără ca aceasta să poată înlocui un consult de specialitate. Răspunsurile vor fi date prin e-mail în cel mai scurt timp posibil (de obicei în mai putin de 24 de ore, dar nu mai mult de 48 de ore). Second opinion – Neurohope este un serviciu gratuit.

www.neurohope.ro

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate