13.01.2015 Views

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

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

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

SHOW MORE
SHOW LESS

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

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

Saved successfully!

Ooh no, something went wrong!