Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Conf # 1 Pg 1 de 4
Observaciones:
La palabra clave operator seguida del operador que se desea sobrecargar es el nombre de la funcin.
Los parmetros que recibe la funcin son los operandos. En el caso de ser la funcin miembro de clase.
El operando de la derecha es siempre el propio objeto (*this).
El prototipo de la funcin es MUY IMPORTANTE. Por ejemplo, si usted va a realizar la operacin !
sobre un objeto de la clase T debe tener claro cul es el comportamiento que desea para el Tipo T cuando
el operador se aplique varias veces:
Al definir un objeto usando la declaracin:
objeto t. Si se aplica dos veces: !!t, el objeto debe quedar intacto. Desglosando estas operaciones
podemos ver que se divide en dos partes:
1-
!t implica que el compilador invoque a la funcin miembro t.operator!() esta funcin modifica
(Rol/PUC)
Mtodo de clase (Rol/PC)
t1+t2
T operator+(const T& t2);
t1+5
T operator+(int i2);
5+t1
t1+f2
T operator+(const F& f2)
f2+t1
Donde: t1, t2 son de tipo T y f2 son de tipo F.
La primera opcin es poco menos que absurda, as que nos queda solo una opcin:
friend ostream& operator<<( const ostream& output, const T& tb);
El tipo devuelto es necesario para poder concatenar llamadas de este tipo ejemplo:
cout << t1 << t2;
En este caso el proceso es el siguiente:
1ro - cout = operator<<( cout, t1);
2do- cout = operator<<( cout, t2);
Conf # 1 Pg 3 de 4
Ejemplo:
Vamos a estudiar el ejemplo del libro de texto donde se define una clase Array que manipula un arreglo creado
dinmicamente: La ventaja de utilizar una clase Array para los PUC ser la siguiente:
1. Permitir controlar al acceso a los elementos de arreglo sin que se produzcan errores de acceso debido a
mala indexacin.
int a[3]= {1,23,-5};
a[7] = 10 // error;
2. Permitir comparar arreglos con los operadores == =:
int b = {1, 23,-5};
a == b compara los punteros a entero a y b. Pero nosotros quisiramos que nos diga si los arreglos
contienen la misma cantidad de elementos y adems si coinciden en cada una de las posiciones.
3. Permitir asignar un arreglo a otro usando solo el operador.
int c = {5, 78,-23};
a = c;
4. Al escribir cout << a, se impriman los elementos del arreglo y no la direccin del puntero en memoria.
class Array {
friend ostream &operator<<(ostream &, const Array &);
public:
Array(int=10);
Array(const Array&);
~Array();
int getSize() const;
const Array& operator=(const Array&);
int operator==(const Array&) const;
int& operator[](int);
private:
int *ptr;
int size;
};
Observaciones:
operator<<: Siempre se sobrecarga como funcin independiente pues el operando de la derecha es de
una clase diferente a la cual se quiere aplicar el operador. En este caso ostream.
Array(const Array&): Es el constructor de copia redefinido ya que el arreglo se crear dinmicamente.
operator=: Es el operador de asignacin sobrecargado para que un objeto Array pueda ser asignado a
otro. En C++ siempre se proporciona uno por defecto (similar al constuctor de copia), que copia bit a bit
la memoria de un objeto a otro. Cuando esta copia bit a bit no es semnticamente correcta, entonces
debe sobrecargarse. Este es el caso debido a que la clase almacena un puntero que indica una zona de
memoria pedida dinmicamente. Esta funcin debe devolver una copia del objeto
operator[] Permitir aplicar la notacin de subindices a los objetod de la clase tal y como se hace en un
arreglo de C/C++. El valor devuelto ser una referencia a un elemento de arreglo. Esto permitir hacer
procesos de lectura y escritura: Ej: Array a; a[1] = 10; int b = a[1];
Conclusiones:
Conf # 1 Pg 4 de 4