CATEGORII DOCUMENTE |
Extensii ale limbajului C++
Declararea datelor
Operatiile de I/O in C++
Alocarea dinamica de memorie
Focilitati noi pentru functii
Tipul de data referinta
In limbajul C standard declararea datelor se face la
inceputul programului.
Limbajul C++ ofera posibilitatea declararii variabilelor oriunde in program ,
cu mentiunea ca o variabila trebuie declarata inainte de a fi folosita.
cout, cin si cerr
In
analogie cu C, C++ defineste obiecte pentru citirea respectiv afisarea datelor
de la driverele de intrare si iesire care sint deschise cind un program este
executat. Obiecteele sint:
cout, analog cu stdout (iesirea
standard)
cin, analog cu stdin (intrarea standard)
cerr, analog cu stderr (pentru erori).
Sintactic, aceste obiectee nu sint folosite cu functii: datele sint citite sau
scrise prin intermediul operatorilor << si >> (operatorii sint
redefiniti fata de C, unde aveau semnificatie de deplasare la nivel de bit,
pastrinduse totodata si acesta proprietate).
#include <iostream.h>
void main()
Programul
citeste un numar si un sir cu cin (de
obicei tastatura) si afiseaza aceste date pe cout (monitor). Putem face
urmatoarele observatii:
. Obiectele sint declarate in headerul iostream.h
. Obiectele cout, cin si cerr sint instante ale unei clase care proceseaza
intrarea si iesirea unui program.
. Obiecteul cin citeste datele si copie informatiile in variabile folosind
operatorul >> (deplasare dreapta). Vom descrie mai tirziu cum pot fi
(re)definite actiunile operatorilor in C++, altfel decit actiunea lor
implicita.
. Operatorii ce manipuleaza cin, cout si cerr (adica >> si << )
manipuleaza in acelasi timp si variabile de diferite tipuri. Actiunea lor
depinde in final de tipul datelor.
Obiectele cin, cout si cerr nu fac parte din gramatica lui C++, asa cum este ea
definita de compilatorul ce parseaza fisierul sursa. Definitiile lor apar doar
in fisierul header iostream.h. In acelasi timp, se pot folosi si vechile
functii printf() si scanf(); (e o chestiune de gust). Exista insa niste
avantaje si dezavantaje:
. Comparat cu functiile standard C, printf () si scanf (), folosirea
operatorilor << si >> impreuna cu obiecteele corespunzatoare este
mult mai sigura in ceea ce priveste tipul datelor (formatul lor este descris de
programator in primul caz si este recunoscut de compilator in cel de-al doilea)
. Functiile printf () si scanf (), precum si alte functii ce folosesc formatul
explicit, implementeaza in fond un mini-limbaj care este interpretat numai la
executie. Din contra, compilatorul C++ cunoaste exact ce actiune de
intrare/iesire trebuie sa efectueze.
. Folosirea operatorilor << si >> ilustreaza posibilitatile lui
C++, insa nu imbunatatesc lizibilitatea programului.
Alocarile
dinamice de memorie in C++ se fac cu ajutorul operatorilor :
new corespunzator
functiilor C malloc() si calloc()
delete corespunzator functiei free()
Sintaxa
operatorilor:
new tip;
new tip(constanta);
new tip [dimensiune1].[dimensiune2];
delete adresa( nume pointer);
Se fac urmatoarele declaratii de pointeri:
int* p_i;
float* p_r;
char* p_c;
// se initializeaza variabilele de tip pointer declarate anterior
p_i=new int;
p_r=new char;
p_c=new float;
delete p_i,p_r,p_c;
// sau se pot reinitializa voriabilele pointer
p_i=new int(2);
p_r=new char('a');
New
- aloca in memoria HEAP egala ca dimensiune in octeti cu sizeof(tip) si
returneaza adresa memoriei alocate.
In cazul instructiunilor:
- p_i=new int(9) acesta zona de memorie este si initializata cu valoarea
trecuta in parantezele rotunde.
- p_i=new int[10] se aloca o zona de memorie egala cu 10* sizeof(int).
delete
- elibereaza o zona de memorie referita prin adresa care urmeaza dupa
operatorul delete.
- delete p_i; elibereaza zona de memorie referita de pointerul p_i.
Functii
cu parametrii impliciti
Sint functii ai caror parametrii pot fi initializati in declaratia de functie
cu valori.
void functie(int x=123,float y=2.3, char
z='M')
Apelul functiei se poate face dupa cum urmeaza:
functie();
functie(22);
functie(22,4.5)
functie(22,4.5,'s');
Atunci cind pentru o functie cu parametrii impliciti nu se trensmit valori in momentul apelului, valorile luate de parametrii functiei sint cele implicite.
Observatie: O functie poate avea un numar de parametrii impliciti mai mic decit numarul total al parametrilor, caz in care parametrii impliciti vor fi intotdeauna ultimii in declaratia de functie.
Functii inline
Pentru a specifica o functie inline se trece cuvintul cheie inline inaintea declaratiei de functie.
In momentul apelului de functie, nu se mai creaza un cadru de stiva pentru functia respectiva, si se inlocuieste apelul de functie cu corpul functiei.
Se recomanda folosirea specificatia inline in cazul functiilor foarte scurte (2-3 instructiuni).
Compilatoarele moderne trateaza automat functiile cu numar mic de instructiuni ca si functii inline, chiar daca nu exista specificatia inline pentru functia respectiva.
Functii supraincarcate sau supradefinite
Functiile supraincaracate sint functii cu acelasi nume dar care difera prin tipul, numarul sau ordinea parametrilor formali.
De exemplu:
void suma(int , int) ;
void suma(float , float);
void suma(double , complex);
la apelul functiei suma distinctia intre diferitele implementari ale acesteia se va face functie de tipul parametrilor efectivi.
Obs: Nu se considera functii diferite doua functii care difera doar prin tipul intors de functie.
In
afara de declaratiile normale de variabile, C++ permite lucrul cu un nou tip de
data specific referinta. Referintele sint declarate ca sinonime ale unor variabile. O referinta catre o variabila
este ca un pseudonim: numele variabilei si numele referintei pot fi folosite in
instructiuni ce afecteaza variabila:
int intreg;
int &ref = intreg;
In acest exemplu variabila intreg este definita initial, apoi este definita si
referinta ref care conduce la initializarea adresei sale cu adresa variabile
intreg. In definitia lui ref, operatorul de referinta & indica faptul ca
ref nu este el insusi un intreg, ci o referinta la un intreg. Urmatoarele
instructiuni
intreg++;
ref++;
au acelasi efect. La aceeasi locatie de memorie o valoare int este incrementata
cu unu; nu conteaza cum este numita locatia.
Referintele joaca un rol important in C++ ca un mijloc de a pasa argumente ce
pot fi modificate .De exemplu, in C standard, o functie ce incrementeaza
valoarea argumentului sau cu 5 dar nu returneaza nimic (void), necesita un
argument pointer:
void increase (int *valp) // asteapta
un pointer la un intreg
void main()
Aceasta constructie poate fi folosita si in C++, dar acelasi efect poate fi obtinut cu o referinta:
void increase (int &valr)
// asteapta o referinta la un intreg
void main()
Modul
in care compilatorul C++ implementeaza referintele reprezinta de fapt o simpla
utilizare de pointeri. Sugestiile ce pot fi date pentru folosirea referintelor
ca argumente sint urmatoarele:
. In acele situatii in care un apel de functie nu modifica argumentele sale, se
poate pasa o copie a variabilelor:
void nume_func (int val)
void main()
. In situatia in care functia schimba valoarea argumentelor, va fi pasata adresa:
void increase (int * valp)
void main()
. Referintele pot fi rezervate pentru acele cazuri in care argumentul nu este schimbat de functie, dar unde este preferabil sa folosesti o referinta (pointer de fapt) catre variabila decit o copie a varibilei. Aceste situatii apar atunci cind trebuie pasata o variabila de mari dimensiuni (struct) ; stiva creste foarte mult prin folosirea unei copii a variabilei:
struct
person
// structura cu dimensiune mare
;
void printperson (person
&p) // functia cere o
referinta la o structura
void main()
O
imbunatatire se poate aduce folosind cuvintul const:
void printperson (person const &p)
. (Mai exista un motiv pentru folosirea referintei pentru pasarea unui obiect
ca argument pentru o functie: in aceste caz activarea unei copii a
constructorului obiectului este evitata. Amanunte mai tirziu).
Referintele pot duce de asemeni la aparitia unui cod mai dificil de citit. O
functie, de exemplu, poate intoarce o referinta la o variabila, ca in exemplul
urmator:
int &func (void)
permitind urmatoarele constructii:
func () = 20;
func () += func ();
In final, evidentiem citeva diferente intre pointeri si referinte:
O referinta nu poate exista prin ea insasi, adica fara a face referire la ceva. O declaratie de forma int &ref; nu este permisa (la cine refera ref ?). Exceptii sint cele declarate external (se presupune ca ele sint initializate in alta parte), cele cuprinse in listele de argumente ale unei functii (apelul va face initializarea), referintele ca tip returnat de o functie (functia va determina la ce valoare va face referire) si referintele ce fac parte ca date dintr-o clasa (descrise mai tirziu). In contrast, pointerii sint variabile in sine. Ei pointeaza fie la ceva concret, fie la nimic.
Cu exceptia cazului referintelor reprezentind valoarea returnata de o functie, referintele sint pseudonime pentru alte variabile si nu pot fi 'redirectionate' catre alte variabile. Odata referinta definita, ea se refera strict la acea variabila. Din contra, pointerii pot fi oricind reasignati.
Cind un operator adresa & este folosit asupra unei referinte, expresia va contine adresa variabilei la care se refera referinta. Din contra, pointerii fiind ei insisi variabile, adresa lor nu va avea nici o legatura cu adresa variabilei pointate.
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 808
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved