Matrice, pointeri si referinte
#include<iostream>
using namespace std
class C //constructor
int da
void main
//aici se face initializarea
for int i i < 4; i cout<<ob i da()<<endl
Initializarea obiectelor cu mai multi parametri in matrici
#include<iostream>
using namespace std
class C
int da_a
int da_b
void main
//initializare
for int i i < 3; i
cout<<"obiectul "<<i<<" = "<<ob i da_a()<<" "<<ob i da_b()<<endl
Matrici initializate / neinitializate
Pentru a declara matrici de obiecte care sa poata fi initializate trebuie definit un constructor cu parametri care sa faca posibila initializarea.
Pentru a declara matrici de obiecte care sa nu fie initializate trebuie definit un constructor fara parametri.
Pentru a declara matrici de obiecte care sa fie cand initializate cand neinitializate se supraincarca functia constructor.
#include<iostream>
using namespace std
class C //apelare ptr. matrice neinitializate
C int j //apelare ptr. matrici initializate
int da
void main
//initializat
C ob2 //neinitializat
Pointeri catre obiecte
Atunci cand este incrementat un pointer, el indica spre urmatorul element de acelasi tip cu al sau. De exemplu, un pointer de tip intreg va indica urmatorul intreg. Tot asfel se intampla in cazul pointerului la obiecte.
#include<iostream>
using namespace std
class C
void main
Deoarece p indica spre un intreg, el este declarat ca un pointer de tip intreg. In aceasta situatie este irelevant ca i este un membru al obiectului ob.
Pointerul this
Cand este apelata o functie membru, i se paseaza un argument implicit, care este un pointer catre obiectul care a generat apelarea (obiectul care a invocat functia). Acest pointer este numit this.
La membrii unei class se poate capata acces direct dintr-o functie membru. Instructiunea b = j; ar comanda ca valoarea continuta in baza sa fie atribuita unei copii a lui b asociata obiectului care a generat apelarea. Totusi, aceeasi intructiune poate fi scrisa si astfel:
this->b = j;
Pointerul this indica spre obiectul care a apelat ADUNA(). Astfel, this->b se refera la copia b pentru acel obiect. De exemplu, daca ADUNA() este apelata de ob (ca in ob(1, 2)), atunci this din instructiunea precedenta indica spre ob. ATENTIE: scrierea instructiunii fara this este doar o prescutare.
Pointerul this este transmis automat catre toate functiile membru.
PRECAUTII:
functiile friend nu sunt membri ai clasei si de aceea nu le sunt pasati pointeri this
functiile membre static nu au un pointer this
#include<iostream>
using namespace std
class ADUNA
int da
void main
Pointeri catre tipuri derivate
Un pointer din clasa de baza poate sa fie folosit ca un pointer spre un obiect din oricare clasa derivata din clasa de baza.
Reciproca nu este adevarata: un pointer din clasa derivata nu poate indica spre un obiect din clasa de baza. Mai mult, chiar daca se poate folosi un pointer din baza pentru a indica un obiect derivat, accesul este permis doar la membrii de tip derivat care au fost importati din baza. Deci nu este permis accesul la membrii adaugati īn clasa derivata. Totusi pointerul din clasa de baza poate fi convertit la unul (pointer) derivat si cāstiga acces la deplin la īntreaga clasa derivata.
#include<iostream>
using namespace std
class BAZA
int da_b
class DERIVAT public BAZA
int da_d
void main
IMPORTANT: ARITMETICA POINTERILOR ESTE
RELATIVĂ LA TIPUL DE BAZĂ
Pointeri catre membrii clasei ( ) si (->*
Pointerul care "indica" generic catre un membru al unei clase si nu catre un anumit exemplar al acelui membru dintr-un obiect se numeste pointer catre un membru al clasei (sau pointer-la-membru). Pointerul la membru nu este acelasi lucru cu pointerul normal. Pointerul la membru asigura doar un offset (o pozitie) īntr-un obiect din clasa membrului, unde poate fi gasit acel membru. Deoarece pointerul la membru nu este pointer adevarat, nu i se poat aplica operatorii . si ->. Pentru a avea acces la membrul unei clase prin intermediul unui pointer spre el, va trebui sa folositi operatorii speciali ai pointerilor la membri, si ->*. Misiunea lor este sa va permita accesul la un membru al unei clase prin intermediul unui pointer catre acesta.
#include<iostream>
using namespace std
class C
int val
int val_dubla
void main
NOTA: Pointerii-la-membru se aplica īn situatii speciale. Ei nu sunt folositi curent īn programarea de zi cu zi.
Referinte
O referinta este un pointer implicit care actioneaza ca un alt nume al unui obiect.
Parametri de referinta
Referinta permite crearea unor functii care folosesc automat transmiterea prin referinta.
Pentru a crea o apelare prin referinta īn C, trebuie pasata explicit functiei adresa argumentului.
#include<iostream>
using namespace std
void fa_10 int i
void main
fa_10() preia ca parametru un pointer catre un īntreg pe care īl va transforma īn 10. Īn interiorul functiei fa_10() trebuie folosit operatorul * pentru a avea acces la variabila spre care indica i. Acesta este modul de generare a unei apelari-prin-referinta-manuale.
Īn C++, pentru a crea un parametru de referinta, numele parametrului trebuie precedat de &. Functia fa_10() ar deveni:
void fa_10(int &i)
i devine practic un alt nume pentru orice argument folosit la apelul functiei. Altfel spus, i este un pointer implicit care se refera la argumentul folosit pentru invocarea functiei fa_10(). Folosirea mai departe a operatorului * nu mai este permisa. De asemenea, īn apelul functiei nu mai este permisa folosirea operatorului &.
#include<iostream>
using namespace std
void fa_10 int &i
void main
NOTĂ: īn apelul prin referinta se modifica obiectul apelat si nu copia lui.
Transmiterea referintelor catre obiecte
Cānd se face apel prin referinta, nu se face nici o copie a obiectului, asa cum se īntāmpla cu apelul prin valoare. Aceasta īnseamna ca nici un obiect folosit ca parametru nu este distrus atunci cānd se termina functia, iar destructorul parametrului nu este apelat.
NOTĂ: cānd parametrii sunt transmisi prin referinta, schimbarile obiectului din interiorul functiei afecteaza obiectul apelant.
Returnarea referintelor
O functie poate sa returneze o referinta ceea ce face ca ea sa poata fi folosita īn membrul stāng al unei instructiuni de atribuire.
#include<iostream>
using namespace std
int var_globala
int &schimba /*orice parametru ar fi aici ar fi unul temporar
chiar da ca ar avea numele 'var_globala' */
void main
ATENŢIE!!!
#include<iostream>
using namespace std
int var
int &schimba int var /* var din argumentul functiei este locala
deci temporara
//LA IESIREA DIN FUNCTIE COPIA LUI var ESTE DISTRUSA
void main
CORECT AR FI:
#include<iostream>
using namespace std
int var
int &schimba int &var
void main
Referinte independente
O referinta care este doar o simpla variabila este numita referinta independenta.
#include<iostream>
using namespace std
void main
NOTĂ: referinta independenta este de mica valoare practica deoarece ea este de fapt doar un alt nume aceeasi variabila. Avānd doua nume care descriu acelasi obiect programul poate deveni confuz.
RESTRICŢII:
o referinta nu poate referi alta referinta
nu se pot crea matrice de referinte
nu se poate crea un pointer spre o referinta
nu se pot face referinte la cāmpuri de biti
ATENŢIE:
o referinta trebuie initializata la declarare
o referinta poate sa nu fie declarata daca este membru al unei clase, parametru de functie sau o valoare returnata
Operatorii de alocare dinamica
Operatorul delete elibereaza memoria alocata īn heap de new.
p_var = new tip;
delete p_var;
|