2.7. Func?ii inline

2.4. Alocarea dinamic? a memoriei ?n C++

2.4. Alocarea dinamic? a memoriei ?n C++

?n C++ a fost ad?ugat un mecanism propriu de alocare dinamic? a memoriei, ?n plus la cel de la C. Acest mecanism este realizat prin operatorii new ?i delete. El este mai comod ?i mai laconic dec?t predecesorul s?u.

Operatorul new poate avea una din urm?toarele trei forme:

new tip
new tip(expresie)
new tip[expresie]


?n cea mai simpl? form? operatorul new aloc? memorie din zona de memorie dinamic? heap pentru o variabil? de tipul tip ?i ?ntoarce adresa memoriei alocate ca rezultat. Dac? ?n heap nu este memorie liber? suficient?, operatorul new nu va aloca memorie ?i va ?ntoarce valoarea NULL. De obicei, ?n program adresa returnat? de c?tre operatorul new se atribuie unei variabile-pointer cu tipul de baz? tip. Exemple:

   int *pi;
   pi = new int;
   double *pd = new double;


Folosind mecanismul lui C, acela?i lucru ?n C++ poate fi f?cut cu func?ia malloc astfel:

   int *pi;
   pi = (int *) malloc (sizeof *pi); // sau sizeof (int) 
   double *pd = (double *) malloc (sizeof *pd);
//?n plus, trebuie s? conect?m unul din fi?ierele antet "alloc.h" 
//sau "stdlib.h". 
//Dac? la ambele fragmente vom ad?uga:
   *pi = 24;
   cout << "*pi = " << *pi << endl;
   *pd = 2.52;
   cout << "*pd = " << *pd << endl;
?n ambele cazuri va fi afi?at:
*pi = 24
*pd = 2.52


?n fragmentul ad?ugat endl ?nseamn? trecerea la urm?toarea linie, exact acela?i lucru ca ?i ’\n’.
A doua form? a operatorului new ne permite s? unim alocarea ?i ini?ializarea astfel:

   int *pi;
   pi = new int(24);
   double *pd = new double(2.52);
   cout << "*pi = " << *pi << endl;
   cout << "*pd = " << *pd << endl;


Va fi afi?at acela?i rezultat.

Pentru simplicitate, ?n exemplele precedente nu s-a verificat dac? alocarea memoriei a fost reu?it?. Acest lucru poate fi f?cut ?n mod obi?nuit prin compararea pointerului dup? executarea operatorului new. De exemplu:

   int *pi;
   if( !(pi = new int(24)) )
   {
      cerr << "Eroare de alocare pentru pi\n";
      exit(1);
   }
   cout << "*pi = " << *pi << endl;
   if( double *pd = new double(2.52))
   {  // pointerul pd va fi vizibil numai ?n acest bloc
      cout << "*pd = " << *pd << endl;
      *pd=3.14;
      cout << "*pd = " << *pd << endl;
   }
   else
   {
      cerr << "Eroare de alocare pentru pd\n";
      exit(1);
   }
Dac? ?n ambele cazuri alocarea nu a e?uat, pe ecran va fi afi?at:
*pi = 24
*pd = 2.52
*pd = 3.14


Pentru func?ia exit() am conectat, desigur, "stdlib.h".

A treia form? a operatorului new ne permite s? aloc?m dinamic memoria pentru matrice (vectori). Prin [expresie] indic?m num?rul de elemente de tipul tip pentru care va fi alocat un bloc de memorie consecutiv? din heap. Operatorul new va ?ntoarce adresa primului element, sau NULL, dac? nu este suficient? memorie liber? ?n heap. ?n cazul matricelor, ini?ializarea trebuie s? fie f?cut? aparte. Cercet?m urm?torul exemplu:

   int *v = new int[5]; // aloc?m dinamic un vector din 5
                        // elemente ?ntregi 
   if( !v )
   {
      cerr << "Eroare de alocare pentru vector\n";
      exit(1);
   }
   int i;
   for(i=0; i < 5; i++)
      *(v+i)=i+1; // ini?ializarea elementelor, sau v[i]=i+1;                  
   for(i=0; i < 5; i++)
      cout << v[i] << ” ”; // afi?area elementelor
   cout << endl;
Va fi afi?at:
1 2 3 4 5


Memoria alocat? dinamic dup? utilizare trebuie eliberat? cu operatorul delete.

Operatorul delete poate avea una din urm?toarele dou? forme:

delete pointer
delete []pointer

Pentru a elibera memoria dup? utilizarea ei, ?n exemplele precedente cu new ad?ug?m respectiv:

   delete pi;
   delete pd;
   delete []v;


Atragem aten?ia c? delete cu [] se aplic? la pointeri care au ob?inut valoarea prin new cu []. ?n exemplul cu malloc() eliber?m memoria cu free():

   free(pi);
   free(pd);


Operatorul delete ?ntoarce valoarea void, de aceea el poate fi folosit ?n expresii numai cu operatorul , (virgul?), cum ar fi:

 delete pi, delete pd;


?n mod normal, operatorul delete se aplic? numai la pointeri care con?in adresa ob?inut? preventiv cu new, altfel rezultatul nu este prev?zut ?i poate crea probleme serioase, cum ar fi blocarea programului.

Nu se recomand? combinarea celor dou? mecanisme (C ?i C++) de alocare a memoriei ?ntr-un program; adic?, dac? un bloc de memorie a fost alocat cu new, el trebuie s? fie eliberat cu delete, iar dac? blocul a fost alocat cu malloc(), el trebuie s? fie eliberat cu free(). Altfel func?ionarea corect? a programului nu este garantat?.
_________________________
Autorul: dr.conf. S. Pereteatcu

2.3. Forma general? a programului ?n C++

2.3. Forma general? a programului ?n C++

Structura programului scris ?n C++ depinde de cerin?ele firmei concrete ce elaboreaz? softul. Pentru ?ncep?tori poate fi recomandat? urm?toarea form? general?:

#include …
#include …#include …
declara?ii_clase_de_baz?
declara?ii_clase_derivate
prototipul_func?iei_nemembre_1
prototipul_func?iei_nemembre_2
…
prototipul_func?iei_nemembre_n
void main()
{}
defini?ia_func?iei_nemembre_1
defini?ia_func?iei_nemembre_2
…
defini?ia_func?iei_nemembre_n


Programatorii mai avansa?i pun declara?iile claselor, at?t de baz?, c?t ?i derivate, ?n fi?iere antet, pe care apoi le includ dup? necesitate ?n programele sale.
_________________________
Autorul: dr.conf. S. Pereteatcu

2.Bazele C++

2.2. Cuvinte-cheie ?n C++

?n C++ au fost ad?ugate cuvinte-cheie noi ?n plus la cele 32 de cuvinte-cheie ale limbajului C.

 

?n calitate de cuvinte-cheie ?n C++ se folosesc toate cuvintele-cheie ale limbajului C la care se mai adaug?: asm, bool, catch, class, const_cast, delete, dynamic_cast, explicit, false, friend, inline, mutable, namespace, new, operator, overload, private, protected, public, reinterpret_cast, static_cast, typename, template, this, throw, true, try, typeid, using, virtual, wchar_t

Fiecare cuv?nt-cheie are destina?ie special? ?i nu poate fi folosit cu alte scopuri dec?t cu cele care sunt prescrise ?n C++.

Lista cuvintelor-cheie este ?n permanent? dezvoltare. ?n aceast? list? sunt cuvinte deja ?nvechite, care au fost l?sate numai pentru compatibilitatea cu versiunile mai vechi ale limbajului C++, sunt cuvinte rar utilizate, cu timpul vor ap?rea cuvinte-cheie noi. Utilizarea celor mai importante dintre cuvintele-cheie ad?ugate ?n C++ va fi explicat? pe parcursul descrierii.

___________________________________
Autorul: dr.conf. S. Pereteatcu

2.1. C++ ca dezvoltare a limbajului C

2.1. C++ ca dezvoltare a limbajului C

La ?nceputul anilor '80, limbajul C a fost esen?ial dezvoltat de c?tre Bjarne Straustrup – un t?n?r cercet?tor de la aceea?i firm? Bell Lab's unde a lucrat ?i autorul limbajului C, Dennis Ritchie. Bjarne Straustrup a introdus ?n C no?iunea de clas? (adic?, lucrul cu obiecte), no?iunea de referin?e (&), supra?nc?rcarea func?iilor ?i operatorilor etc. Aceste no?iuni importante i-au dat lui Bjarne Straustrup dreptul de a modifica denumirea limbajului C. La ?nceput, limbajul se numea „C cu clase”.

Apoi (mai precis, ?n 1983) denumirea a fost schimbat? ?n C++, provenind de la vestitul operator de incrementare ++ din limbajul C (?n sens c? la C a mai fost ceva ad?ugat). Unii dintre cei care cuno?teau bine limbajul C glumeau c? mai corect? ar fi denumirea ++C, fiindc? postincrementarea C++ ?nseamn?: „mai ?nt?i folosim ?i apoi increment?m”. Totu?i, denumirea definitiv? a fost stabilit? C++.

O versiune de „primul meu program” ?n C++ (fi?ierul hello.cpp) arat? astfel:

// Programul merge numai in C++
#include  <iostream.h>  
#include  <conio.h> 
void main()
{
clrscr();
cout << "Hello, World!\n"; // afi?area unui mesaj de salutare   
char c;    
cin >> c; // se a?teapt? ap?sarea unei taste ?i Enter
}


Prima linie din acest program este o form? suplimentar? de a scrie comentariile  ?n  C++  fa??  de C. Comentariul nou ?ncepe cu caracterele // ?i tinde spre sf?r?itul liniei. Comentariul de acest tip poate ?ncepe din orice pozi?ie a liniei, dup? cum este ar?tat ?n acest mic program.

Fi?ierul antet <iostream.h> este inclus pentru conectarea bibliotecii standard din C++ de intrare/ie?ire, fiind ?n opozi?ie bibliotecii din C care se conecteaz? cu ajutorul fi?ierului antet <stdio.h>.

cout – este streamul standard de ie?ire, provine de la ConsolOUTput, corespunde streamului stdout din C. A?a c? expresia cout << "Hello, World!\n" trimite textul din ghilimele ?n streamul standard de ie?ire.

Acum este clar rezultatul acestui program mic.

cin – este streamul standard de intrare, provine de la ConsolINput, corespunde streamului stdin din C. A?a c? expresia cin >> c cite?te ?n variabila c un caracter din streamul standard de intrare. ?i dac? ?n acest stream nu este niciun caracter, programul se opre?te ?n a?teptare p?n? ce un caracter oarecare nu va fi introdus.

?n principiu, toate posibilit??ile limbajului C s-au p?strat ?i ?n limbajul C++ pentru compatibilitate; astfel, vom re?ine acest fapt.

_________________________
Autorul: dr.conf. S. Pereteatcu

Translate Переводчик

Подписка на новости

SmartResponder.ru
Ваш e-mail: *
Ваше имя: *

Хостинг для Wordpress сайтов