Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
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 />
✐