Sunteți pe pagina 1din 10

Supraincarcarea operatorilor

Supraincarcarea functiilor C++ permite sa avem mai multe functii cu acelasi nume. Cand rulam programul, compilatorul C++ determina care functie trebuie apelata in functie de numarul si tipul parametrilor pe care instructiunea de apelare ii transmite functiei. Exemplu:
#include "stdafx.h" int suma(int *matrice, int nr_element) { int rezultat=0; int nr; for (nr=0; nr<nr_element; nr++) rezultat+=matrice[nr]; return rezultat; } double suma(double *matrice, int nr_element) { double rezultat=0; int nr; for (nr=0; nr<nr_element; nr++) rezultat+=matrice[nr]; return rezultat; } void main() { int a[5]={1,2,3,4,5}; double b[4]={1.11,2.22,3.33,4.44}; cout<<"suma valorilor int este "<<suma(a,5)<<endl; cout<<"suma valorilor double este "<<suma(b,4)<<endl; _getch(); }

Functiile pot avea acelasi tip, dar atunci trebuie sa difere numarul de parametri, iar daca au acelasi numar de parametrii trebuie neaparat sa fie de alt tip. Atentie la supraincarcarea functiilor statice! (Vezi laboratorul 5).

Supraincarcarea operatorilor

Lab 6

C++

Ce ascundem si ce facem public? Ca regula generala, cu cat un program stie mai putin despre o clasa cu atat mai bine. De aceea ar trebui sa utilizati atribute si metode private cat mai des posibil. Atunci cand utilizati atribute si metode private, programele care utilizeaza obiectul trebuie sa foloseasca metodele publice ale obiectului pentru a avea acces la datele obiectului. Supraincarcarea unui operator Prin supradefinirea operatorilor se pot realiza operatii specifice unui nou tip de date la fel de usor ca in cazul tipurilor de date standard. Cand supraincarcati un operator trebuie sa continuati sa utilizati operatorul in formatul sau standard, adica daca supraincarcati operatorul (+) acesta trebuie sa utilizeze operatorul sub forma operand+operand. Puteti sa supraincarcati doar operatorii existenti. C++ nu va permite definirea unor operatori proprii. Operatorul supraincarcat se aplica numai instantelor clasei specificate. De exemplu, daca avem o clasa Sir si am supraincarcat operatorul plus astfel incat operatorul sa concateneze doua siruri de caractere sir_nou=sir1+sir2; daca utilizati operatorul plus supraincarcat, cu doua valori intregi, supraincarcarea nu se va aplica. Operatorii care NU pot fii supraincarcati sunt . .* :: ?: NU puteti utiliza o functie friend pentru supraincarcarea urmatorilor operatori = [ ] ( ) -> Adesea functiile operator returneaza un obiect al clasei asupra caruia opereaza. Atunci cand supraincarcati un operator unar lista de argumente trebuie sa fie goala, iar cand supraincarcati un operator binar lista de argumente trebuie sa contina un singur parametru. Sintaxa: tip_returnat nume_clasa operator #(lista_argumente){ //operatii } Supradefinirea se poate face folosind: functii membre nestatice functii prietene

Supraincarcarea operatorilor

Lab 6

C++

Probleme: 1. Supraincarcarea operatorului + Utilizam clasa Complex pentru a supraincarca operatorii + si


class Complex { int re, im; public: Complex(int re=0, int im=0); void afisare(); friend Complex operator +(Complex, Complex); ~Complex(void); }; Complex::Complex(int re, int im) { this->re=re; this->im=im; cout<<"Se creeaza obiectul si va avea atributele "<<this->re<<", "<<this->im<<endl; } void Complex::afisare() { cout << re << "+" << im << "i" << "\n"; } Complex::~Complex(void) { //cout<<"S-a distrus obiectul cu atributele "<<re<<", "<<im<<endl; }

Adaugam in clasa Complex urmatorul prototip de declaratie a functiei clasei Complex:


friend Complex operator +(Complex, Complex);

Si definirea functiei:
Complex operator +(Complex c1, Complex c2) { Complex tmp; tmp.re = c1.re + c2.re; tmp.im = c1.im + c2.im; return tmp; }

Daca avem doua variabile de tip Complex x si y apelul x+y se va transforma in operator+(x,y)
3

Supraincarcarea operatorilor Functia main corespunzatoare:

Lab 6

C++

void main() { Complex c1(1,1), c2(2,2); Complex r1, r2; cout<<"c1=";c1.afisare(); cout<<"c2=";c2.afisare(); r1 = c1 + c2; cout<<"r1="; r1.afisare(); r2 = c1 + c2 + r1; //se evalueaza (c1 + c2) + r1 tinandu-se seama de //asociativitatea operatorilor cout<<"r2="; r2.afisare(); _getch(); }

Supraincarcarea operatorilor folosind functii membre: 2. Supraincarcarea operatorului Adaugam la programul anterior prototipul functiei
Complex operator- (Complex);

Definirea functiei
Complex Complex::operator- (Complex c) { Complex tmp; tmp.im = this->im - c.im; tmp.re = this->re - c.re; return tmp; }

Daca avem doua variabile de tip Complex x si y apelul x-y se va transforma in x.operator-(y) Restrictie: in acest caz tipul primului operand este mereu tipul clasei. Proprietatile operatorilor care nu pot fi modificate: pluraritatea precedenta si asociativitatea

Supraincarcarea operatorilor

Lab 6

C++

3. Supradefinirea operatorului = In lipsa supradefiniri operatorului = atribuirea se face membru cu membru in mod similar constructorului de copiere. Pentru exemplificare vom folosi clasa Stiva:
class Stiva { int dim; int pozCurenta; int* tab; public: Stiva(int dim=0); Stiva(Stiva &); ~Stiva(void); void adaug(int el); void afisare(void); }; Stiva::Stiva(int dim){ this->dim = dim; pozCurenta = 0; tab = new int[dim]; } Stiva::~Stiva(void) { delete tab; } void Stiva::afisare(void) { cout << "stiva : " ; for (int i=0; i <pozCurenta; i++){ cout << tab[i] << " "; } cout << endl; } Stiva::Stiva(Stiva &s){ this->dim = s.dim; this->pozCurenta = s.pozCurenta; for (int i=0; i <pozCurenta; i++){ this->tab[i] = s.tab[i]; } } void Stiva::adaug(int el){ tab[pozCurenta++] =el; }

Supraincarcarea operatorilor

Lab 6

C++

Adaugam in clasa Stiva prototipul:


Stiva& operator= (Stiva &);

Si definirea functiei:
Stiva& Stiva::operator= (Stiva &s) { if (this != &s){ this->dim = s.dim; this->pozCurenta = s.pozCurenta; for (int i=0; i <pozCurenta; i++){ this->tab[i] = s.tab[i]; } } return *this; }

Exemplu:
int main() { Stiva s1(10), s2(20), s3(30); s1 = s2; s3 = s2 =s1; getchar(); return 0; }

4. Operatorul [] Este un operator binar si vom exemplifica supraincarcarea pentru clasa Stiva pentru a avea acces la membri tabloului. Se adauga urmatorul prototip de declaratie a functiei clasei Stiva:
int & operator[](int);

si definirea functiei:
int & Stiva::operator[](int i) { return tab[i];

Supraincarcarea operatorilor
}

Lab 6

C++

int main() { Stiva s1(10), s2(20), s3(30); s1.adaug(3); s1.adaug(4); s1.adaug(8); s1.afisare(); cout << "Stiva [0]: " <<s1[0] << endl; getchar(); return 0; }

5. Studiati urmatorul exemplu, rulati programul, explicati ce se intampla:


#include <stdafx.h> #include <iostream> #include <stdlib.h> using namespace std; class Loc { int longitudine; int latitudine; public: Loc(){} Loc(int lg, int lt) { longitudine=lg; latitudine=lt; } ~Loc() { //cout<<"Am distrus obiectul "<<endl; } void print() { cout<<"longitudine "<<longitudine<<" "; cout<<"latitudine "<<latitudine<<endl; } Loc operator=(Loc op2); friend Loc operator++(Loc &op1); //Supraincarcarea prin // functie friend friend Loc operator--(Loc &op1); // -||void *operator new(size_t dimensiune); void operator delete(void *p); 7

Supraincarcarea operatorilor
}; Loc Loc::operator=(Loc op2) { longitudine=op2.longitudine; latitudine=op2.latitudine; return *this; } Loc operator++(Loc &op1) { op1.longitudine++; op1.latitudine++; return op1; } Loc operator--(Loc &op1) { op1.longitudine--; op1.latitudine--; return op1; } void *Loc::operator new(size_t dimensiune) { cout<<"Functia new proprie. "<<endl; return malloc(dimensiune); } void Loc::operator delete(void *p) { cout<<"Functia delete proprie. "<<endl; free(p); } void main() { Loc ob1(10,20), ob2; ob1.print(); ++ob1; ob1.print(); ob2=++ob1; ob2.print(); --ob2; ob2.print(); Loc *p1, *p2; p1=new Loc(40,50); if (!p1)

Lab 6

C++

Supraincarcarea operatorilor
{ cout<<"Eroare la alocare exit(1); "<<endl; } p2=new Loc(-40,-50); if (!p2) { cout<<"Eroare la alocare !!"<<endl; exit(1); } p1->print(); p2->print(); delete p1; delete p2; }

Lab 6

C++

Dupa cum ati observat putem supraincarca si operatorii new si delete daca dorim sa alocam o anumita metoda speciala de memorie. Tipul size_t trebuie sa fie capabil sa pastreze partea cea mai mare din memorie pe care functia supraincarcata new o poate aloca. Parametrul dimensiune trebuie sa contina numarul de octeti pe care new ii cere pentru a pastra obiectul tocmai alocat. Functia new trebuie sa returneze un pointer la memoria alocata sau sa returneze NULL daca esueaza. Pentru a elibera memoria alocata cu new trebuie sa reincarcam operatorul delete. Operatorul delete trebuie sa primeasca un pointer la memoria pe care operatorul new a alocat-o anterior pentru obiect. Puteti incarca operatorii new si delete fie global, fie relativ la o clasa sau la mai multe clase. Tema 1. Definiti o clasa AgendaTelefon care contine o lista de perechi de genul nume, numar telefon. Programul trebuie sa poata efectua urmatoarele operatii: reuniunea a doua agende de telefon diferenta a doua agende de telefon accesarea directa a unui numar de telefon prin intermediul numelui (supradef op []) afisare, adaugarea/stergerea de perechi nume, numar telefon.

Supraincarcarea operatorilor

Lab 6

C++

2. Studiati http://web.info.uvt.ro/~danielpop/oop/Lab6.pdf (Laboratorul 6 Daniel Pop) Probleme suplimentare 1. Proiectati si implementati clasa Rational care sa permita lucru cu numere rationale (adunare, scadere, inmultire, impartire): -Constructorul clasei va avea doua argumente : numarartorul si numitorul numarului rational (constructorul poate avea si un singur argument, caz in care al doilea se ia implicit 1, sau nici un argument, caz in care se iau valorile implicite 0 si 1) ; -Se va asigura un constructor de copiere ; Se vor prevedea functii membre pentru : accesul la numaratorul, respectiv numitorul numarului rational ; -Daca sunt egale 2 sau mai multe numere rationale, se va afisa pe ecran acest lucru . 2. Modificati problema 1 (clasa Rational) astfel incat sa supraincarcati toti operatorii necesari. 3. Proiectati si implementati o clasa Vector de numere reale si o clasa Matrice de numere reale. Implementati cel putin urmatoarele: a) construirea claselor, constructori si destructori corespunzatori b) produsul scalar a doi vectori c) adunarea, scaderea, inmultirea a doi vectori d) adunarea, scaderea, inmultirea a doua matrici, inversa unei matrici e) inmultirea unui vector si a unei matrici cu o constanta reala f) produsul unui vector cu o matrice Alegeti cu grija functiile membre friend.

10

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

  • Probleme Inf
    Probleme Inf
    Document13 pagini
    Probleme Inf
    Mihaela Lupeş
    Încă nu există evaluări
  • Lucrare de Laborator nr.2.
    Lucrare de Laborator nr.2.
    Document8 pagini
    Lucrare de Laborator nr.2.
    ionperu
    100% (2)
  • Lab1 Apa
    Lab1 Apa
    Document15 pagini
    Lab1 Apa
    SlavicCaldare
    Încă nu există evaluări
  • Lab.4 FC
    Lab.4 FC
    Document6 pagini
    Lab.4 FC
    Cristina Florea
    Încă nu există evaluări
  • Raport Final
    Raport Final
    Document26 pagini
    Raport Final
    Cristi Adașan
    Încă nu există evaluări
  • Asdn 3
    Asdn 3
    Document11 pagini
    Asdn 3
    Euegniu
    Încă nu există evaluări
  • Laborator Porgramarea Calculatoarelor 3
    Laborator Porgramarea Calculatoarelor 3
    Document3 pagini
    Laborator Porgramarea Calculatoarelor 3
    Sergiu Lungu
    Încă nu există evaluări
  • Lab1 GC
    Lab1 GC
    Document8 pagini
    Lab1 GC
    Andrei Barbalat
    Încă nu există evaluări
  • Laborator 2 APA
    Laborator 2 APA
    Document17 pagini
    Laborator 2 APA
    RoscaFlorin
    Încă nu există evaluări
  • Laborator 1
    Laborator 1
    Document6 pagini
    Laborator 1
    adrian_cobilas
    Încă nu există evaluări
  • Rezolvarea Numerica A Sistemelor de Ecuatii Liniare
    Rezolvarea Numerica A Sistemelor de Ecuatii Liniare
    Document8 pagini
    Rezolvarea Numerica A Sistemelor de Ecuatii Liniare
    Valentin I. Marius
    Încă nu există evaluări
  • Lab 4
    Lab 4
    Document5 pagini
    Lab 4
    cristian
    Încă nu există evaluări
  • Lab7 POO
    Lab7 POO
    Document10 pagini
    Lab7 POO
    Grosu Elena
    Încă nu există evaluări
  • TAP Lab2
    TAP Lab2
    Document4 pagini
    TAP Lab2
    Adrian Bodorin
    Încă nu există evaluări
  • Lab 5
    Lab 5
    Document7 pagini
    Lab 5
    Dorin Nicoara
    Încă nu există evaluări
  • Raport Programarea Calculatoarelor 5
    Raport Programarea Calculatoarelor 5
    Document14 pagini
    Raport Programarea Calculatoarelor 5
    Oprea Cristian
    Încă nu există evaluări
  • Subiecte Colocviu ASDN
    Subiecte Colocviu ASDN
    Document9 pagini
    Subiecte Colocviu ASDN
    Antoniu Bumbas
    Încă nu există evaluări
  • Lab 6 Cazacu POO
    Lab 6 Cazacu POO
    Document5 pagini
    Lab 6 Cazacu POO
    Iura Cazacu
    Încă nu există evaluări
  • TAP Lab5 Popov Biatrice CR 191
    TAP Lab5 Popov Biatrice CR 191
    Document6 pagini
    TAP Lab5 Popov Biatrice CR 191
    Alina Axenti
    Încă nu există evaluări
  • Lab 1
    Lab 1
    Document10 pagini
    Lab 1
    rosca9doinita
    Încă nu există evaluări
  • Egajklrjalkgjlekrg
    Egajklrjalkgjlekrg
    Document8 pagini
    Egajklrjalkgjlekrg
    CS:GO cFG
    Încă nu există evaluări
  • Cap 3 Liste FN
    Cap 3 Liste FN
    Document6 pagini
    Cap 3 Liste FN
    George Szo Cristian
    Încă nu există evaluări
  • AI-191 Medinschi Ion SO4
    AI-191 Medinschi Ion SO4
    Document5 pagini
    AI-191 Medinschi Ion SO4
    Carolin
    Încă nu există evaluări
  • Raspunsuri AC
    Raspunsuri AC
    Document10 pagini
    Raspunsuri AC
    Anastasia Gherman
    Încă nu există evaluări
  • RC Lab1.1
    RC Lab1.1
    Document17 pagini
    RC Lab1.1
    Alexandru Dumbrava
    Încă nu există evaluări
  • Lab 2 Apa
    Lab 2 Apa
    Document12 pagini
    Lab 2 Apa
    Artur Kingsman
    Încă nu există evaluări
  • Lab 4 RC
    Lab 4 RC
    Document4 pagini
    Lab 4 RC
    Den's Vlogs
    Încă nu există evaluări
  • LL4 PS
    LL4 PS
    Document12 pagini
    LL4 PS
    Anya Mr
    100% (1)
  • LL3 PS ECiobanu TI192
    LL3 PS ECiobanu TI192
    Document14 pagini
    LL3 PS ECiobanu TI192
    Ecaterina Ciobanu
    Încă nu există evaluări
  • Lab 1
    Lab 1
    Document10 pagini
    Lab 1
    Ion Cornea
    Încă nu există evaluări
  • Lab 2 MMC Boj
    Lab 2 MMC Boj
    Document12 pagini
    Lab 2 MMC Boj
    Andrian Brinzan
    Încă nu există evaluări
  • Lab 1
    Lab 1
    Document9 pagini
    Lab 1
    Cristian Conea
    Încă nu există evaluări
  • Lab1 Po
    Lab1 Po
    Document7 pagini
    Lab1 Po
    Alina Axenti
    Încă nu există evaluări
  • ASAD Lab03 Raport
    ASAD Lab03 Raport
    Document6 pagini
    ASAD Lab03 Raport
    Mihai U
    Încă nu există evaluări
  • Laborator-I MMC
    Laborator-I MMC
    Document7 pagini
    Laborator-I MMC
    Ion Bn
    Încă nu există evaluări
  • Refer at
    Refer at
    Document11 pagini
    Refer at
    Дарья Рг
    Încă nu există evaluări
  • Lab 6 Poo
    Lab 6 Poo
    Document5 pagini
    Lab 6 Poo
    Alex Tronciu
    Încă nu există evaluări
  • Grafica Laborator Nr.3
    Grafica Laborator Nr.3
    Document5 pagini
    Grafica Laborator Nr.3
    Cebotari Ion
    100% (2)
  • Laborator nr6 CDE
    Laborator nr6 CDE
    Document5 pagini
    Laborator nr6 CDE
    Vlad Racu
    Încă nu există evaluări
  • Laborator 3 Croitoru Tudor
    Laborator 3 Croitoru Tudor
    Document8 pagini
    Laborator 3 Croitoru Tudor
    DorelDjj
    Încă nu există evaluări
  • APA - Lab2 GS
    APA - Lab2 GS
    Document18 pagini
    APA - Lab2 GS
    Unknown Person
    Încă nu există evaluări
  • ASDN Colocviu3
    ASDN Colocviu3
    Document2 pagini
    ASDN Colocviu3
    Bulica Mihai
    Încă nu există evaluări
  • Lab1 2mmc
    Lab1 2mmc
    Document10 pagini
    Lab1 2mmc
    Artur Kingsman
    Încă nu există evaluări
  • APA - Proiect de Curs
    APA - Proiect de Curs
    Document43 pagini
    APA - Proiect de Curs
    Dan
    Încă nu există evaluări
  • Laboratorul 7 PC
    Laboratorul 7 PC
    Document36 pagini
    Laboratorul 7 PC
    Petrea Trofim
    Încă nu există evaluări
  • Formular Pentru Rezeolvarea Problemelor Tema 5 Adrese IP4
    Formular Pentru Rezeolvarea Problemelor Tema 5 Adrese IP4
    Document5 pagini
    Formular Pentru Rezeolvarea Problemelor Tema 5 Adrese IP4
    mark
    Încă nu există evaluări
  • Lucrarea 4 Utm
    Lucrarea 4 Utm
    Document10 pagini
    Lucrarea 4 Utm
    BlandjLdhui
    Încă nu există evaluări
  • POO1-varianta 3
    POO1-varianta 3
    Document5 pagini
    POO1-varianta 3
    Octavian Lucaș
    Încă nu există evaluări
  • Lab 6
    Lab 6
    Document4 pagini
    Lab 6
    Егор Казаков
    Încă nu există evaluări
  • Labjciejmf
    Labjciejmf
    Document4 pagini
    Labjciejmf
    CS:GO cFG
    Încă nu există evaluări
  • Laborator nr.1
    Laborator nr.1
    Document9 pagini
    Laborator nr.1
    Anonymous CZYe2H
    Încă nu există evaluări
  • Raport 2 Si Raport 3 La SDA
    Raport 2 Si Raport 3 La SDA
    Document17 pagini
    Raport 2 Si Raport 3 La SDA
    maxlab
    Încă nu există evaluări
  • Lab 1 PMMA
    Lab 1 PMMA
    Document3 pagini
    Lab 1 PMMA
    BatiriMichael
    Încă nu există evaluări
  • Lucrarea de Laborator NR 4 POO
    Lucrarea de Laborator NR 4 POO
    Document10 pagini
    Lucrarea de Laborator NR 4 POO
    Alexandru Burdeniuc
    Încă nu există evaluări
  • Raspunsuri EP II 01-28
    Raspunsuri EP II 01-28
    Document8 pagini
    Raspunsuri EP II 01-28
    Poloboc
    Încă nu există evaluări
  • Laborator Nr. 9 POO
    Laborator Nr. 9 POO
    Document8 pagini
    Laborator Nr. 9 POO
    Cata Florea
    Încă nu există evaluări
  • Lab 3
    Lab 3
    Document13 pagini
    Lab 3
    Витёк Мужичёк
    100% (1)
  • Laborator 3
    Laborator 3
    Document17 pagini
    Laborator 3
    DorelDjj
    Încă nu există evaluări
  • Lab 2
    Lab 2
    Document5 pagini
    Lab 2
    Daniel Popa
    Încă nu există evaluări
  • Despre Functii CPP
    Despre Functii CPP
    Document4 pagini
    Despre Functii CPP
    prof. Florin Ciuburuc
    Încă nu există evaluări
  • Limbajul
    Limbajul
    Document2 pagini
    Limbajul
    Elena Bujor
    Încă nu există evaluări
  • Filme PT Gandire
    Filme PT Gandire
    Document2 pagini
    Filme PT Gandire
    Elena Bujor
    Încă nu există evaluări
  • Retele Petri
    Retele Petri
    Document22 pagini
    Retele Petri
    Bobe Danut
    Încă nu există evaluări
  • Teza Rezumat
    Teza Rezumat
    Document14 pagini
    Teza Rezumat
    Elena Bujor
    Încă nu există evaluări