Sunteți pe pagina 1din 4

Capitolul 2 - Clase şi obiecte

E2.3 Pentru reprezentarea unui aparat de înregistrare se poate defini clasa Contor astfel:

#include <iostream.h>
class Contor{
int sute, zeci, unitati;
public:
Contor(int s, int z, int u) // Constructor
{ sute = s; zeci = z; unitati = u;}
void avans();
void display(){
cout << "Sute: "<< sute << " Zeci: "
cout << zeci << " Unitati: " << unitati << endl;
}
};
void Contor::avans(){
unitati++;
if (unităţi > 9){
zeci++;
if (zeci > 9){
sute++;
if (sute > 9){
sute=0;
zeci = 0;
unitati = 0;
}
}
}
}
void main (){
Contor C1(9,7,2);
C1.display();
for (int i=0;i<5;i++)
C1.avans();
C1.display();
}

Mesajul la consolă este:


Sute: 9 Zeci: 7 Unitati: 7
Nu este necesară definirea unui destructor, deoarece este suficient destructorul implicit
pentru eliberarea zonei de memorie, neexistând variabile alocate dinamic.

E2.4 Mesajele sunt:

Nr. obiecte 1
Nr. obiecte 2
Nr. obiecte 3
Nr. obiecte 4
Nr. obiecte 5
Nr. obiecte 4
Nr. obiecte 3
Nr. obiecte 4
Nr. obiecte 5
Nr. obiecte 6
Nr. obiecte 5
Nr. obiecte 4
Nr. obiecte 3
Nr. obiecte 2
Nr. obiecte 1
Nr. obiecte 0

Primele trei obiecte (ob1, ob2, ob3) sunt create la începutul funcţiei main(). La
intrarea blocul nou creat se mai crează 2 obiecte (ob4 şi ob5) (deci numărul de obiecte ajunge la
5), care sunt imediat distruse la ieşirea din bloc. După aceasta se crează un vector de 3 obiecte,
care sunt distruse prin aplelul operatorului delete. La ieşirea din funcţia main() se distrug şi
cele 3 obiecte rămase, ob1, ob2, ob3.

E2.5 Programul modificat este:

#include <iostream.h>
class Item{
static int numbers; // (a)
public:
Item(){ // constructorul creste cu 1 nr obiectelor
numbers++;
cout << "Nr. obiecte " << numbers << endl;
}
~Item(){ //destructorul descreste cu 1 nr obiectelor
numbers--;
cout << "Nr. obiecte " << numbers << endl;
}
};
int Item::numbers = 0; // (b)
void main(){
Item ob1, ob2, ob3;
{ // se deschide un nou bloc
// un nou domeniu de vizibilitate
Item ob4, ob5;
}
Item *pob6 = new Item[3];
delete [] pob6;
}

Se remarcă următoarele modificări notate (a) şi (b):


(a) numbers este declarat membru static al clasei Item.
(b) numbers este definit şi iniţializat în altă parte în program, în afara clasei.

E2.6 (a) Mesajul afişat la consolă este:

11 22 33 44

(b) Modificarea pointerilor p şi p1, urmată de ştergerea lor cu delete produce eroare
de execuţie, deoarece se încearcă eliberarea altei zone de memnorie decât cea alocată.
E2.7 Funcţiile de inserare şi eliminare a unui element în vectorul clasei IntArray sunt:

int IntArray::InsertAt(int i, int x){


if (i < 0 || i > count)
return 0; // eroare de inserare
else {
if (i == count) Add(x);
else {
if (count < size){
for (int j= count; j > i;j--)
p[j] = p[j-1];
p[i] = x;
count++;
}
else {
int *p1 = p;
p = new int[count + grows];
for (int j=0; j < i;j++)
p[j] = p1[j];

p[i] = x;
for (j=i; j < count;j++)
p[j+1] = p1[j];
delete p1;
count++;
}

}
return 1;
}
}
int IntArray::RemoveAt(int i) {
if (i < 0 || i >= count)
return 0;
else {
for(int j=i; j < count-1;j++)
p[j] = p[j+1];
count--;
return 1;
}
}

Modificarea vectorului din problema precedentă se obţine astfel:

void main() {
IntArray array1;
array1.Add(11);
array1.Add(22);
array1.Add(33);
array1.Add(44);
array1.Add(55);
array1.InsertAt(2,0);
array1.RemoveAt(4);
int val;
int count = array1.GetCount();
for (int i=0;i<count;i++){
array1.GetAt(i,&val);
cout << val << " ";
}
cout << endl;
}

Mesajul la consolă este: 22 0 33 55.

E2.8 La apelul funcţiei fint()programul dă eroare de execuţie, deoarece se transmite un


argument de apel prin valoare care se copiază în varabila locală corespunzătoare. Eroarea apare
datorită copierii membru cu membru a unui obiect de clasă IntArray care conţine date alocate
dinamic. Soluţia corectă este de a se defini un constructor de copiere al clasei IntArray, astfel:

IntArray::IntArray(IntArray &r){
count = r.count;
grows = r.grows;
size = r.size;
p = new int[size];
for (int i = 0; i < count; i++)
p[i] = r.p[i];
}

E2.9 Este necesar ca unele funcţii membre ale clasei să acceseze obiecte declarate constant.
Deci sunt necesare următoarele modificări:

int GetCount() const {return count;}


int GetAt(int i) const;

S-ar putea să vă placă și