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

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

✐<br />

✐<br />

✐<br />

“Volum<strong>en</strong>1” — 2012/1/12 — 13:52 — page 354 — #392<br />

✐<br />

Capítulo 12. Sobrecarga de operadores<br />

Dog::PMF pmf = &Dog::run;<br />

cout *pmf)(1) *, el compilador inmediatam<strong>en</strong>te<br />

lo revuelve y llama a operator() para el valor de retorno de operator->*,<br />

pasándole los argum<strong>en</strong>tos que le fueron pasados a operator->*. FunctionObject::operator()<br />

toma los argum<strong>en</strong>tos e desrefer<strong>en</strong>cia el puntero a<br />

miembro «real» usando los punteros a objeto y a miembro almac<strong>en</strong>ados.<br />

Percátese de que lo que está ocurri<strong>en</strong>do aquí, justo como con operator->, se<br />

inserta <strong>en</strong> la mitad de la llamada a operator->*. Esto permite realizar algunas<br />

operaciones adicionales si se necesita.<br />

El mecanismo operator->* implem<strong>en</strong>tado aquí solo trabaja para funciones<br />

miembro que toman un argum<strong>en</strong>to <strong>en</strong>tero y devuelv<strong>en</strong> otro <strong>en</strong>tero. Esto es una limitación,<br />

pero si int<strong>en</strong>ta crear mecanismos sobrecargados para cada posibilidad difer<strong>en</strong>te,<br />

verá que es una tarea prohibitiva. Afortunadam<strong>en</strong>te, el mecanismo de plantillas<br />

de <strong>C++</strong> (descrito el el ultimo capitulo de este libro, y <strong>en</strong> el volum<strong>en</strong>2) está<br />

diseñado para manejar semejante problema.<br />

12.3.5. Operadores que no puede sobrecargar<br />

Hay cierta clase de operadores <strong>en</strong> el conjunto disponible que no pued<strong>en</strong> ser sobrecargados.<br />

La razón g<strong>en</strong>eral para esta restricción es la seguridad. Si estos operadores<br />

fues<strong>en</strong> sobrecargables, podría de algún modo arriesgar o romper los mecanismos de<br />

seguridad, hacer las cosas mas difíciles o confundir las costumbres exist<strong>en</strong>tes.<br />

1. El operador de selección de miembros operator.. Actualm<strong>en</strong>te, el punto ti<strong>en</strong>e<br />

significado para cualquier miembro de una clase, pero si se pudiera sobrecargar,<br />

no se podría acceder a miembros de la forma normal; <strong>en</strong> lugar de eso<br />

debería usar un puntero y la flecha operator->.<br />

2. La indirección de punteros a miembros operator.* por la misma razón que<br />

operator..<br />

3. No hay un operador de pot<strong>en</strong>cia. La elección más popular para éste era operator**<br />

de Fortram, pero provoca casos de análisis gramatical difíciles. C tampoco<br />

ti<strong>en</strong>e un operador de pot<strong>en</strong>cia, así que <strong>C++</strong> no parece t<strong>en</strong>er necesidad de<br />

uno porque siempre puede realizar una llamada a una función. Un operador de<br />

pot<strong>en</strong>cia añadirá una notación adecuada, pero ninguna nueva funcionalidad a<br />

cu<strong>en</strong>ta de una mayor complejidad del compilador.<br />

4. No hay operadores definidos por el usuario. Esto es, no puede crear nuevos<br />

operadores que no existan ya. Una parte del problema es como determinar la<br />

354<br />

✐<br />

✐<br />

✐<br />

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

Saved successfully!

Ooh no, something went wrong!