Documente Academic
Documente Profesional
Documente Cultură
Laborator nr. 3
Laborator 3
Suprancrcarea operatorilor (prile II i III)
Exemplu 1:
Consideram clasa sir, in care fiecare obiect retine adresa unui sir
de caractere. Astfel, data membru adr retine adresa unui pointer care
sir, iar sirul va fi alocat cu operatorul new intr-o zona de memorie
disponibila. Clasa va avea un constructor care aloca spatiu de memorie pentru sirul de
caractere, un destructor care elibereaza zona de memorie alocata unui sir de caractere, o
metoda afis() folosita pentru afisarea sirului si o metoda de copiere realizata prin
supraincarcarea operatorului =.
Aceasta metoda are rolul ca la o atribuire a = b, unde a si b sunt obiecte de tip sir:
sa elibereze memoria retinuta de sirul de caractere a carui adresa o contine data
membru adr a lui a;
sa aloce spatiu pentru sirul retinut de b
sa copieze sirul retinut de b in acest spatiu de memorie
Dupa aceasta operatie, sirul care era initial retinut numai b este alocat in doua locuri
diferite in memoria disponibila, iar pointerii catre cele doua locuri sunt retinuti de datele
membru ale obiectelor a si b.
#include<iostream.h>
#include<conio.h>
#include<string.h>
class sir{
char *adr;
public:
sir(char s[]);
~sir();
void afis();
void operator=(sir& sirul);
};
sir::sir(char s[])
{
cout<<"Constructor"<<endl;
adr = new char[strlen(s) + 1];
strcpy(adr,s);
}
sir::~sir()
{
cout<<"Destructor"<<endl;
delete [] adr;
adr = 0;
Exemplu 2:
#include<iostream.h>
#include<stdlib.h>
struct elem{
int inf;
elem *adr;
// se initializeaza camp inf cu n
elem(int n, struct elem *p): inf(n),adr(p){}
};
class list{
elem *prim,*p;
public:
// functie de afisare element curent
void afispoz()
{ cout<<"Elementul de pe pozitia curenta are valoarea "<<p->inf<<endl;}
//primul element va avea adresa absoluta zero
list(void) {prim=NULL;};
//crearea listei care va avea un numar dat de elemente
list(int);
// supraincarcarea operatorului realizeaza pozitionarea la nodul urmator;
// Daca pozitia curenta este la sfarsitul listei, atunci nodul urmator va fi primul element al listei
elem *operator() ();
// supraincarcarea operatorului determina avansarea nodului curent cu un numar dat de pozitii
elem *operator() (int);
};
list::list(int nr)
{
int inf;
if(nr<=0)
{ cout<<"Eroare la initializarea listei!";exit(1);}
cout<<endl<<"Introduceti "<<nr<<" valori ";cin>>inf;
prim=new elem(inf,NULL);
elem*q=prim;
for(int i=1;i<nr;i++)
{
cin>>inf;
p=new elem(inf,NULL);
q->adr=p;
q=p;
}
p=prim;
}
elem *list::operator() ()
{
elem *poz=p;
poz=p->adr ? p->adr : prim;
return p=poz;
}
elem *list::operator() (int nr)
{
}
int main()
{
list l(6);
l();
l.afispoz();
l(2);
l.afispoz();
}
Exemplu 3:
#include<iostream.h>
#define PI 3.14159265358979
class complex
{
// date membru protejate(private)
double real;
double imag;
// functii membru neprotejate
public:
// constructor folosit la initializare
complex(double x=0,double y=0);
// constructor de copiere
complex(const complex &);
//supraincarcarea operatorului ++ prefixata
complex operator++();
//supraincaracarea operatorului ++ postfixata
complex operator++(int);
// afiseaza numarul complex
void afiscomplex();
};
complex::complex(double x, double y)
{
real=x;
imag=y;
}
complex::complex(const complex &z)
{
real=z.real;
imag=z.imag;
}
complex complex::operator++()
{
real++;
return *this;
}
complex complex::operator++(int)
{
real++;
return *this;
}
void complex::afiscomplex()
{
cout<<real<<" + i * "<<imag<<endl;
}
int main(void)
{
complex z(2,1), z1, z2;
cout<<"z initial = ";
z.afiscomplex();
Exemplu 4:
#include<iostream.h>
class vector{
private:
int *a;
//vectorul va avea un numar variabil de componente si deci spatiul necesar il vom aloca in heap
int n;
public:
vector();
// constructor implicit
vector(int *a, int n1);
// constructor
~vector();
//destructor
int min();
void afisare();
friend int egali(vector &v1, vector &v2); // testeaza egalitatea a doi vectori
int operator<(vector &v);
void ord_cresc();