Scrigroup - Documente si articole

     

HomeDocumenteUploadResurseAlte limbi doc
AccessAdobe photoshopAlgoritmiAutocadBaze de dateCC sharp
CalculatoareCorel drawDot netExcelFox proFrontpageHardware
HtmlInternetJavaLinuxMatlabMs dosPascal
PhpPower pointRetele calculatoareSqlTutorialsWebdesignWindows
WordXml


Operatori

c



+ Font mai mare | - Font mai mic



Operatori

1. Operatorul de rezolutie

Daca o data globala se redefineste intr-o functie, atunci referirea la data globala se poate face cu ajutorul operatorului de rezolutie. Numele datei globale trebuie precedata de caracterele ::, deci de operatorul de rezolutie.

Prezentam in continuare un exemplu. Fisierul rezol.cpp:



#include <iostream.h>

#include <conio.h>

int x = 65;

int main()

Dupa executie se obtine:

Variabila globala: 65

Variabila locala: A

Deci se observa ca referirea la variabila globala x de tip int s-a facut cu ajutorul operatorului de rezolutie (::x ). Mentionam ca operatorul de rezolutie se va folosi si in cazul in care se face referire la datele respectiv functiile membru ale unei clase.

2. Folosirea operatorului adresa pentru definirea tipului referinta

In limbajul C operatorul & se foloseste pentru a determina adresa unei variabile. In limbajul C++ acest operator mai este folosit si pentru definirea tipului referinta. Am vazut ca in cazul pointerilor constructia


reprezinta un tip pointer. La fel si in cazul de fata prin


se va intelege un tip referinta. Cu ajutorul tipului referinta putem defini nume alternative pentru date deja cunoscute. Aceste nume alternative pot fi utilizate in continuare in locul datelor respective. Deasemenea acest tip de date se va folosi si pentru realizarea apelului prin referinta in limbajul C++.

Daca se foloseste ca si parametru formal intr-o functie, atunci tipul referinta va fi de forma:

tip & parametru_formal

iar declararea unei variabile de tip referinta se va face sub forma

tip & nume = data;

Exemplu. Fisierul refer1.cpp

#include <iostream.h>

#include <conio.h>

void afiseaza(int x[], int y, int* z)

int main() ;

int& y = x[0]; // y este referinta la primul element

// al vectorului x

int* z = x; // z este pointer catre vectorul x

afiseaza(x, y, z);

y = 50;

afiseaza(x, y, z);

*z = 60;

afiseaza(x, y, z);

return 0;

}

Prin executie se obtine:

x[0] = 10 y = 10 *z = 10

x[0] = 50 y = 50 *z = 50

x[0] = 60 y = 60 *z = 60

Observam ca aceeasi zona de memorie este accesata in trei feluri. Primul element al vectorului x este x[0], y este referinta la acest element, deci un nume sinonim pentru x[0], iar z este un pointer catre vectorul x, astfel *z reprezentand acceasi zona de memorie ca si x[0]. Rezulta ca valoarea oricarei dintre aceste trei elemente s-ar schimba, valorile celorlalte se schimba in mod automat.

Exista posibilitatea definirii unei referinte si la o functie. Acest lucru este prezentat in exemplul urmator. Fisierul refer2.cpp

#include <iostream.h>

#include <math.h>

#include <conio.h>

typedef double TipFunctie(double);

int main()

In exemplul de mai sus s-a declarat o referinta la functia standard de biblioteca sin, deci numele sinus poate fi folosit in locul functiei sin pentru a calcula sinusul unui numar real.

Tipul referinta este cel mai des folosit pentru realizarea apelului prin referinta, ceea ce se trateaza in paragraful urmator.

3. Apelul prin referinta

In limbajul C apelul este prin valoare. Acest lucru inseamna ca parametrii actuali si cei formali sunt memorate in diferite locatii de memorie. La apelarea functiei parametrii actuali isi transmit valoarea lor parametrilor formali corespunzatoare. De aceea modificarea parametrilor formali nu are nici un efect asupra parametrilor actuali. Urmatorul exemplu scris in limbajul C ilustreaza acest lucru. Fisierul valoare1.cpp

#include <stdio.h>

#include <conio.h>

void nu_modifica( int x )

// se mareste cu 20

int main ()

Constatam ca intr-adevar parametrul actual y nu se modifica, si programul afiseaza valoarea 10.

Totusi si in limbajul C se poate realiza modificarea parametrilor actuali, cu ajutorul pointerilor. Acest lucru este prezentat in urmatorul exemplu.

Fisierul valoare2.cpp

#include <stdio.h>

#include <conio.h>

void modifica( int *x ) // parametrul formal x este un

// se mareste cu 20

int main ()

In exemplul de mai sus s-a realizat modificarea valorii parametrului actual y, dar si in acest caz s-a folosit de fapt apel prin valoare. S-a transmis valoarea adresei lui y pointerului x. Deci prin intermediul pointerilor apelul prin valoare s-a transformat in apel prin referinta. Mentionam ca numele unui vector de elemente este un pointer catre primul element al vectorului. In consecinta, daca un parametru actual este un vector, atunci valorile elementelor acestui vector pot fi modificate in interiorul functiei.

Aceasta modalitate de realizare a apelului prin referinta, prin intermediul pointerilor, de multe ori ingreuneaza munca programatorului, de aceea in limbajul C++ s-a introdus si apelul prin referinta propriu zis.

Apelul prin referinta se realizeaza cu ajutorul tipului referinta. In cazul folosirii tipului referinta parametrul formal este un nume alternativ pentru parametrul actual, deci ele reprezinta aceeasi zona de memorie si ca atare orice modificare a parametrului formal conduce la modificarea parametrului actual corespunzator. Iata cum se modifica exemplul de mai sus folosind apelul prin referinta. Fisierul refer3.cpp

#include <iostream.h>

#include <conio.h>

void modifica( int& x ) // parametrul formal x este o

// se mareste cu 20

int main ()

Putem constata ca apelul prin referinta este mult mai simplu de utilizat, decat realizarea ei prin intermediul pointerilor.

4. Operatori pentru alocare si dezalocare dinamica a memoriei

Pentru alocare si dezalocare de memorie in limbajul C pot fi folosite functiile malloc si free. In limbajul C++ exista si operatori pentru realizarea acestui lucru.

Alocarea memoriei se poate face folosind operatorul new, in unul din urmatoarele trei moduri:

a)        new tip

b)        new tip(expresie_1)

c)        new tip[expresie_1]

In toate cele trei cazuri constructiile de mai sus formeaza o expresie pe care o vom nota cu expresie_2. Valoarea expresiei expresie_2 este egala cu adresa de inceput a zonei de memorie alocate, si este zero in cazul unei erori.

In cazul a) se aloca zona de memorie pentru o variabila de tipul exprimat prin tip. In cazul b) zona de memorie alocata se initializeaza cu valoarea expresiei expresie_1, iar in cazul c) se aloca memorie un numar de expresie_1 de zone de memorie de tipul mentionat. Deci in cazul a) si b) se vor aloca un numar de sizeof(tip) octeti, iar in cazul c) expresie_1 * sizeof(tip) octeti.

In tabelul 1 prezentam trei exemple de secvente de programe echivalente, in care se foloseste operatorul new in diferite moduri.

Eliberarea zonei de memorie alocate cu operatorul new se va face cu ajutorul operatorului delete. Sa consideram pointerul q pentru care s-a alocat memorie folosind operatorul delete.

Daca alocarea zonei de memorie s-a facut cu una din variantele a) sau b) atunci dezalocarea se va face in forma:

delete q;

iar daca alocarea s-a facut prin varianta c) atunci eliberarea zonei de memorie se va face cu

delete [expresie_1] q;

unde expresie_1 este expresia care s-a folosit la alocare. De obicei ea poate sa lipseasca.

Nr. crt.

C++

C sau C++

double* d;

d = new double;

double *d;

d = (double *) malloc(sizeof(double));

int* i;

i = new int(20);

int* i;

i = new int;

*i = 20;

double* p;

p = new double[10];

d = (double *) malloc(10 * sizeof(double));

Tabelul 1: folosirea operatorului new



Politica de confidentialitate | Termeni si conditii de utilizare



DISTRIBUIE DOCUMENTUL

Comentarii


Vizualizari: 852
Importanta: rank

Comenteaza documentul:

Te rugam sa te autentifici sau sa iti faci cont pentru a putea comenta

Creaza cont nou

Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved