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

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

arco.esi.uclm.es
from arco.esi.uclm.es More from this publisher
13.01.2015 Views

✐ ✐ ✐ “Volumen1” — 2012/1/12 — 13:52 — page XII — #12 ✐ Índice general 11.5. Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327 11.6. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328 12. Sobrecarga de operadores 331 12.1. Precaución y tranquilidad . . . . . . . . . . . . . . . . . . . . . . . . . . 331 12.2. Sintaxis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332 12.3. Operadores sobrecargables . . . . . . . . . . . . . . . . . . . . . . . . . 333 12.3.1. Operadores unarios . . . . . . . . . . . . . . . . . . . . . . . . . 333 12.3.1.1. Incremento y decremento . . . . . . . . . . . . . . . . . 336 12.3.2. Operadores binarios . . . . . . . . . . . . . . . . . . . . . . . . . 337 12.3.3. Argumentos y valores de retorno . . . . . . . . . . . . . . . . . . 346 12.3.3.1. Retorno por valor como constante . . . . . . . . . . . . 347 12.3.3.2. Optimización del retorno . . . . . . . . . . . . . . . . . 347 12.3.4. Operadores poco usuales . . . . . . . . . . . . . . . . . . . . . . 348 12.3.4.1. El operador coma . . . . . . . . . . . . . . . . . . . . . 348 12.3.4.2. El operador -> . . . . . . . . . . . . . . . . . . . . . . . 349 12.3.4.3. Un operador anidado . . . . . . . . . . . . . . . . . . . 351 12.3.4.4. Operador ->* . . . . . . . . . . . . . . . . . . . . . . . . 352 12.3.5. Operadores que no puede sobrecargar . . . . . . . . . . . . . . . 354 12.4. Operadores no miembros . . . . . . . . . . . . . . . . . . . . . . . . . . 355 12.4.1. Directrices básicas . . . . . . . . . . . . . . . . . . . . . . . . . . 356 12.5. Sobrecargar la asignación . . . . . . . . . . . . . . . . . . . . . . . . . . 357 12.5.1. Comportamiento del operador = . . . . . . . . . . . . . . . . . 358 12.5.1.1. Punteros en clases . . . . . . . . . . . . . . . . . . . . . 359 12.5.1.2. Contabilidad de referencias . . . . . . . . . . . . . . . 361 12.5.1.3. Creación automática del operador = . . . . . . . . . . 365 12.6. Conversión automática de tipos . . . . . . . . . . . . . . . . . . . . . . . 366 12.6.1. Conversión por constructor . . . . . . . . . . . . . . . . . . . . . 366 12.6.1.1. Evitar la conversión por constructor . . . . . . . . . . . 367 12.6.2. Conversión por operador . . . . . . . . . . . . . . . . . . . . . . 368 12.6.2.1. Reflexividad . . . . . . . . . . . . . . . . . . . . . . . . 368 12.6.3. Ejemplo de conversión de tipos . . . . . . . . . . . . . . . . . . . 370 12.6.4. Las trampas de la conversión automática de tipos . . . . . . . . 371 12.6.4.1. Actividades ocultas . . . . . . . . . . . . . . . . . . . . 372 12.7. Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 373 12.8. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 373 13. Creación dinámica de objetos 377 13.1. Creación de objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 378 XII ✐ ✐ ✐ ✐

✐ ✐ ✐ “Volumen1” — 2012/1/12 — 13:52 — page XIII — #13 ✐ Índice general 13.1.1. Asignación dinámica en C . . . . . . . . . . . . . . . . . . . . . . 378 13.1.2. El operador new . . . . . . . . . . . . . . . . . . . . . . . . . . . 380 13.1.3. El operador delete . . . . . . . . . . . . . . . . . . . . . . . . . 380 13.1.4. Un ejemplo sencillo . . . . . . . . . . . . . . . . . . . . . . . . . . 381 13.1.5. Trabajo extra para el gestor de memoria . . . . . . . . . . . . . . 381 13.2. Rediseño de los ejemplos anteriores . . . . . . . . . . . . . . . . . . . . 382 13.2.1. delete void* probablemente es un error . . . . . . . . . . . . . 382 13.2.2. Responsabilidad de la limpieza cuando se usan punteros . . . . 383 13.2.3. Stash para punteros . . . . . . . . . . . . . . . . . . . . . . . . . 384 13.2.3.1. Una prueba . . . . . . . . . . . . . . . . . . . . . . . . . 386 13.3. new y delete para vectores . . . . . . . . . . . . . . . . . . . . . . . . 388 13.3.1. Cómo hacer que un puntero sea más parecido a un vector . . . 389 13.3.2. Cuando se supera el espacio de almacenamiento . . . . . . . . . 389 13.3.3. Sobrecarga de los operadores new y delete . . . . . . . . . . . 390 13.3.3.1. Sobrecarga global de new y delete . . . . . . . . . . . 391 13.3.3.2. Sobrecarga de new y delete específica para una clase . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 393 13.3.3.3. Sobrecarga de new y delete para vectores . . . . . . 395 13.3.3.4. Llamadas al constructor . . . . . . . . . . . . . . . . . . 397 13.3.3.5. Operadores new y delete de [FIXME emplazamiento (situación)] . . . . . . . . . . . . . . . . . . . . . . . 398 13.4. Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 400 13.5. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 400 14. Herencia y Composición 403 14.1. Sintaxis de la composición . . . . . . . . . . . . . . . . . . . . . . . . . . 403 14.2. Sintaxis de la herencia . . . . . . . . . . . . . . . . . . . . . . . . . . . . 405 14.3. Lista de inicializadores de un constructor . . . . . . . . . . . . . . . . . 406 14.3.1. Inicialización de objetos miembros . . . . . . . . . . . . . . . . . 407 14.3.2. Tipos predefinidos en la lista de inicializadores . . . . . . . . . . 407 14.3.3. Combinación de composición y herencia . . . . . . . . . . . . . 408 14.3.3.1. Llamadas automáticas al destructor . . . . . . . . . . 409 14.3.4. Orden de llamada de constructores y destructores . . . . . . . . 409 14.4. Ocultación de nombres . . . . . . . . . . . . . . . . . . . . . . . . . . . . 411 14.5. Funciones que no heredan automáticamente . . . . . . . . . . . . . . . 414 14.5.1. Herencia y métodos estáticos . . . . . . . . . . . . . . . . . . . . 417 14.5.2. Composición vs. herencia . . . . . . . . . . . . . . . . . . . . . . 417 14.5.2.1. Subtipado . . . . . . . . . . . . . . . . . . . . . . . . . . 419 14.5.2.2. Herencia privada . . . . . . . . . . . . . . . . . . . . . 421 XIII ✐ ✐ ✐ ✐

✐<br />

✐<br />

✐<br />

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

✐<br />

Índice g<strong>en</strong>eral<br />

13.1.1. Asignación dinámica <strong>en</strong> C . . . . . . . . . . . . . . . . . . . . . . 378<br />

13.1.2. El operador new . . . . . . . . . . . . . . . . . . . . . . . . . . . 380<br />

13.1.3. El operador delete . . . . . . . . . . . . . . . . . . . . . . . . . 380<br />

13.1.4. Un ejemplo s<strong>en</strong>cillo . . . . . . . . . . . . . . . . . . . . . . . . . . 381<br />

13.1.5. Trabajo extra para el gestor de memoria . . . . . . . . . . . . . . 381<br />

13.2. Rediseño de los ejemplos anteriores . . . . . . . . . . . . . . . . . . . . 382<br />

13.2.1. delete void* probablem<strong>en</strong>te es un error . . . . . . . . . . . . . 382<br />

13.2.2. Responsabilidad de la limpieza cuando se usan punteros . . . . 383<br />

13.2.3. Stash para punteros . . . . . . . . . . . . . . . . . . . . . . . . . 384<br />

13.2.3.1. Una prueba . . . . . . . . . . . . . . . . . . . . . . . . . 386<br />

13.3. new y delete para vectores . . . . . . . . . . . . . . . . . . . . . . . . 388<br />

13.3.1. Cómo hacer que un puntero sea más parecido a un vector . . . 389<br />

13.3.2. Cuando se supera el espacio de almac<strong>en</strong>ami<strong>en</strong>to . . . . . . . . . 389<br />

13.3.3. Sobrecarga de los operadores new y delete . . . . . . . . . . . 390<br />

13.3.3.1. Sobrecarga global de new y delete . . . . . . . . . . . 391<br />

13.3.3.2. Sobrecarga de new y delete específica para una clase<br />

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 393<br />

13.3.3.3. Sobrecarga de new y delete para vectores . . . . . . 395<br />

13.3.3.4. Llamadas al constructor . . . . . . . . . . . . . . . . . . 397<br />

13.3.3.5. Operadores new y delete de [FIXME emplazami<strong>en</strong>to<br />

(situación)] . . . . . . . . . . . . . . . . . . . . . . . 398<br />

13.4. Resum<strong>en</strong> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 400<br />

13.5. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 400<br />

14. Her<strong>en</strong>cia y Composición 403<br />

14.1. Sintaxis de la composición . . . . . . . . . . . . . . . . . . . . . . . . . . 403<br />

14.2. Sintaxis de la her<strong>en</strong>cia . . . . . . . . . . . . . . . . . . . . . . . . . . . . 405<br />

14.3. Lista de inicializadores de un constructor . . . . . . . . . . . . . . . . . 406<br />

14.3.1. Inicialización de objetos miembros . . . . . . . . . . . . . . . . . 407<br />

14.3.2. Tipos predefinidos <strong>en</strong> la lista de inicializadores . . . . . . . . . . 407<br />

14.3.3. Combinación de composición y her<strong>en</strong>cia . . . . . . . . . . . . . 408<br />

14.3.3.1. Llamadas automáticas al destructor . . . . . . . . . . 409<br />

14.3.4. Ord<strong>en</strong> de llamada de constructores y destructores . . . . . . . . 409<br />

14.4. Ocultación de nombres . . . . . . . . . . . . . . . . . . . . . . . . . . . . 411<br />

14.5. Funciones que no heredan automáticam<strong>en</strong>te . . . . . . . . . . . . . . . 414<br />

14.5.1. Her<strong>en</strong>cia y métodos estáticos . . . . . . . . . . . . . . . . . . . . 417<br />

14.5.2. Composición vs. her<strong>en</strong>cia . . . . . . . . . . . . . . . . . . . . . . 417<br />

14.5.2.1. Subtipado . . . . . . . . . . . . . . . . . . . . . . . . . . 419<br />

14.5.2.2. Her<strong>en</strong>cia privada . . . . . . . . . . . . . . . . . . . . . 421<br />

XIII<br />

✐<br />

✐<br />

✐<br />

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

Saved successfully!

Ooh no, something went wrong!