Documente online.
Zona de administrare documente. Fisierele tale
Am uitat parola x Creaza cont nou
 HomeExploreaza
upload
Upload




Matrice, pointeri si referinte

Informatica


Matrice, pointeri si referinte

Initializarea obiectelor cu un singur paramteru in matrici

#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Ă AL POINTERULUI. Asadar, un pointer la tipul de baza ce indica la un tip derivat, prin incrementare va indica spre urmatorul obiect de tip baza si nu spre urmatorul tip derivat.

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;


Document Info


Accesari: 4611
Apreciat: hand-up

Comenteaza documentul:

Nu esti inregistrat
Trebuie sa fii utilizator inregistrat pentru a putea comenta


Creaza cont nou

A fost util?

Daca documentul a fost util si crezi ca merita
sa adaugi un link catre el la tine in site


in pagina web a site-ului tau.




eCoduri.com - coduri postale, contabile, CAEN sau bancare

Politica de confidentialitate | Termenii si conditii de utilizare




Copyright © Contact (SCRIGROUP Int. 2024 )