You are on page 1of 44

C++ paso a paso

Sergio Lujn Mora

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

4. Funciones y clases amigas y reserva de memoria

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

E. Cdigo de las clases

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

4. Funciones y clases amigas y reserva de memoria


4.1. Introduccin . . . . . . . . . . . . . . . . . . . . . . . . . .
4.2. Declaracin de amistad . . . . . . . . . . . . . . . . . . .
4.3. Guardas de inclusin . . . . . . . . . . . . . . . . . . . . .
4.4. Administracin de memoria dinmica . . . . . . . . . . . .
4.5. Administracin de memoria dinmica y arrays de objetos
4.6. Compilacin condicional . . . . . . . . . . . . . . . . . . .
4.7. Directivas #warning y #error . . . . . . . . . . . . . . . .
4.8. Ejercicios de autoevaluacin . . . . . . . . . . . . . . . . .
4.9. Ejercicios de programacin . . . . . . . . . . . . . . . . .
4.9.1. Clase TVector . . . . . . . . . . . . . . . . . . . .
4.9.2. Clase TCalendario . . . . . . . . . . . . . . . . . .
4.10. Respuesta a los ejercicios de autoevaluacin . . . . . . . .
4.11. Respuesta a los ejercicios de programacin . . . . . . . . .
4.11.1. Clase TVector . . . . . . . . . . . . . . . . . . . .
4.11.2. Clase TCalendario . . . . . . . . . . . . . . . . . .

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

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 . . . . . . . . . . . .

E. Cdigo de las clases


E.1. La clase TCoordenada
E.2. La clase TLinea . . . .
E.3. La clase TVector . . .
E.4. La clase TCalendario .

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
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 . . . . . . . . . . . . . . . . . . . . . . . . . .

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 . . . . . . . . . . . . . . . . . .

Introduccin

El lenguaje de programacin C++ es uno de los ms empleados en la actualidad.


Se puede decir que C++ es un lenguaje hbrido, ya que permite programar tanto en
estilo procedimental (como si fuese C), como en estilo orientado a objetos, como en
ambos a la vez. Adems, tambin se puede emplear mediante programacin basada
en eventos para crear programas que usen interfaz grfico de usuario.
El nacimiento de C++ se sita en el ao 1980, cuando Bjarne Stroustrup, de
los laboratorios Bell, desarroll una extensin de C llamada C with Classes" que
permita aplicar los conceptos de la programacin orientada a objetos con el lenguaje
C. Stroustrup se bas en las caractersticas de orientacin a objetos del lenguaje de
1

Captulo 1. Introduccin

programacin Simula, aunque tambin tom ideas de otros lenguajes importantes de


la poca como ALGOL68 o ADA.
Durante los siguientes aos, Stroustrup continu el desarrollo del nuevo lenguaje
y en 1983 se acu el trmino C++.
En 1985, Bjarne Stroustrup public la primera versin de The C++ Programming
Language (Addison-Wesley, 1985), que a partir de entonces se convirti en el libro
de referencia del lenguaje.
En la actualidad, este lenguaje se encuentra estandarizado a nivel internacional con
el estndar ISO/IEC 14882:1998 con el ttulo Information Technology - Programming
Languages - C++, publicado el 1 de septiembre de 1998. En el ao 2003 se public una
versin corregida del estndar (ISO/IEC 14882:2003). Finalmente, en la actualidad
se est preparando una nueva versin del lenguaje, llamada C++0X, que se espera
que est preparada para el ao 2010.

1.2.

Ventajas de C++

Las principales ventajas que presenta el lenguaje C++ son:


Difusin: al ser uno de los lenguajes ms empleados en la actualidad, posee un
gran nmero de usuarios y existe una gran cantidad de libros, cursos, pginas
web, etc. dedicados a l.
Versatilidad: C++ es un lenguaje de propsito general, por lo que se puede
emplear para resolver cualquier tipo de problema.
Portabilidad: el lenguaje est estandarizado y un mismo cdigo fuente se puede
compilar en diversas plataformas.
Eficiencia: C++ es uno de los lenguajes ms rpidos en cuanto ejecucin.
Herramientas: existe una gran cantidad de compiladores, depuradores, libreras,
etc.

1.3.

Objetivos de este libro

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. Contenido de los captulos

El libro est estructurado como soporte de un curso de 10 horas de duracin de


introduccin al lenguaje C++. Los captulos principales, del 2 al 6, constituyen las 5
sesiones del curso, con una duracin de 2 horas por sesin. Todas las explicaciones van
acompaadas de ejemplos, seguidos de ejecuciones que muestran la entrada/salida del
ejemplo para afianzar los conceptos. Es aconsejable que el lector lea este libro delante
del ordenador, pruebe los ejemplos y los modifique para comprender mejor su funcionamiento. Adems, al final de cada captulo se proponen ejercicios de autoevaluacin
y de programacin, todos ellos con sus correspondientes soluciones.
En este libro, suponemos que los lectores (alumnos del curso) poseen unos conocimientos mnimos sobre programacin en general. Adems, tambin suponemos que
los alumnos conocen la sintaxis bsica de C, C++, Java o JavaScript, por lo que este
libro no explica las sentencias bsicas del lenguaje (sentencias condicionales, bucles,
etc.) o los diferentes tipos de datos que se pueden emplear (entero, carcter, etc.). De
todos modos, en los apndices del libro se incluyen las palabras clave, los operadores
y las sentencias del lenguaje C++.
La principal aportacin de este libro, frente a otros libros similares, es que en
este libro hemos querido reflejar los problemas a los que se enfrenta un lector cuando
aprende un lenguaje de programacin nuevo. La mayora de los libros suponen que el
lector no va a cometer errores, por lo que no hacen ninguna referencia a los posibles
problemas de compilacin del cdigo o de comprensin de los conceptos explicados.
Sin embargo, en este libro hemos optado por incluir algunos ejemplos con errores para
mostrar los mensajes que genera el compilador. Adems, en algunos apartados hemos
dejado planteadas preguntas para que el lector pruebe y descubra la respuesta por s
mismo.
Por ltimo, este libro posee un captulo dedicado en su totalidad a los errores
ms comunes que se cometen al programar con C++. Este captulo, que es toda
una novedad frente a otros libros similares, se puede emplear de dos formas: como
material de aprendizaje o como referencia para buscar la solucin frente a un error
que se resiste a nuestros intentos por solucionarlo.

1.4.

Contenido de los captulos

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

En el Captulo 3 (Constructor y destructor) se introducen los conceptos de


constructor y destructor, funciones miembro especiales de una clase que se invocan
automticamente al crear o eliminar un objeto. Como en C++ una clase puede tener
varios constructores con el mismo nombre de funcin, primero se explica la sobrecarga
de funciones, que permite crear varias funciones con el mismo nombre.
En el Captulo 4 (Funciones y clases amigas y reserva de memoria) se
presenta el concepto de amistad entre funciones y clases. Aunque el uso de funciones
y clases amigas va en contra del principio de ocultacin de la informacin, puede ser
apropiado su uso cuando no haya otra solucin, la solucin posible sea demasiado
compleja o tenga un impacto negativo en el rendimiento del programa. Adems, se
explica la reserva y eliminacin de memoria dinmica y la compilacin condicional
que facilita el proceso de depuracin.
En el Captulo 5 (Sobrecarga de operadores) se explica cmo se pueden redefinir (sobrecargar) los operadores del lenguaje C++ para que funcionen correctamente
con las clases creadas por el usuario. Para ello, antes hace falta explicar el puntero
this, el modificador const y el paso por referencia.
En el Captulo 6 (Composicin y herencia) se introducen dos tipos de relaciones
entre objetos: la relacin tiene-un (composicin) y es-un (herencia). Estos dos
mecanismos bsicos de la programacin orientada a objetos permiten la reutilizacin
de cdigo, con las ventajas que ello conlleva.
En el Captulo 7 (Otros temas) se comentan una serie de caractersticas del lenguaje de programacin C++ que puntualizan algunos aspectos que se han presentado en los captulos anteriores: la forma cannica de una clase, las funciones de cero
parmetros, los valores por omisin de una funcin y las funciones inline.
En el Captulo 8 (Errores ms comunes) se recogen los errores ms habituales
que comete una persona cuando comienza a programar con el lenguaje de programacin C++.
En el Captulo 9 (Ejercicios) se proponen una serie de ejercicios complementarios
a los propuestos a lo largo del libro.
Adems, el libro tambin posee una serie de apndices que complementan la informacin tratada a lo largo de los captulos. En concreto, en el Apndice A (Palabras
clave) se listan y describen brevemente las palabras clave del lenguaje C++.
En el Apndice B (Operadores) se explican los diferentes operadores del lenguaje
C++, con su precedencia y asociatividad.
En el Apndice C (Sentencias) se incluye un resumen de la sintaxis de las sentencias del lenguaje C++. El objetivo de este apndice es que sirva como una gua
rpida de bsqueda en caso de duda.
En el Apndice D (Herramientas) se comentan algunas de las herramientas que
pueden ayudar a la hora de programar con el lenguaje C++: el editor JOE, el editor
vim, el depurador gdb, el depurador Valgrind y el compresor/descompresor tar.
En el Apndice E (Cdigo de las clases) se incluye el cdigo completo de las
cuatro clases desarrolladas a lo largo del libro: TCoordenada, TLinea, TVector y

1.5. Sistema operativo y compilador

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.

Sistema operativo y compilador

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

Con el fin de mejorar la legibilidad del texto, distintas convenciones tipogrficas


se han empleado a lo largo de todo el libro.
Los ejemplos, que normalmente estn completos y por tanto se pueden escribir y
probar, aparecen destacados y numerados dentro de una caja de la siguiente forma
(el texto de los ejemplos emplea un tipo de letra de paso fijo como Courier):
Ejemplo 1.1
1

#include <iostream>

2
3

using namespace std;

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

g++ -o ejem1 ejem1.cc

La salida que genera un cdigo de ejemplo o un programa como el compilador


cuando un cdigo presenta errores, se muestra destacada con el siguiente formato:
Salida ejemplo 1.1
1
2
3
4
5

ejem1.cc: In function int main():


ejem1.cc:9: TCoordenada undeclared (first use this function)
ejem1.cc:9: (Each undeclared identifier is reported only once for
each function it appears in.)
ejem1.cc:9: syntax error before ; token

El ttulo de la salida hace referencia al ejemplo que lo produce.


Por ltimo, los estilos empleados a lo largo del texto son:
Los nombres de los programas se muestran con un tipo de letra sin palo (sans
serif). Ejemplo: Linux, g++, gdb, etc.
Las palabras no escritas en espaol aparecen destacadas en cursiva. Ejemplo:
layering, link, etc.
Las extensiones de los ficheros, las palabras clave de los lenguajes de programacin y el cdigo incluido dentro del texto se muestra con un tipo de letra de
paso fijo como Courier. Ejemplo: .cc, g++, int a = 10;, etc.
Los trminos importantes, cuando aparecen por primera, se destacan con un
tipo de letra sin palo (sans serif) y en negrita. Ejemplo: clase, ocultacin de
informacin, operador de resolucin de alcance, etc.

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

Captulo 2. Clases y objetos


2.14.1. Clase TVector

2.1.

. . . . . . . . . . . . . . . . . . . . . . . .

30

2.14.2. Clase TCalendario . . . . . . . . . . . . . . . . . . . . . .

30

Introduccin

La programacin orientada a objetos se basa en encapsular datos (atributos) y


funciones o mtodos (comportamientos) juntos en estructuras llamadas clases. Las
clases se emplean para modelar objetos del mundo real.
Una clase se puede instanciar para crear diversos objetos. Los objetos se declaran
como las variables de los tipos bsicos del lenguaje C++ (int, float, bool, etc.). Por
ejemplo, suponiendo que existe una clase llamada TCoordenada, las declaraciones:
// Declaracin de un objeto
TCoordenada objetoP1;
// Declaracin de un array
TCoordenada arrayP2[10];
// Declaracin de un puntero
TCoordenada *ptrP3 = &objetoP1;
// Declaracin de una referencia
TCoordenada &refP4 = objetoP1;

1
2
3
4
5
6
7
8

declaran objetoP1 como una variable de tipo TCoordenada, arrayP2 como un


array de 10 elementos de tipo TCoordenada, ptrP3 como un puntero a un objeto de
tipo TCoordenada y refP4 como una referencia a un objeto de tipo TCoordenada.
Por ejemplo, el siguiente cdigo incluye la declaracin de un objeto llamado p1
que es una instancia de la clase TCoordenada que representa coordenadas o puntos
en el espacio:
Ejemplo 2.1
1

#include <iostream>

2
3

using namespace std;

4
5
6
7
8
9

int
main(void)
{
int i;
TCoordenada p1;

10

return 0;

11
12

2.1. Introduccin

En este ejemplo, la instruccin #include <iostream> incluye el contenido del


archivo de encabezado1 de flujo de estrada/salida (input output stream) en el cdigo del programa. La sentencia using namespace std; permite el acceso a todos
los miembros definidos en el espacio de nombres2 std que se emplea en el archivo
iostream.
En C++, el cdigo fuente de los programas suele tener las extensiones .cpp,
.cxx, .cc o .c, segn el compilador que se emplee. El cdigo fuente en C++ se tiene
que traducir a cdigo mquina (cdigo objeto) para que se pueda ejecutar. Para ello,
se tiene que compilar el cdigo fuente mediante una serie de programas que realizan
distintas funciones:
1. Preprocesador.
2. Compilador.
3. Enlazador.
En el entorno Linux, se suele emplear la extensin .cc para los ficheros con el cdigo
fuente y para compilar se emplea el programa g++. Si suponemos que el cdigo del
ejemplo anterior est almacenado en un archivo llamado ejem1.cc, el comando para
compilarlo es3 :
1

g++ -o ejem1 ejem1.cc

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

ejem1.cc: In function int main():


ejem1.cc:9: TCoordenada undeclared (first use this function)
ejem1.cc:9: (Each undeclared identifier is reported only once for
each function it appears in.)
ejem1.cc:9: syntax error before ; token

Qu est pasando? El compilador no reconoce TCoordenada como algo vlido del


lenguaje. Aunque el cdigo sea correcto desde un punto de vista sintctico, desde un
punto de vista semntico no es correcto porque TCoordenada no tiene significado:
falta la declaracin de la clase TCoordenada.
1 Para

ms informacin sobre archivos de encabezado, consultar la Seccin 2.9.


ms informacin sobre espacios de nombres, consultar la Seccin 2.10.
3 Para ms informacin sobre la compilacin, consultar la Seccin 2.8.
2 Para

10

Captulo 2. Clases y objetos

2.2.

Declaracin de una clase

En C++, se emplea la palabra reservada class4 para crear una clase. La construccin
class NombreClase {
// Contenido de la clase
};

1
2
3

se denomina definicin de clase o declaracin de clase. Una clase se compone de


datos y funciones miembro, que se conocen en general como miembros de la clase.
Por ejemplo, el siguiente cdigo declara la clase TCoordenada que contiene tres datos
miembro de tipo entero que representan las coordenadas (x, y, z) de un punto en el
espacio:
class TCoordenada {
int x, y, z;
};

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

using namespace std;

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

El cdigo anterior se compila sin errores. Si se ejecuta, no produce resultados


visibles. Cmo podemos acceder a los miembros (datos y funciones) de una clase?
4 Tambin se puede emplear struct, aunque ms adelante se ver que existe una diferencia en el
control de acceso a los datos o funciones miembro.

2.3. Acceso a los miembros de una clase

2.3.

11

Acceso a los miembros de una clase

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

cout << "Componente x: " << p1.x << endl;


cout << "Componente y: " << p1.y << endl;
cout << "Componente z: " << p1.z << endl;

El operador flecha accede a un miembro de una clase mediante un puntero al


objeto. Por ejemplo, para mostrar por pantalla los datos del objeto p1 mediante el
puntero ptr1:
1
2

TCoordenada p1;
TCoordenada *ptr1 = &p1;

3
4
5
6

cout << "Componente x: " << ptr1->x << endl;


cout << "Componente y: " << ptr1->y << endl;
cout << "Componente z: " << ptr1->z << endl;

Por ejemplo, el siguiente cdigo crea un objeto llamado p1 a partir de la clase


TCoordenada e inicializa sus datos a los valores 1, 2 y 3:
Ejemplo 2.3
1

#include <iostream>

2
3

using namespace std;

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

Captulo 2. Clases y objetos


p1.z = 3;

17
18

return 0;

19
20

Si se compila el cdigo anterior, se producen los siguientes mensajes de error:


Salida ejemplo 2.3
1
2
3
4
5
6
7

ejem3.cc: In function int main():


ejem3.cc:6: int TCoordenada::x is private
ejem3.cc:15: within this context
ejem3.cc:6: int TCoordenada::y is private
ejem3.cc:16: within this context
ejem3.cc:6: int TCoordenada::z is private
ejem3.cc:17: within this context

El compilador nos informa de que los datos x, y y z de la clase TCoordenada no son


accesibles desde el contexto de la funcin main(). Qu est pasando? Qu significa
is private?

2.4.

Control de acceso

Una de las caractersticas bsicas de la programacin orientada a objetos es la


ocultacin de informacin. La idea es ocultar (impedir el acceso) a la implementacin
de una clase (bsicamente, los datos que se utilizan en una clase) a los posibles usuarios
de una clase. Para qu? De este modo, los usuarios de la clase la pueden utilizar y
obtener los mismos resultados sin darse cuenta de que la implementacin ha cambiado.
Por qu puede cambiar la implementacin de una clase? Por diversas razones. Por
ejemplo, una clase que represente un hora, la puede almacenar internamente como el
nmero de segundos transcurridos a partir de medianoche, como una cadena donde
se almacena la hora con un formato textual, como el nmero de beats de la hora de
Internet5 o como horas, minutos y segundos almacenados por separado. Por ejemplo,
en el siguiente cdigo aparecen tres posibles implementaciones de la clase hora y cmo
se almacenaran las 12 horas, 15 minutos y 20 segundos:
1
2
3
4

// nSegundos = 920
class THora {
int nSegundos;
};

5
6

// hora = "00:15:20"
5 Vase

http://www.swatch.com/internettime/.

2.4. Control de acceso

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

// horas = 0, minutos = 15, segundos = 20


class THora {
int horas, minutos, segundos;
};

En C++, el modo de acceso predeterminado a los miembros de una clase se llama


privado (private). Slo se puede acceder a la parte privada de una clase mediante
funciones miembros y funciones y clases amigas6 de dicha clase. Por otro lado, en
C++, una estructura (struct) es una clase (class) cuyo modo de acceso es pblico
por defecto.
El modo de acceso, tanto de una clase como de una estructura, se puede modificar
mediante las etiquetas public:, private: y protected: que se denominan especificadores de acceso a miembros. El modo de acceso predeterminado para una clase es
private:, por tanto, todos los miembros despus del inicio de la declaracin de la clase y antes del primer especificador de acceso a miembros son privados. A continuacin
de cada especificador de acceso a miembros, se mantiene el modo especificado hasta
el siguiente especificador de acceso o hasta que finalice la declaracin de la clase con
la llave de cierre. Se pueden mezclar los especificadores de acceso a miembros, pero no
es lo comn, ya que puede resultar confuso. En el Cuadro 2.1 se resume el significado
de los tres modos de acceso. El siguiente cdigo muestra la estructura bsica de una
clase en C++:
1
2
3
4

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

funciones y clases amigas se explican en el Captulo 4.

14

Captulo 2. Clases y objetos

public:

Descripcin
Accesible tanto desde la propia clase como desde funciones ajenas a la clase

private:

Accesible exclusivamente desde las funciones miembros y funciones y clases


amigas

protected:

Se emplea para limitar el acceso a las


clases derivadas, su funcionamiento depende del tipo de herencia que se realice

Cuadro 2.1: Especificadores de acceso

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

using namespace std;

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;

2.4. Control de acceso

15

21

return 0;

22
23

El cdigo anterior produce como salida:


Salida ejemplo 2.4
1

(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

using namespace std;

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

int getX(void) {return x;}


int getY(void) {return y;}
int getZ(void) {return z;}

14
15

private:

16

Captulo 2. Clases y objetos


int x, y, z;

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

<<
<<
<<
<<

"(" << p1.getX();


", " << p1.getY();
", " << p1.getZ();
")" << endl;

33

return 0;

34
35

Cuando el cdigo de una funcin miembro se incluye en la propia declaracin de


la clase, la funcin se considera inline7 . Las funciones getX(), getY() y getZ() se
denominan de cero parmetros8 porque no reciben argumentos.
El cdigo anterior produce otra vez como salida:
Salida ejemplo 2.5
1

(1, 2, 3)

2.5.

Visualizacin de un objeto

El lenguaje C++ proporciona un extenso conjunto de funciones de entrada/salida.


C++ es capaz de visualizar los tipos bsicos (int, float, etc.). Sin embargo, no es
capaz de visualizar los tipos creados por el usuario, como por ejemplo un objeto de
una clase.
Hasta ahora, para visualizar el contenido de un objeto TCoordenada se han empleado instrucciones como el siguiente fragmento de cdigo:
1
2

cout << "(" << p1.getX();


cout << ", " << p1.getY();
7 Para
8 Para

ms informacin sobre las funciones inline, consultar la Seccin 7.4.


ms informacin sobre las funciones de cero parmetros, consultar la Seccin 7.2.

2.5. Visualizacin de un objeto

3
4

17

cout << ", " << p1.getZ();


cout << ")" << endl;

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

using namespace std;

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

int getX(void) {return x;}


int getY(void) {return y;}
int getZ(void) {return z;}

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

Captulo 2. Clases y objetos


p2.setX(4);
p2.setY(5);
p2.setZ(6);

36
37
38
39

p1.Imprimir();
cout << endl;
p2.Imprimir();
cout << endl;

40
41
42
43
44

return 0;

45
46

El cdigo anterior produce como salida:


Salida ejemplo 2.6
1
2

(1, 2, 3)
(4, 5, 6)

2.6.

Empleo de punteros

Como se ha comentado en la Seccin 2.3, el acceso a los miembros de una clase se


realiza mediante el operador punto . y el operador flecha ->.
En el caso de que la variable sea un puntero a un objeto, se puede emplear cualquiera de los operadores. Por ejemplo:
1
2

TCoordenada p1;
TCoordenada *ptr1 = &p1;

3
4
5

ptr1->x = 1;
(*ptr1).x = 1;

Las expresiones ptr1->x = 1 y (*ptr1).x = 1 son equivalentes. En el segundo


caso, se emplea el operador de desreferencia * para obtener el objeto al que apunta
el puntero y se accede al miembro x mediante el operador punto. Los parntesis son
necesarios, ya que el operador punto tiene un nivel de precedencia9 ms alto que el
operador de desreferencia del puntero. La omisin de los parntesis produce que la
expresin se evale como si los parntesis estuviesen como *(ptr1.x), que sera un
error de sintaxis.
Por ejemplo, el siguiente cdigo produce un error al ser compilado:
9 Para

ms informacin sobre los operadores y los niveles de precedencia, consultar el Apndice B.

2.7. Separacin de la interfaz y la implementacin

19

Ejemplo 2.7
1

#include <iostream>

2
3

using namespace std;

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

Si se compila el cdigo anterior, se produce el siguiente mensaje de error:


Salida ejemplo 2.7
1
2
3

ejem6.cc: In function int main():


ejem6.cc:18: request for member x in ptr1, which is of
non-aggregate type TCoordenada*

El error de compilacin se resuelve modificando la lnea 18:


1

2.7.

(*ptr1).x = 1;

Separacin de la interfaz y la implementacin

La separacin de la interfaz (el aspecto de una clase) y su implementacin facilitan


el mantenimiento de la misma. De este modo, se puede proporcionar al usuario final
de la clase la interfaz y la implementacin por separado y modificar la implementacin
sin que afecte al usuario.
La declaracin de una clase se debe colocar en un archivo de cabecera o encabezado (extensin .h), para que los usuarios lo incluyan en su cdigo. El cdigo de las
funciones miembro de la clase se debe de colocar en un archivo fuente (extensin .cc

20

Captulo 2. Clases y objetos

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

using namespace std;

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

usadas con g++ en Linux.

2.7. Separacin de la interfaz y la implementacin

21

En la declaracin de la clase hemos eliminado el cdigo de las funciones miembro


que contiene. A continuacin mostramos el cdigo del archivo fuente tcoordenada.cc;
notar como en la primera lnea del cdigo se incluye el archivo de cabecera tcoordenada.h:
Ejemplo 2.9
1

#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

Captulo 2. Clases y objetos

de la funcin es precedido por el nombre de la clase y el operador de resolucin de


alcance11 u operador de mbito ::. De este modo, se identifica de manera nica a
las funciones de una clase en particular.
Una vez que se ha separado la interfaz de la implementacin, se necesita crear un
archivo principal que contenga el cdigo de la funcin main() que emplee la clase. En
este fichero se tiene que incluir el archivo de cabecera de la clase para poderla usar.
Por ejemplo, a continuacin se incluye el cdigo de un fichero llamado main.cc:
Ejemplo 2.10
1

#include <iostream>

2
3

using namespace std;

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

Para compilar el ejemplo anterior, es necesario ejecutar los siguientes comandos:


1
2
3

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. La herramienta make

2.8.

23

La herramienta make

El propsito de la herramienta make es determinar de forma automtica qu trozos


de un programa necesitan recompilarse y qu comandos se tienen que ejecutar para
ello. make recompila un fichero fuente (objetivo) si depende de una serie de ficheros
(prerrequisitos) que se han modificado desde la ltima actualizacin o si el objetivo
no existe. Las relaciones entre los distintos ficheros objetivo y los prerrequisitos se
definen mediante reglas en un fichero makefile12 . Un ejemplo de fichero makefile
para compilar los ficheros anteriores es:
Ejemplo 2.11
1
2

main: main.o tcoordenada.o


g++ -o main main.o tcoordenada.o

3
4
5

main.o: main.cc tcoordenada.h


g++ -c main.cc

6
7
8

tcoordenada.o: tcoordenada.h tcoordenada.cc


g++ -c tcoordenada.cc

En un fichero makefile se pueden declarar variables para representar aquellas


partes que se repitan varias veces. Por ejemplo, el fichero anterior se podra escribir
como:
Ejemplo 2.12
1
2
3

OBJ=main.o tcoordenada.o
COMP=g++
OPC=-g

4
5
6

main: $(OBJ)
$(COMP) $(OPC) $(OBJ) -o main

7
8
9

main.o: main.cc tcoordenada.h


$(COMP) $(OPC) -c main.cc

10
11
12

tcoordenada.o: tcoordenada.h tcoordenada.cc


$(COMP) $(OPC) -c tcoordenada.cc

En el fichero makefile anterior:


OBJ, COMP y OPC son tres variables.
12 Este fichero puede tener cualquier nombre, pero si no se emplea el nombre por defecto, se tiene
que indicar a la herramienta make con el parmetro -f.

24

Captulo 2. Clases y objetos


La variable OBJ define una serie de ficheros objetivo.
La variable COMP indica el compilador que se utiliza.
La variable OPC con el valor -g indica el nivel de depuracin: si no se desea incluir
informacin de depuracin, se puede anular dejando esta variable en blanco.
-c compila los ficheros fuente, pero no los enlaza (link ). Si no se indica un fichero
de salida (con -o), el compilador automticamente sustituye la extensin .cc
por .o.
main, main.o y tcoordenada.o son ficheros objetivo (aparecen a la izquierda
de una regla).
main.cc, main.o, tcoordenada.h, tcoordenada.cc y tcoordenada.o son ficheros prerrequisito (aparecen a la derecha de una regla). Notar que hay dos
ficheros, main.o y tcoordenada.o, que son a la vez fichero objetivo y fichero
prerrequisito.
En el proceso de creacin del ejecutable, si no se indica un nombre de fichero
de salida con -o, automticamente se crea el fichero a.out.
Las lneas que aparecen separadas del margen izquierdo estn separadas mediante tabuladores y no mediante espacios en blanco.

2.9.

Ficheros de encabezado

En C++ se distinguen dos tipos de ficheros de encabezado: C y C++. Los de C no


hacen uso de espacios de nombre y llevan el prefijo c. Por ejemplo, cstdio, cstdlib
o cstring. Los ficheros de encabezado de C++ hacen uso de espacios de nombre (el
espacio de nombres estndar std). En ambos casos, no llevan la extensin .h.
Temporalmente, es posible que estn disponibles los ficheros de cabecera antiguos
(con la extensin .h), pero no se aconseja su uso. Por tanto, a partir de ahora hay
que escribir:
1
2
3

#include <iostream> // Para usar: cin, cout, ...


#include <cstring> // Para usar: strcpy(), strcmp(), ...
#include<string>
// Para usar la clase string

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. Uso de espacios de nombres

2.10.

25

Uso de espacios de nombres

Cuando un proyecto alcanza un gran tamao, con miles o millones de lneas, se


pueden producir problemas de colisin de nombres (identificadores): variables globales, clases o funciones con el mismo nombre. La colisin de nombres tambin ocurre
frecuentemente cuando se emplean libreras de terceras partes.
En algunos lenguajes de programacin (C, Basic, etc.) no existe una solucin (el
programador la tiene que articular de algn modo). En C++ existen los espacios
de nombres13 , que permiten dividir el espacio general de nombres en subespacios
distintos e independientes. Sin embargo, an as puede persistir el problema de la
colisin de nombres, ya que no existe ningn mecanismo para garantizar que dos
espacios de nombres sean nicos.
El proceso consiste en declarar un espacio de nombres asignndole un identificador
y delimitndolo por un bloque entre llaves. Dentro de este bloque pueden declararse
los elementos correspondientes al mismo: variables, clases, funciones, etc. A diferencia
de la declaracin de una clase o estructura, un espacio de nombres no termina con
punto y coma.
Los elementos declarados dentro de un espacio de nombres son accesibles de diversos modos:
Mediante espacioNombre::miembro cada vez que se necesite, que utiliza el
operador de resolucin de alcance ::. Por ejemplo:
std::cout << "Algo";
Mediante using espacioNombre::miembro; para permitir el acceso a un miembro individual de un espacio de nombres, sin permitir un acceso general a todos
los miembros del espacio de nombres. Por ejemplo:
using std::cout;
Mediante using namespace espacioNombre;, que permite el acceso a todos los
miembros del espacio de nombres. Por ejemplo:
using namespace std;
Por ejemplo, en el siguiente cdigo se declaran dos espacios de nombres y se
muestra cmo se pueden emplear:
1
2
3

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

Captulo 2. Clases y objetos


}

8
9

using namespace Espacio2;

10
11
12

Espacio1::a = 3; // Hace falta indicar su namespace


a = 5; // Se refiere a Espacio2::a

Las libreras estndar de C++ estn definidas dentro de un espacio de nombres


llamado std. Por tanto, si se quiere evitar el tener que emplear el operador de mbito
constantemente, hay que aadir la sentencia using namespace std; justo despus
de la inclusin (#include) de las libreras en un fichero.

2.11.

Ejercicios de autoevaluacin

1. La palabra clave struct:


a) Introduce la definicin de una estructura
b) Introduce la definicin de una clase
c) Introduce la definicin de una estructura o una clase
d ) No es una palabra clave de C++
2. Los miembros de una clase especificados como private:
a) Slo son accesibles por las funciones miembro de la clase
b) Son accesibles por las funciones miembro de la clase y las funciones amigas
de la clase
c) Son accesibles por las funciones miembro de la clase, las funciones amigas
de la clase y las clases que heredan
d ) Las anteriores respuestas no son correctas
3. El acceso predeterminado para los miembros de una clase es:
a) private
b) public
c) protected
d ) No est definido
4. Si se tiene un puntero a un objeto, para acceder a los miembros de la clase se
emplea:
a) .
b) ->

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

6. Para qu sirve una clase?


a)
b)
c)
d)

Para encapsular datos


Para modelar objetos del mundo real
Para simplificar la reutilizacin de cdigo
Todas las respuestas son correctas

7. Cul no es un nivel de visibilidad en C++?


a)
b)
c)
d)

protected
hidden
private
public

8. Cul es una declaracin correcta de una clase?


a)
b)
c)
d)

class A {int x;};


class B { }
public class A { }
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) 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:
a)
b)
c)
d)

Identificar una funcin miembro cuando se define fuera de su clase.


Acceder a un elemento definido en un espacio de nombres.
Para acceder a los miembros estticos de una clase.
Todas las respuestas son correctas.

28

Captulo 2. Clases y objetos

2.12.

Ejercicios de programacin

2.12.1.

Clase TVector

Definid en C++ la clase TVector que contiene un vector dinmico de nmeros


enteros y un nmero entero que contiene la dimensin del vector.

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.

Respuesta a los ejercicios de autoevaluacin

1. La palabra clave struct:


a) (X) Introduce la definicin de una estructura
b) Introduce la definicin de una clase
c) Introduce la definicin de una estructura o una clase
d ) No es una palabra clave de C++
2. Los miembros de una clase especificados como private:
a) Slo son accesibles por las funciones miembro de la clase
b) (X) Son accesibles por las funciones miembro de la clase y las
funciones amigas de la clase
c) Son accesibles por las funciones miembro de la clase, las funciones amigas
de la clase y las clases que heredan
d ) Las anteriores respuestas no son correctas
3. El acceso predeterminado para los miembros de una clase es:
a) (X) private
b) public
c) protected
d ) No est definido
4. Si se tiene un puntero a un objeto, para acceder a los miembros de la clase se
emplea:
a) .

2.13. Respuesta a los ejercicios de autoevaluacin

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

Captulo 2. Clases y objetos


a) Identificar una funcin miembro cuando se define fuera de su clase.
b) Acceder a un elemento definido en un espacio de nombres.
c) Para acceder a los miembros estticos de una clase.
d ) (X) Todas las respuestas son correctas.

2.14.

Respuesta a los ejercicios de programacin

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;
};

You might also like