13.01.2015 Views

Pensar en C++ (Volumen 1) - Grupo ARCO

Pensar en C++ (Volumen 1) - Grupo ARCO

Pensar en C++ (Volumen 1) - Grupo ARCO

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!