Scrigroup - Documente si articole

     

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


Introducere in C++ - Extensii ale limbajului C++

c



+ Font mai mare | - Font mai mic



Introducere in C++

Extensii ale limbajului C++



Declararea datelor

Operatiile de I/O in C++

Alocarea dinamica de memorie

Focilitati noi pentru functii

Tipul de data referinta

1.1 Declararea datelor

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.

1.2 Operatiile de I/O in C++

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.

1.3 Alocare dinamica de memorie

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.

1.4 Facilitati noi pentru functii

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.

1.5 Referinte

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



DISTRIBUIE DOCUMENTUL

Comentarii


Vizualizari: 818
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