Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
✐<br />
✐<br />
✐<br />
“Volum<strong>en</strong>1” — 2012/1/12 — 13:52 — page 407 — #445<br />
✐<br />
14.3. Lista de inicializadores de un constructor<br />
MyType::MyType(int i) : Bar(i) { // ...<br />
si el constructor de Bar tuviera un solo parámetro del tipo int.<br />
14.3.1. Inicialización de objetos miembros<br />
La inicialización de objetos miembros de una clase utiliza la misma sintaxis cuando<br />
se usa la composición. Para la composición, se proporcionan los nombres de los<br />
objetos <strong>en</strong> lugar de los nombres de las clases. Si se ti<strong>en</strong>e más de una llamada al constructor<br />
<strong>en</strong> la lista de inicializadores, las llamadas se separan con comas:<br />
MyType2::MyType2(int i) : Bar(i), m(i+1) { // ...<br />
Esta sería la forma de un constructor de la clase MyType2, la cual hereda de Bar<br />
y conti<strong>en</strong>e un miembro objeto llamado m. Fíjese que mi<strong>en</strong>tras podemos ver el tipo<br />
de la clase base <strong>en</strong> la lista de inicializadores del constructor, sólo podemos ver el<br />
miembro id<strong>en</strong>tificador objeto.<br />
14.3.2. Tipos predefinidos <strong>en</strong> la lista de inicializadores<br />
La lista de inicializadores del constructor permite invocar explícitam<strong>en</strong>te a los<br />
constructores de los objetos miembros. De hecho, no existe otra forma de llamar a<br />
esos constructores. La idea es que los constructores son llamados antes de la ejecución<br />
del cuerpo del constructor de la nueva clase. De esta forma, cualquier llamada<br />
que hagamos a las funciones miembros de los subobjetos siempre serán objetos inicializados.<br />
No existe otra manera de acceder al cuerpo del constructor sin que ningún<br />
constructor llame a todos los miembros objetos y los objetos de la clase base, es más,<br />
el compilador crea un constructor oculto por defecto. Esto es otra característica de<br />
<strong>C++</strong>, que garantiza que ningún objeto (o parte de un objeto) puedan estar desde un<br />
principio sin que su constructor sea llamado.<br />
La idea de que todos los objetos miembros estén inicializados al inicio del constructor<br />
es una bu<strong>en</strong>a ayuda para programar. Una vez <strong>en</strong> el inicio del constructor,<br />
puede asumir que todos los subobjetos están correctam<strong>en</strong>te inicializados y c<strong>en</strong>trarse<br />
<strong>en</strong> las tareas que se desean realizar <strong>en</strong> el constructor. Sin embargo, existe un contratiempo:<br />
¿Qué ocurre con los objetos predefinidos, aquellos que no ti<strong>en</strong><strong>en</strong> constructor<br />
Para hacer una sintaxis sólida, pi<strong>en</strong>se <strong>en</strong> los tipos predefinidos como si tuvies<strong>en</strong><br />
un solo constructor, con un solo parámetro: una variable del mismo tipo como el que<br />
esta inicializando. Esto es<br />
//: C14:PseudoConstructor.cpp<br />
class X {<br />
int i;<br />
float f;<br />
char c;<br />
char* s;<br />
public:<br />
X() : i(7), f(1.4), c(’x’), s("howdy") {}<br />
};<br />
int main() {<br />
407<br />
✐<br />
✐<br />
✐<br />
✐