Documente Academic
Documente Profesional
Documente Cultură
Ca sa scapam de niste probleme fara sa realizam mai bine initializam cu 0 sau NULL cand
definim atributele in clasa, in caz ca uitam de constr fara param.
//Punem aceeasi semnatura si in friend ca altfel nu gaseste un corespondent.
Operator <<
Main: cout << mesaj1; //se incarca global pentru ca are ca prim parametru cout
Daca primul operator este de tipul clasei pot incarca prin functie membra, deoarece acel
parametru intra in functia respectiva prin this.
Se poate face si citirea fara friend daca avem get-uri (interfata publica)!! Cand folosim get-eri
punem paranteze (): m.getPrioritate();
Operatorul +
1. Main:
mesaj2=mesaj1 + “completare”;//obiect + ceva
//pentru ca primul parametru e de tip mesaj, pot merge prin functie membra, ca sa scap de friend
Mesaj operator+(string msg){ //nu mai scriu primul parametru ca e de tip mesaj(this)
//nu putem pune void, pt ca avem eroare de compilare! (nu exista operator care sa aiba la stanga
Mesaj si la dreapta void, deci avem nevoie ca tipul returnat sa fie Mesaj)
//aici se apeleaza o data constructorul de copiere la Mesaj
//NU MODIFICATI THIS! FACETI COPIE!
Mesaj rezultat=*this; //constructorul de copiere e aici
rezultat.text +=mesaj;
return rezultat;
}
NU MODIFICA VALOAREA OPERANZILOR/PARAMETRILOR !! Care sunt operanzii(sunt
subliniati)?
mesaj2=mesaj1 + “completare”;
//verifici inainte si dupa sa vezi daca modifica ceva
2. Main:
mesaj3= “Am uitat sa adaug” + mesaj2; //string+ obiect
//nu are cum sa fie prin functie membra ca am primul param string
Mesaj operator+(string msg, Mesaj mesaj){ //il pun in clasa prin friend
Mesaj rezultat = mesaj;
//nu putem folosi ca in sem trecut functia + de mai sus pt ca vrem //sa adauge la inceput, nu e
concatenare sa adauge el unde vrea
//nu returnam void ci mesaj
rezultat.text = msg + rezultat.text; //pentru a concatena mesajul msg
inaintea lui text din obiect
return rezultat;
}
3. Main:
Mesaj mesaj4;
mesaj4= mesaj2 + mesaj3//2 obiecte
//merg prin functie membra
Mesaj operator+(Mesaj m2){ //primul parametru este this adica mesaj !!
Mesaj rezultat = *this; //nu modificam this
rezultat.text += m2.text;
//vreau sa concatenez la textul din this(m1) textul din m2
return rezultat;
}
Operatorul *
4. Main: mesaj4=3*mesaj2;
//functie globala ca avem 3 la stanga (int)
Mesaj operator*(int nr, Mesaj mesaj){
//vom replica mesajul de nr ori
//nu modifica this!!
Mesaj rezultat = mesaj;//il copiez pe mesaj pt ca sunt in zona globala si nu exista
this
string textInitial = rezultat.getText();
reultat.text=” ”;//ca sa nu afiseze de 4 ori plecam de la sir vid
for(int i=0; i<nr; i++){
rezultat.text+=textInitial;//nu vrem sa modificam mesaj
}
return rezultat;
}
Operatorul functie()
//folosit ca si cand obiectul este o functie
//cati parametri primeste noi decidem! //e flexibil
//operator [] - permite DOAR citirea valorilor (adica sav ad caracterul din text)
//char operator[](int index) { //ce returnam? Un singur character, deci e char
//validam ca sa ne asiguram ca nu crapa:
// if (index >= 0 && index < this->text.size())
// return this->text[index]; //daca e asa returnez caracterul
// else
// throw new exception("indexul este gresit"); //daca nu arunc exceptie
//}
explicit operator int() { //nu are tip returnat, e implicit numele operatorului cast
return this->prioritate;
}
//forma implicita e periculoasa pt ca spune poate de op+ pe care l-am supraincarcat in diferite
moduri ca sunt mai multi de tipul asta si nu stie ce sa aleaga (ti arata in eroare pe toti).
De exemplu la op+ (mesaj2=mesaj1+”completare”) castul implicit la int e folosit de compilator
fara sa ne intrebe si cumva are prioritate si compilatorul va incerca mereu sa ne duca in tipuri cu
care el stie sa lucreze si e cumva mai usor sa faca cast (se chinuie sa transforme mesaj1 la int).
De aia cast implicit in toate formele sale este de evitat pt ca da peste cap compilatorul. El il va
folosi cu prioritate fara sa te intrebe si ajungem in situatii aberante.