Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO Pensar en C++ (Volumen 1) - Grupo ARCO
✐ ✐ ✐ “Volumen1” — 2012/1/12 — 13:52 — page 110 — #148 ✐ Capítulo 3. C en C++ procesador, pero hay situaciones en las cuales el compilador debe estar advertido de que está tratando un nombre como si fuese un tipo, y por eso typedef es esencial. int* x, y; Esto genera en realidad un int* que es x, y un int (no un int*) que es y. Esto significa que el * añade a la derecha, no a la izquierda. Pero, si utiliza un typedef: typedef int* IntPtr; IntPtr x, y; Entonces ambos, x e y son del tipo int*. Se puede discutir sobre ello y decir que es más explícito y por consiguiente mas legible evitar typedefs para los tipos primitivos, y de hecho los programas se vuelven difíciles de leer cuando se utilizan demasiados typedefs. De todos modos, los typedefs se vuelven especialmente importantes en C cuando se utilizan con struct. 3.8.2. Usar struct para combinar variables Un struct es una manera de juntar un grupo de variables en una estructura. Cuando se crea un struct, se pueden crear varias instancias de este «nuevo» tipo de variable que ha inventado. Por ejemplo: //: C03:SimpleStruct.cpp struct Structure1 { char c; int i; float f; double d; }; int main() { struct Structure1 s1, s2; s1.c = ’a’; // Select an element using a ’.’ s1.i = 1; s1.f = 3.14; s1.d = 0.00093; s2.c = ’a’; s2.i = 1; s2.f = 3.14; s2.d = 0.00093; } ///:~ La declaración de struct debe acabar con una llave. En main(), se crean dos instancias de Structure1: s1 y s2. Cada una de ellas tiene su versión propia y separada de c, I, f y d. De modo que s1 y s2 representan bloques de variables completamente independientes. Para seleccionar uno de estos elementos dentro de s1 o s2, se utiliza un ., sintaxis que se ha visto en el cápitulo previo cuando se utilizaban objetos class de C++ - ya que las clases surgían de structs, de ahí proviene esta sintaxis. 110 ✐ ✐ ✐ ✐
✐ ✐ ✐ “Volumen1” — 2012/1/12 — 13:52 — page 111 — #149 ✐ 3.8. Creación de tipos compuestos Una cosa a tener en cuenta es la torpeza de usar Structure1 (como salta a la vista, eso sólo se requiere en C, y no en C++). En C, no se puede poner Structure1 cuando se definen variables, se debe poner struct Structure1. Aquí es donde typedef se vuelve especialmente útil en C: //: C03:SimpleStruct2.cpp // Using typedef with struct typedef struct { char c; int i; float f; double d; } Structure2; int main() { Structure2 s1, s2; s1.c = ’a’; s1.i = 1; s1.f = 3.14; s1.d = 0.00093; s2.c = ’a’; s2.i = 1; s2.f = 3.14; s2.d = 0.00093; } ///:~ Usando typedef de este modo, se puede simular (en C; intentar eliminar el t- ypedef para C++) que Structure2 es un tipo predefinido, como int o float, cuando define s1 y s2 (pero se ha de tener en cuenta de que sólo tiene información - características - y no incluye comportamiento, que es lo que se obtiene con objetos reales en C++). Observe que el struct se ha declarado al principio, porque el objetivo es crear el typedef. Sin embargo, hay veces en las que sería necesario referirse a struct durante su definición. En esos casos, se puede repetir el nombre del struct como tal y como typedef. //: C03:SelfReferential.cpp // Allowing a struct to refer to itself typedef struct SelfReferential { int i; SelfReferential* sr; // Head spinning yet } SelfReferential; int main() { SelfReferential sr1, sr2; sr1.sr = &sr2; sr2.sr = &sr1; sr1.i = 47; sr2.i = 1024; } ///:~ Si lo observa detenidamente, puede ver que sr1 y sr2 apuntan el uno al otro, guardando cada uno una parte de la información. 111 ✐ ✐ ✐ ✐
- Page 97 and 98: ✐ ✐ ✐ “Volumen1” — 2012
- Page 99 and 100: ✐ ✐ ✐ “Volumen1” — 2012
- Page 101 and 102: ✐ ✐ ✐ “Volumen1” — 2012
- Page 103 and 104: ✐ ✐ ✐ “Volumen1” — 2012
- Page 105 and 106: ✐ ✐ ✐ “Volumen1” — 2012
- Page 107 and 108: ✐ ✐ ✐ “Volumen1” — 2012
- Page 109 and 110: ✐ ✐ ✐ “Volumen1” — 2012
- Page 111 and 112: ✐ ✐ ✐ “Volumen1” — 2012
- Page 113 and 114: ✐ ✐ ✐ “Volumen1” — 2012
- Page 115 and 116: ✐ ✐ ✐ “Volumen1” — 2012
- Page 117 and 118: ✐ ✐ ✐ “Volumen1” — 2012
- Page 119 and 120: ✐ ✐ ✐ “Volumen1” — 2012
- Page 121 and 122: ✐ ✐ ✐ “Volumen1” — 2012
- Page 123 and 124: ✐ ✐ ✐ “Volumen1” — 2012
- Page 125 and 126: ✐ ✐ ✐ “Volumen1” — 2012
- Page 127 and 128: ✐ ✐ ✐ “Volumen1” — 2012
- Page 129 and 130: ✐ ✐ ✐ “Volumen1” — 2012
- Page 131 and 132: ✐ ✐ ✐ “Volumen1” — 2012
- Page 133 and 134: ✐ ✐ ✐ “Volumen1” — 2012
- Page 135 and 136: ✐ ✐ ✐ “Volumen1” — 2012
- Page 137 and 138: ✐ ✐ ✐ “Volumen1” — 2012
- Page 139 and 140: ✐ ✐ ✐ “Volumen1” — 2012
- Page 141 and 142: ✐ ✐ ✐ “Volumen1” — 2012
- Page 143 and 144: ✐ ✐ ✐ “Volumen1” — 2012
- Page 145 and 146: ✐ ✐ ✐ “Volumen1” — 2012
- Page 147: ✐ ✐ ✐ “Volumen1” — 2012
- Page 151 and 152: ✐ ✐ ✐ “Volumen1” — 2012
- Page 153 and 154: ✐ ✐ ✐ “Volumen1” — 2012
- Page 155 and 156: ✐ ✐ ✐ “Volumen1” — 2012
- Page 157 and 158: ✐ ✐ ✐ “Volumen1” — 2012
- Page 159 and 160: ✐ ✐ ✐ “Volumen1” — 2012
- Page 161 and 162: ✐ ✐ ✐ “Volumen1” — 2012
- Page 163 and 164: ✐ ✐ ✐ “Volumen1” — 2012
- Page 165 and 166: ✐ ✐ ✐ “Volumen1” — 2012
- Page 167 and 168: ✐ ✐ ✐ “Volumen1” — 2012
- Page 169 and 170: ✐ ✐ ✐ “Volumen1” — 2012
- Page 171 and 172: ✐ ✐ ✐ “Volumen1” — 2012
- Page 173 and 174: ✐ ✐ ✐ “Volumen1” — 2012
- Page 175 and 176: ✐ ✐ ✐ “Volumen1” — 2012
- Page 177 and 178: ✐ ✐ ✐ “Volumen1” — 2012
- Page 179 and 180: ✐ ✐ ✐ “Volumen1” — 2012
- Page 181 and 182: ✐ ✐ ✐ “Volumen1” — 2012
- Page 183 and 184: ✐ ✐ ✐ “Volumen1” — 2012
- Page 185 and 186: ✐ ✐ ✐ “Volumen1” — 2012
- Page 187 and 188: ✐ ✐ ✐ “Volumen1” — 2012
- Page 189 and 190: ✐ ✐ ✐ “Volumen1” — 2012
- Page 191 and 192: ✐ ✐ ✐ “Volumen1” — 2012
- Page 193 and 194: ✐ ✐ ✐ “Volumen1” — 2012
- Page 195 and 196: ✐ ✐ ✐ “Volumen1” — 2012
- Page 197 and 198: ✐ ✐ ✐ “Volumen1” — 2012
✐<br />
✐<br />
✐<br />
“Volum<strong>en</strong>1” — 2012/1/12 — 13:52 — page 110 — #148<br />
✐<br />
Capítulo 3. C <strong>en</strong> <strong>C++</strong><br />
procesador, pero hay situaciones <strong>en</strong> las cuales el compilador debe estar advertido de<br />
que está tratando un nombre como si fuese un tipo, y por eso typedef es es<strong>en</strong>cial.<br />
int* x, y;<br />
Esto g<strong>en</strong>era <strong>en</strong> realidad un int* que es x, y un int (no un int*) que es y. Esto<br />
significa que el * añade a la derecha, no a la izquierda. Pero, si utiliza un typedef:<br />
typedef int* IntPtr;<br />
IntPtr x, y;<br />
Entonces ambos, x e y son del tipo int*.<br />
Se puede discutir sobre ello y decir que es más explícito y por consigui<strong>en</strong>te mas<br />
legible evitar typedefs para los tipos primitivos, y de hecho los programas se vuelv<strong>en</strong><br />
difíciles de leer cuando se utilizan demasiados typedefs. De todos modos, los<br />
typedefs se vuelv<strong>en</strong> especialm<strong>en</strong>te importantes <strong>en</strong> C cuando se utilizan con struct.<br />
3.8.2. Usar struct para combinar variables<br />
Un struct es una manera de juntar un grupo de variables <strong>en</strong> una estructura.<br />
Cuando se crea un struct, se pued<strong>en</strong> crear varias instancias de este «nuevo» tipo<br />
de variable que ha inv<strong>en</strong>tado. Por ejemplo:<br />
//: C03:SimpleStruct.cpp<br />
struct Structure1 {<br />
char c;<br />
int i;<br />
float f;<br />
double d;<br />
};<br />
int main() {<br />
struct Structure1 s1, s2;<br />
s1.c = ’a’; // Select an elem<strong>en</strong>t using a ’.’<br />
s1.i = 1;<br />
s1.f = 3.14;<br />
s1.d = 0.00093;<br />
s2.c = ’a’;<br />
s2.i = 1;<br />
s2.f = 3.14;<br />
s2.d = 0.00093;<br />
} ///:~<br />
La declaración de struct debe acabar con una llave. En main(), se crean dos<br />
instancias de Structure1: s1 y s2. Cada una de ellas ti<strong>en</strong>e su versión propia y separada<br />
de c, I, f y d. De modo que s1 y s2 repres<strong>en</strong>tan bloques de variables completam<strong>en</strong>te<br />
indep<strong>en</strong>di<strong>en</strong>tes. Para seleccionar uno de estos elem<strong>en</strong>tos d<strong>en</strong>tro de s1 o<br />
s2, se utiliza un ., sintaxis que se ha visto <strong>en</strong> el cápitulo previo cuando se utilizaban<br />
objetos class de <strong>C++</strong> - ya que las clases surgían de structs, de ahí provi<strong>en</strong>e esta<br />
sintaxis.<br />
110<br />
✐<br />
✐<br />
✐<br />
✐