Professional Documents
Culture Documents
ndice resumido
ndice resumido
iii
ndice general
ndice de cuadros
xi
ndice de figuras
xiii
1. Introduccin
2. Clases y objetos
3. Constructor y destructor
31
55
5. Sobrecarga de operadores
81
6. Composicin y herencia
119
7. Otros temas
135
8. Errores ms comunes
141
9. Ejercicios
185
A. Palabras clave
191
B. Operadores
197
C. Sentencias
201
D. Herramientas
207
iii
iv
ndice resumido
229
Bibliografa recomendada
249
ndice alfabtico
253
ndice general
ndice resumido
iii
ndice general
ndice de cuadros
xi
ndice de figuras
1. Introduccin
1.1. Introduccin . . . . . . . . . . .
1.2. Ventajas de C++ . . . . . . . .
1.3. Objetivos de este libro . . . . .
1.4. Contenido de los captulos . . .
1.5. Sistema operativo y compilador
1.6. Convenciones tipogrficas . . .
xiii
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
1
1
2
2
3
5
5
2. Clases y objetos
2.1. Introduccin . . . . . . . . . . . . . . . . . . .
2.2. Declaracin de una clase . . . . . . . . . . . .
2.3. Acceso a los miembros de una clase . . . . . .
2.4. Control de acceso . . . . . . . . . . . . . . . .
2.5. Visualizacin de un objeto . . . . . . . . . . .
2.6. Empleo de punteros . . . . . . . . . . . . . .
2.7. Separacin de la interfaz y la implementacin
2.8. La herramienta make . . . . . . . . . . . . . .
2.9. Ficheros de encabezado . . . . . . . . . . . .
2.10. Uso de espacios de nombres . . . . . . . . . .
2.11. Ejercicios de autoevaluacin . . . . . . . . . .
2.12. Ejercicios de programacin . . . . . . . . . .
2.12.1. Clase TVector . . . . . . . . . . . . .
2.12.2. Clase TCalendario . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
7
8
10
11
12
16
18
19
23
24
25
26
28
28
28
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
ndice general
vi
2.13. Respuesta a los ejercicios de
2.14. Respuesta a los ejercicios de
2.14.1. Clase TVector . . .
2.14.2. Clase TCalendario .
autoevaluacin
programacin .
. . . . . . . . .
. . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
28
30
30
30
3. Constructor y destructor
3.1. Sobrecarga de funciones . . . . . . . . . . .
3.2. Constructor . . . . . . . . . . . . . . . . . .
3.3. Constructor por defecto . . . . . . . . . . .
3.4. Otros constructores . . . . . . . . . . . . . .
3.5. Constructor de copia . . . . . . . . . . . . .
3.6. Un constructor en la parte privada? . . . .
3.7. Destructor . . . . . . . . . . . . . . . . . . .
3.8. Forma cannica de una clase . . . . . . . .
3.9. Ejercicios de autoevaluacin . . . . . . . . .
3.10. Ejercicios de programacin . . . . . . . . .
3.10.1. Clase TCoordenada . . . . . . . . .
3.10.2. Clase TVector . . . . . . . . . . . .
3.10.3. Clase TCalendario . . . . . . . . . .
3.11. Respuesta a los ejercicios de autoevaluacin
3.12. Respuesta a los ejercicios de programacin .
3.12.1. Clase TVector . . . . . . . . . . . .
3.12.2. Clase TCalendario . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
31
32
34
34
36
37
42
43
44
45
47
47
47
48
48
50
50
52
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
55
56
56
62
64
66
70
72
73
75
75
75
75
77
77
78
ndice general
vii
5. Sobrecarga de operadores
5.1. Introduccin . . . . . . . . . . . . . . . . . .
5.2. Puntero this . . . . . . . . . . . . . . . . . .
5.3. Modificador const . . . . . . . . . . . . . . .
5.4. Paso por referencia . . . . . . . . . . . . . .
5.5. Sobrecarga de operadores . . . . . . . . . .
5.6. Restricciones al sobrecargar un operador . .
5.7. Funcin miembro o funcin no miembro? .
5.8. Consejos . . . . . . . . . . . . . . . . . . . .
5.9. Operador asignacin . . . . . . . . . . . . .
5.10. Constructor de copia y operador asignacin
5.11. Operadores aritmticos . . . . . . . . . . . .
5.12. Operadores de incremento y decremento . .
5.13. Operadores abreviados . . . . . . . . . . . .
5.14. Operadores de comparacin . . . . . . . . .
5.15. Operadores de entrada y salida . . . . . . .
5.16. Operador corchete . . . . . . . . . . . . . .
5.17. Ejercicios de autoevaluacin . . . . . . . . .
5.18. Ejercicios de programacin . . . . . . . . .
5.18.1. Clase TCoordenada . . . . . . . . .
5.18.2. Clase TLinea . . . . . . . . . . . . .
5.18.3. Clase TVector . . . . . . . . . . . .
5.18.4. Clase TCalendario . . . . . . . . . .
5.19. Respuesta a los ejercicios de autoevaluacin
5.20. Respuesta a los ejercicios de programacin .
5.20.1. Clase TCoordenada . . . . . . . . .
5.20.2. Clase TLinea . . . . . . . . . . . . .
5.20.3. Clase TVector . . . . . . . . . . . .
5.20.4. Clase TCalendario . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
81
82
82
83
85
87
88
88
89
90
93
94
98
99
100
101
102
105
107
107
107
108
108
109
111
111
112
112
115
6. Composicin y herencia
6.1. Introduccin . . . . . . . . . . . . . . . . . .
6.2. Composicin . . . . . . . . . . . . . . . . .
6.3. Inicializacin de los objetos miembro . . . .
6.4. Herencia . . . . . . . . . . . . . . . . . . . .
6.5. Ejercicios de autoevaluacin . . . . . . . . .
6.6. Ejercicios de programacin . . . . . . . . .
6.6.1. Clase TLinea . . . . . . . . . . . . .
6.6.2. Clase TCoordenadaV . . . . . . . .
6.6.3. Clase TAgenda . . . . . . . . . . . .
6.7. Respuesta a los ejercicios de autoevaluacin
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
119
119
120
122
126
129
130
130
131
131
132
ndice general
viii
7. Otros temas
7.1. Forma cannica de una clase . . .
7.2. Funciones de cero parmetros . . .
7.3. Valores por omisin de una funcin
7.4. Funciones inline . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
135
135
137
137
139
8. Errores ms comunes
8.1. Introduccin . . . . . . . . . . . . . . . . .
8.2. Sobre el fichero makefile y la compilacin
8.3. Sobre las directivas de inclusin . . . . . .
8.4. Sobre las clases . . . . . . . . . . . . . . .
8.5. Sobre la sobrecarga de los operadores . . .
8.6. Sobre la memoria . . . . . . . . . . . . . .
8.7. Sobre las cadenas . . . . . . . . . . . . . .
8.8. Varios . . . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
141
141
144
146
149
161
166
172
178
9. Ejercicios
9.1. Mentiras arriesgadas . .
9.2. La historia interminable
9.3. Pegado a ti . . . . . . .
9.4. Clase TComplejo . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
185
185
186
187
188
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
A. Palabras clave
191
A.1. Lista de palabras clave . . . . . . . . . . . . . . . . . . . . . . . . . . . 191
B. Operadores
197
B.1. Lista de operadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197
C. Sentencias
C.1. Introduccin . . . . . . . . . . . . . . . . . . . .
C.1.1. Asignacin . . . . . . . . . . . . . . . .
C.1.2. Sentencia compuesta (bloque de cdigo)
C.1.3. Sentencia condicional . . . . . . . . . .
C.1.4. Sentencia condicional mltiple . . . . .
C.1.5. Sentencia de seleccin . . . . . . . . . .
C.1.6. Bucle con contador . . . . . . . . . . . .
C.1.7. Bucle con condicin inicial . . . . . . . .
C.1.8. Bucle con condicin final . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
201
201
202
202
202
203
203
204
204
205
D. Herramientas
207
D.1. Editor JOE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208
D.1.1. Comandos bsicos . . . . . . . . . . . . . . . . . . . . . . . . . 208
D.1.2. Bloques de texto . . . . . . . . . . . . . . . . . . . . . . . . . . 208
ndice general
D.2.
D.3.
D.4.
D.5.
ix
D.1.3. Movimiento . . . . . . . . . . . . . . . . . .
D.1.4. Ayuda . . . . . . . . . . . . . . . . . . . . .
Editor vim . . . . . . . . . . . . . . . . . . . . . .
D.2.1. Salir de vim . . . . . . . . . . . . . . . . . .
D.2.2. Introduccin de nuevo texto . . . . . . . . .
D.2.3. Movimientos del cursor . . . . . . . . . . .
D.2.4. Posicionamiento del cursor sobre palabras .
D.2.5. Deshacer . . . . . . . . . . . . . . . . . . .
D.2.6. Adiciones, cambios y supresiones simples de
D.2.7. Bsquedas . . . . . . . . . . . . . . . . . . .
D.2.8. Opciones del editor . . . . . . . . . . . . . .
Depurador gdb . . . . . . . . . . . . . . . . . . . .
D.3.1. Ejemplo de depuracin . . . . . . . . . . . .
Depurador Valgrind . . . . . . . . . . . . . . . . .
D.4.1. Memcheck . . . . . . . . . . . . . . . . . . .
Compresor/descompresor tar . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
texto
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
210
210
212
212
212
214
214
214
214
215
215
215
216
223
224
227
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
229
229
235
237
242
.
.
.
.
.
.
.
.
.
.
.
.
Bibliografa recomendada
249
ndice alfabtico
253
ndice de cuadros
2.1. Especificadores de acceso
B.1. Nivel
B.2. Nivel
B.3. Nivel
B.4. Nivel
B.5. Nivel
B.6. Nivel
B.7. Nivel
B.8. Nivel
B.9. Nivel
B.10.Nivel
B.11.Nivel
B.12.Nivel
B.13.Nivel
B.14.Nivel
B.15.Nivel
B.16.Nivel
de
de
de
de
de
de
de
de
de
de
de
de
de
de
de
de
precedencia
precedencia
precedencia
precedencia
precedencia
precedencia
precedencia
precedencia
precedencia
precedencia
precedencia
precedencia
precedencia
precedencia
precedencia
precedencia
1 .
2 .
3 .
4 .
5 .
6 .
7 .
8 .
9 .
10
11
12
13
14
15
16
. . . . . . . . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
xi
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
14
197
198
198
198
198
198
198
199
199
199
199
199
199
199
200
200
ndice de figuras
3.1. Situacin de error por no proporcionar un constructor de copia adecuado 38
4.1. Inclusin de la misma definicin de clase dos veces . . . . . . . . . . .
D.1. Pgina web del editor JOE . . . . . . . .
D.2. JOE: ficha de ayuda 1 . . . . . . . . . . .
D.3. JOE: ficha de ayuda 2 . . . . . . . . . . .
D.4. JOE: ficha de ayuda 3 . . . . . . . . . . .
D.5. JOE: ficha de ayuda 4 . . . . . . . . . . .
D.6. JOE: ficha de ayuda 5 . . . . . . . . . . .
D.7. JOE: ficha de ayuda 6 . . . . . . . . . . .
D.8. Pgina web del editor vim . . . . . . . . .
D.9. Principales opciones del editor vim . . . .
D.10.Pgina web de gdb . . . . . . . . . . . . .
D.11.Ejemplo de sesin de depuracin con gdb
D.12.Pgina web de Valgrind . . . . . . . . . .
xiii
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
62
209
210
210
210
211
211
211
213
216
217
219
224
Captulo 1
Introduccin
En este captulo se realiza una pequea introduccin del libro, se explican sus objetivos
y se presenta el contenido de cada uno de los captulos. Adems, tambin se comentan
las convenciones tipogrficas empleadas.
ndice General
1.1.
1.1. Introduccin . . . . . . . . . . . . . . . . . . . . . . . . . .
Introduccin
Captulo 1. Introduccin
1.2.
Ventajas de C++
1.3.
Este libro no es, ni mucho menos, una referencia del lenguaje C++. Tampoco
es un libro sobre programacin orientada a objetos. Entonces, qu es? El objetivo
de este libro es proporcionar un material de aprendizaje breve y sencillo, donde se
presenten los conceptos bsicos del lenguaje C++ relacionados con la orientacin a
objetos conforme se vayan necesitando y paso por paso. Siguiendo el principio de
Pareto de que el 20 % de algo es el responsable del 80 % del resultado, en este libro
slo se explica una pequea parte de C++, pero que se puede considerar que es la
ms importante.
1.4.
Este libro se compone de 9 captulos y 5 apndices, adems de varios ndices (cuadros, figuras, etc.) que facilitan la bsqueda de informacin y la bibliografa recomendada.
El el Captulo 2 (Clases y objetos) se introducen los conceptos de clase y objeto, los elementos principales de la programacin orientada a objetos. Se explica cmo
declarar una clase y cmo crear objetos a partir de ella. Adems, se explica la separacin de la interfaz y la implementacin, lo que posibilita estructurar el cdigo en varios ficheros para permitir la compilacin separada. Por ltimo, se comentan algunos
aspectos relacionados con los ficheros de encabezado y los espacios de nombres.
Captulo 1. Introduccin
TFecha.
Finalmente, este libro termina con la (Bibliografa recomendada), donde se
incluye una serie de libros sobre el lenguaje C++. Adems, tambin se incluyen algunos enlaces a pginas de Internet donde se puede encontrar ms informacin sobre
el lenguaje C++ o sobre herramientas de programacin.
1.5.
Todo el cdigo que se muestra en este libro ha sido compilado en Linux con el
compilador g++ de GNU versin 3.3.2. Los mensajes de error que se recogen en este
documento han sido generados por dicho compilador y pueden variar entre distintas
versiones y, evidentemente, entre distintos compiladores.
Los ejemplos de cdigo estn basados en C++ estndar, por lo que se pueden
compilar sin problemas con otros compiladores que cumplan el estndar.
1.6.
Convenciones tipogrficas
#include <iostream>
2
3
4
5
6
7
8
9
int
main(void)
{
int i;
TCoordenada p1;
10
return 0;
11
12
Los nmeros de lnea permiten hacer referencia a una lnea concreta del cdigo.
Los ejemplos parciales, que por s solos no se pueden compilar y que normalmente complementan o corrigen un ejemplo completo que ha aparecido anteriormente,
tambin aparecen destacados y numerados de la siguiente forma:
1
2
3
Captulo 1. Introduccin
class NombreClase {
// Contenido de la clase
};
Tambin se ha empleado la notacin anterior para indicar las ordenes que se pueden
ejecutar desde la lnea de comandos del sistema operativo. Por ejemplo:
1
Captulo 2
Clases y objetos
En este captulo se introducen los conceptos de clase y objeto, los elementos principales
de la programacin orientada a objetos. Se explica cmo declarar una clase y cmo crear
objetos a partir de ella. Adems, se explica la separacin de la interfaz y la implementacin,
lo que posibilita estructurar el cdigo en varios ficheros para permitir la compilacin
separada. Por ltimo, se comentan algunos aspectos relacionados con los ficheros de
encabezado y los espacios de nombres.
ndice General
2.1. Introduccin . . . . . . . . . . . . . . . . . . . .
2.2. Declaracin de una clase . . . . . . . . . . . . .
2.3. Acceso a los miembros de una clase . . . . . .
2.4. Control de acceso . . . . . . . . . . . . . . . . .
2.5. Visualizacin de un objeto . . . . . . . . . . . .
2.6. Empleo de punteros . . . . . . . . . . . . . . . .
2.7. Separacin de la interfaz y la implementacin
2.8. La herramienta make . . . . . . . . . . . . . . .
2.9. Ficheros de encabezado . . . . . . . . . . . . . .
2.10. Uso de espacios de nombres . . . . . . . . . . .
2.11. Ejercicios de autoevaluacin . . . . . . . . . . .
2.12. Ejercicios de programacin . . . . . . . . . . . .
2.12.1. Clase TVector . . . . . . . . . . . . . . . . . .
2.12.2. Clase TCalendario . . . . . . . . . . . . . . . .
2.13. Respuesta a los ejercicios de autoevaluacin .
2.14. Respuesta a los ejercicios de programacin . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
8
10
11
12
16
18
19
23
24
25
26
28
28
28
28
30
2.1.
. . . . . . . . . . . . . . . . . . . . . . . .
30
30
Introduccin
1
2
3
4
5
6
7
8
#include <iostream>
2
3
4
5
6
7
8
9
int
main(void)
{
int i;
TCoordenada p1;
10
return 0;
11
12
2.1. Introduccin
que debera generar un fichero ejecutable llamado ejem1. Sin embargo, si se compila el cdigo anterior, se producen los siguientes mensajes de error:
Salida ejemplo 2.1
1
2
3
4
5
10
2.2.
En C++, se emplea la palabra reservada class4 para crear una clase. La construccin
class NombreClase {
// Contenido de la clase
};
1
2
3
1
2
3
Una vez que se define una clase, el nombre de la clase se vuelve un nombre de
un tipo nuevo y se puede emplear para declarar variables que representan objetos de
dicha clase. Por ejemplo, si tomamos el cdigo del apartado anterior que produca
un error y le aadimos la declaracin que acabamos de ver, el cdigo compilar sin
problemas:
Ejemplo 2.2
1
#include <iostream>
2
3
4
5
6
7
class TCoordenada {
int x, y, z;
};
8
9
10
11
12
13
int
main(void)
{
int i;
TCoordenada p1;
14
return 0;
15
16
2.3.
11
El acceso a los miembros de una clase se realiza mediante los operadores de acceso
a miembros: el operador punto . y el operador flecha -> (el signo menos y el
smbolo mayor que, sin espacio intermedio).
El operador punto accede a un miembro de una clase mediante el nombre de la
variable del objeto o mediante una referencia al objeto. Por ejemplo, para mostrar
por pantalla los datos que contiene un objeto TCoordenada, se puede emplear:
1
TCoordenada p1;
2
3
4
5
TCoordenada p1;
TCoordenada *ptr1 = &p1;
3
4
5
6
#include <iostream>
2
3
4
5
6
7
class TCoordenada {
int x, y, z;
};
8
9
10
11
12
13
int
main(void)
{
int i;
TCoordenada p1;
14
15
16
p1.x = 1;
p1.y = 2;
12
17
18
return 0;
19
20
2.4.
Control de acceso
// nSegundos = 920
class THora {
int nSegundos;
};
5
6
// hora = "00:15:20"
5 Vase
http://www.swatch.com/internettime/.
7
8
9
13
class THora {
char *hora;
};
10
11
12
13
14
// beat = 7.1
class THora {
float beat;
};
15
16
17
18
19
class UnaClase {
public:
// Parte pblica
// Normalmente, slo funciones
protected:
// Parte protegida
// Funciones y datos
6
7
8
9
private:
// Parte privada
// Normalmente, datos y funciones auxiliares
10
11
12
6 Las
14
public:
Descripcin
Accesible tanto desde la propia clase como desde funciones ajenas a la clase
private:
protected:
13
14
};
Por tanto, para poder acceder directamente a los datos de una clase desde la
funcin main() se tiene que incluir el especificador de acceso a miembros public:,
tal como se muestra en el siguiente ejemplo:
Ejemplo 2.4
1
#include <iostream>
2
3
4
5
6
7
8
class TCoordenada {
public:
int x, y, z;
};
9
10
11
12
13
14
int
main(void)
{
int i;
TCoordenada p1;
15
16
17
18
p1.x = 1;
p1.y = 2;
p1.z = 3;
19
20
cout << "(" << p1.x << ", " << p1.y << ", " << p1.z << ")" << endl;
15
21
return 0;
22
23
(1, 2, 3)
Sin embargo, como se ha dicho al principio de este apartado, una de las caractersticas bsicas de la programacin orientada a objetos es la ocultacin de informacin.
Para qu? Para limitar su empleo a lo estrictamente deseado por el programador de
la clase. Por ejemplo, en la clase TCoordenada del ejemplo anterior, el programador
puede desear que las componentes no tomen valores negativos. Por tanto, los datos del
ejemplo anterior deberan de declararse como privado. En ese caso, cmo se puede
acceder a ellos?
La solucin es proporcionar una serie de funciones que permitan acceder a los
datos de una clase, para su inicializacin, consulta y modificacin. Estas funciones
normalmente llevan los prefijos set o get segn se empleen para inicializar/modificar
o consultar (leer) el valor de los datos, aunque no necesitan que especficamente se
les llame as. Aunque puede parecer que emplear las funciones set y get es lo mismo
que hacer pblicos los datos miembro, el empleo de estas funciones permite controlar
su utilizacin
En el siguiente ejemplo, se han aadido las funciones setX(), setY() y setZ()
para inicializar y modificar los datos de la clase y las funciones getX(), getY() y
getZ() para recuperar los datos:
Ejemplo 2.5
1
#include <iostream>
2
3
4
5
6
7
8
9
class TCoordenada
public:
void setX(int
void setY(int
void setZ(int
{
xx) {x = xx;}
yy) {y = yy;}
zz) {z = zz;}
10
11
12
13
14
15
private:
16
16
17
};
18
19
20
21
22
23
int
main(void)
{
int i;
TCoordenada p1;
24
p1.setX(1);
p1.setY(2);
p1.setZ(3);
25
26
27
28
cout
cout
cout
cout
29
30
31
32
<<
<<
<<
<<
33
return 0;
34
35
(1, 2, 3)
2.5.
Visualizacin de un objeto
3
4
17
Sin embargo, C++ permite que el usuario pueda definir como realizar la entrada/salida para los objetos definidos por l mismo. Esta caracterstica, que se conoce
como sobrecarga de los operadores de entrada/salida, se explicar en la Seccin 5.15.
Hasta entonces, podemos aadir a la clase TCoordenada una funcin miembro, que
hemos llamado Imprimir(), que muestra por la salida estndar (cout) el contenido
del objeto sobre la que se invoca:
Ejemplo 2.6
1
#include <iostream>
2
3
4
5
6
7
8
9
class TCoordenada
public:
void setX(int
void setY(int
void setZ(int
{
xx) {x = xx;}
yy) {y = yy;}
zz) {z = zz;}
10
11
12
13
14
15
16
17
18
19
20
void Imprimir(void) {
cout << "(" << x;
cout << ", " << y;
cout << ", " << z;
cout << ")";
}
21
22
23
24
private:
int x, y, z;
};
25
26
27
28
29
30
int
main(void)
{
int i;
TCoordenada p1, p2;
31
32
33
34
35
p1.setX(1);
p1.setY(2);
p1.setZ(3);
18
36
37
38
39
p1.Imprimir();
cout << endl;
p2.Imprimir();
cout << endl;
40
41
42
43
44
return 0;
45
46
(1, 2, 3)
(4, 5, 6)
2.6.
Empleo de punteros
TCoordenada p1;
TCoordenada *ptr1 = &p1;
3
4
5
ptr1->x = 1;
(*ptr1).x = 1;
19
Ejemplo 2.7
1
#include <iostream>
2
3
4
5
6
7
8
class TCoordenada {
public:
int x, y, z;
};
9
10
11
12
13
14
15
int
main(void)
{
int i;
TCoordenada p1;
TCoordenada *ptr1 = &p1;
16
ptr1->x = 1;
*ptr1.x = 1;
17
18
19
return 0;
20
21
2.7.
(*ptr1).x = 1;
20
o .cpp segn el compilador). A los usuarios de la clase no es necesario proporcionarles el archivo fuente, sino el cdigo una vez compilado que genera un archivo objeto
(extensin .o o .obj). Por tanto10 :
.h: Archivo de cabecera. Contiene la declaracin de la clase: las estructuras de
datos y los prototipos de las funciones. En este fichero es necesario incluir los
ficheros de cabecera necesarios para el funcionamiento de la clase, como por
ejemplo, iostream, string, cmath, etc.
.cc: Archivo fuente. Contiene el cdigo de cada uno de los mtodos que aparecen
en el fichero .h. En este fichero es necesario incluir el fichero de cabecera que
contiene la declaracin de la clase.
.o: Archivo objeto. Este fichero se crea automticamente al compilar el archivo
fuente.
Los archivos de cabecera se incluyen en el cdigo del usuario mediante sentencias
#include. Los archivos de cabecera propios se encierran entre comillas ("") en lugar
de los smbolos de menor y mayor que (<>). Normalmente, se tienen que situar los
archivos de cabecera en el mismo directorio que los archivos que emplean los archivos
de cabecera. Si se emplea (<>) el compilador asumir que el archivo de cabecera es
parte de la biblioteca estndar de C++ y no buscar el archivo en el directorio actual.
Por ejemplo, a continuacin se incluye el fichero tcoordenada.h:
Ejemplo 2.8
1
#include <iostream>
2
3
4
5
6
7
8
9
class TCoordenada {
public:
void setX(int);
void setY(int);
void setZ(int);
10
11
12
13
int getX(void);
int getY(void);
int getZ(void);
14
15
void Imprimir(void);
16
17
18
19
private:
int x, y, z;
};
10 Extensiones
21
#include "tcoordenada.h"
2
3
4
5
6
void
TCoordenada::setX(int xx) {
x = xx;
}
7
8
9
10
11
void
TCoordenada::setY(int yy) {
y = yy;
}
12
13
14
15
16
void
TCoordenada::setZ(int zz) {
z = zz;
}
17
18
19
20
21
int
TCoordenada::getX(void) {
return x;
}
22
23
24
25
26
int
TCoordenada::getY(void) {
return y;
}
27
28
29
30
31
int
TCoordenada::getZ(void) {
return z;
}
32
33
34
35
36
37
38
39
void
TCoordenada::Imprimir(void) {
cout << "(" << x;
cout << ", " << y;
cout << ", " << z;
cout << ")";
}
Cuando se definen las funciones miembro de una clase fuera de sta, el nombre
22
#include <iostream>
2
3
4
5
#include "tcoordenada.h"
6
7
8
9
10
11
int
main(void)
{
int i;
TCoordenada p1;
12
p1.setX(1);
p1.setY(2);
p1.setZ(3);
13
14
15
16
p1.Imprimir();
cout << endl;
17
18
19
return 0;
20
21
g++ -c tcoordenada.cc
g++ -c main.cc
g++ -o main main.o tcoordenada.o
Mucho trabajo para tan poca cosa. Qu ocurre en un proyecto real con cientos
o miles de ficheros? Cmo nos acordamos de la forma de compilar un proyecto?
Para facilitar esta labor, existe la herramienta make, que automatiza el proceso de
compilacin.
11 El operador de resolucin de alcance tambin se emplea con los espacios de nombres (ver Seccin 2.10) y para acceder a los miembros estticos de una clase (informacin propia de una clase que
es compartida por todos los objetos creados a partir de la clase).
2.8.
23
La herramienta make
3
4
5
6
7
8
OBJ=main.o tcoordenada.o
COMP=g++
OPC=-g
4
5
6
main: $(OBJ)
$(COMP) $(OPC) $(OBJ) -o main
7
8
9
10
11
12
24
2.9.
Ficheros de encabezado
Hay que llevar cuidado y no confundir string.h (librera de C), cstring (librera
de C adaptada para ser usada en C++) y string (librera de C++).
2.10.
25
namespace Espacio1 {
int a;
}
4
5
6
namespace Espacio2 {
int a;
13 Se incorpor al lenguaje en julio de 1998, por lo que existen muchos desarrollos previos que no
lo emplean.
26
8
9
10
11
12
2.11.
Ejercicios de autoevaluacin
27
c) &
d ) Las anteriores respuestas no son correctas
5. En el fichero .h de una clase se almacena:
a)
b)
c)
d)
La declaracin de la clase
El cdigo de cada una de las funciones miembro de una clase
El programa principal de una clase
Las anteriores respuestas no son correctas
protected
hidden
private
public
28
2.12.
Ejercicios de programacin
2.12.1.
Clase TVector
2.12.2.
Clase TCalendario
Definid en C++ la clase TCalendario que contiene una fecha (representada mediante tres variables enteras para el da, mes y ao) y un mensaje (representado
mediante un vector dinmico de caracteres).
2.13.
29
b) (X) ->
c) &
d ) Las anteriores respuestas no son correctas
5. En el fichero .h de una clase se almacena:
a) (X)La declaracin de la clase
b) El cdigo de cada una de las funciones miembro de una clase
c) El programa principal de una clase
d ) Las anteriores respuestas no son correctas
6. Para qu sirve una clase?
a) Para encapsular datos
b) Para modelar objetos del mundo real
c) Para simplificar la reutilizacin de cdigo
d ) (X) Todas las respuestas son correctas
7. Cul no es un nivel de visibilidad en C++?
a) protected
b) (X) hidden
c) private
d ) public
8. Cul es una declaracin correcta de una clase?
a) (X) class A {int x;};
b) class B { }
c) public class A { }
d ) object A {int x;};
9. Un espacio de nombres se emplea para:
a) Definir una funcin miembro fuera de la definicin de su clase.
b) (X) Evitar la colisin de nombres de los identificadores (nombres
de variables, funciones, etc.)
c) Lograr un aumento de la velocidad de ejecucin del cdigo.
d ) Todas las respuestas son correctas.
10. El operador de mbito se emplea para:
30
2.14.
2.14.1.
Clase TVector
Ejemplo 2.13
1
2
3
4
5
class TVector {
private:
int dimension;
int *datos;
};
2.14.2.
Clase TCalendario
Ejemplo 2.14
1
2
3
4
5
class TCalendario {
private:
int dia, mes, anyo;
char *mensaje;
};