Mai mult despre operatori
O alta directie a dezvoltarii este de a furniza vectori cu operatii:
class Vec::public vector
Vec(Vec&);
~Vec()
void operator=(Vec&);
void operator*=(Vec&);
void operator*=(int);
//......
};
Observam modul in care constructorul pentru clasa derivata Vec::Vec() este definit pentru a transfera argumentele lui la constructorul pentru clasa de baza vector::vector(). Operatorul de atribuire este supraincarcat si poate fi definit astfel:
void Vec::operator=(Vec& a)
Atribuirea de Vec-uri acum copiaza elemente, in timp ce atribuirea de vectori copiaza pur si simplu structura care controleaza accesul la elemente. Totusi, ultima se intimpla cind se copiaza un vector fara utilizarea explicita a operatorului de atribuire:
(1) cind un vector este initializat prin atribuirea unui alt vector;
(2) cind un vector se paseaza ca argument;
(3) cind un vector se paseaza ca valoare returnata de la o functie.
Pentru a cistiga control in aceste cazuri pentru vectorii Vec, noi definim constructorul Vec(Vec&):
Vec::Vec(Vec& a) : (a.size())
Acest constructor initializeaza un Vec ca o copie a altuia si va fi apelat in cazurile mentionate precedent. Pentru operatori de forma = si +=, expresia din stinga este evident speciala si se pare natural ca ei sa se implementeze ca operatii asupra obiectelor notate prin acea expresie. In particular, este posibil pentru ei sa se schimbe valoarea primului lor operand. Pentru operatori de forma + si -, operandul sting nu necesita o atentie speciala. Noi am putea, de exemplu, sa transferam ambele argumente prin valoare si totusi sa capatam o implementare corecta a adunarii vectorilor. Vectorii pot fi mari, asa ca, pentru a elimina copierea, operanzii lui + se transfera operatorului operator+() prin referinta:
Vec operator+(Vec& a, Vec& b)
Iata un mic exemplu care poate fi executat daca se compileaza cu declaratiile de vector prezentate anterior:
#include <stream.h>
void error(char* p)
void vector::set_size(int)
void vec::operator[](int i)
main()
|