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 |
Referințele în C++
Last Updated: Jun 03 2016 12:52, Started by
TheOriginals
, May 30 2016 16:42
·
0
#1
Posted 30 May 2016 - 16:42
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
Posted 30 May 2016 - 17:12
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
Posted 30 May 2016 - 17:44
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
Posted 30 May 2016 - 18:32
#5
Posted 30 May 2016 - 18:44
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
Posted 30 May 2016 - 18:53
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
Posted 30 May 2016 - 19:00
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
Posted 30 May 2016 - 19:12
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. Thefake_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&. 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
Posted 30 May 2016 - 19:59
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
Posted 30 May 2016 - 20:32
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
Posted 30 May 2016 - 20:57
Thefake_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ă. 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: OriginalCopy, 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
Posted 30 May 2016 - 21:11
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
Posted 30 May 2016 - 21:18
OriginalCopy, 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
Posted 30 May 2016 - 21:43
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:
Multumesc încă o dată. Edited by TheOriginals, 30 May 2016 - 21:43. |
#15
Posted 31 May 2016 - 10:11
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
Posted 31 May 2016 - 10:23
andreim77, pe 31 mai 2016 - 10:11, a scris:
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. Îi tot trag cu pointerii pentru că un pointer ţine o adresă, la o referinţă îi modific adresă şi de asta le mai combin ).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
Posted 31 May 2016 - 10:41
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.
|
Anunturi
▶ 0 user(s) are reading this topic
0 members, 0 guests, 0 anonymous users