Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
✐<br />
✐<br />
✐<br />
“Volum<strong>en</strong>1” — 2012/1/12 — 13:52 — page 355 — #393<br />
✐<br />
12.4. Operadores no miembros<br />
preced<strong>en</strong>cia, y otra parte es la falta de necesidad a costa del problema inher<strong>en</strong>te.<br />
5. No puede cambiar las reglas de preced<strong>en</strong>cia. Son lo sufici<strong>en</strong>tem<strong>en</strong>te difíciles<br />
de recordar como son sin dejar a la g<strong>en</strong>te jugar con ellas.<br />
12.4. Operadores no miembros<br />
En algunos de los ejemplos anteriores, los operadores pued<strong>en</strong> ser miembros o no,<br />
y no parece haber mucha difer<strong>en</strong>cia. Esto normalm<strong>en</strong>te provoca la pregunta, «¿Cuál<br />
debería elegir». En g<strong>en</strong>eral, si no hay ninguna difer<strong>en</strong>cia deberían ser miembros,<br />
para <strong>en</strong>fatizar la asociación <strong>en</strong>tre el operador y su clase. Cuando el operando de la<br />
izquierda es siempre un objeto de la clase actual funciona bi<strong>en</strong>.<br />
Sin embargo, a veces querrá que el operando de la izquierda sea un objeto de<br />
alguna otra clase. Un caso típico <strong>en</strong> el que ocurre eso es cuando se sobrecargan los<br />
operadores > para los flujos de <strong>en</strong>trada/salida. Dado que estos flujos son una<br />
librería fundam<strong>en</strong>tal <strong>en</strong> <strong>C++</strong>, probablem<strong>en</strong>te querrá sobrecargar estos operadores<br />
para la mayoría de sus clases, por eso el proceso es digno de tratarse:<br />
//: C12:IostreamOperatorOverloading.cpp<br />
// Example of non-member overloaded operators<br />
#include "../require.h"<br />
#include <br />
#include // "String streams"<br />
#include <br />
using namespace std;<br />
class IntArray {<br />
<strong>en</strong>um { sz = 5 };<br />
int i[sz];<br />
public:<br />
IntArray() { memset(i, 0, sz* sizeof(*i)); }<br />
int& operator[](int x) {<br />
require(x >= 0 && x < sz,<br />
"IntArray::operator[] out of range");<br />
return i[x];<br />
}<br />
fri<strong>en</strong>d ostream&<br />
operator(istream& is, IntArray& ia);<br />
};<br />
ostream&<br />
operator