Attention! Your ePaper is waiting for publication!
By publishing your document, the content will be optimally indexed by Google via AI and sorted into the right category for over 500 million ePaper readers on YUMPU.
This will ensure high visibility and many readers!
✐ ✐ ✐ “Volum<strong>en</strong>1” — 2012/1/12 — 13:52 — page 190 — #228 ✐ Capítulo 6. Inicialización y limpieza utilice goto para saltar fuera del del ámbito (goto sigue existi<strong>en</strong>do <strong>en</strong> <strong>C++</strong> por compatibilidad con C.) Debería notar que un goto no-local, implem<strong>en</strong>tado con las funciones setjmp y longjmp() de la librería estándar de C, evitan que el destructor sea invocado. (Eso es la especificación, incluso si su compilador no lo implem<strong>en</strong>ta de esa manera. Confiar un una característica que no está <strong>en</strong> la especificación significa que su código no será portable). A continuación, un ejemplo que demuestra las características de constructores y destructores que se han mostrado hasta el mom<strong>en</strong>to. //: C06:Constructor1.cpp // Constructors & destructors #include using namespace std; class Tree { int height; public: Tree(int initialHeight); ~Tree(); // Destructor void grow(int years); void printsize(); }; // Constructor Tree::Tree(int initialHeight) { height = initialHeight; } Tree::~Tree() { cout
✐ ✐ ✐ “Volum<strong>en</strong>1” — 2012/1/12 — 13:52 — page 191 — #229 ✐ 6.3. Eliminación del bloque de definiciones despus de la ócreacin de Tree la altura del árbol es 12 antes de la llave de cierre d<strong>en</strong>tro del destructor de Tree la altura del árbol es 16é despus de la llave de cierre Puede ver que el destructor se llama automáticam<strong>en</strong>te al acabar el ámbito (llave de cierre) <strong>en</strong> el que está definido el objeto. 6.3. Eliminación del bloque de definiciones En C, siempre se defin<strong>en</strong> todas las variables al principio de cada bloque, justo después de la llave de apertura. Ése es un requisito habitual <strong>en</strong> los l<strong>en</strong>guajes de programación, y la razón que se da a m<strong>en</strong>udo es que se considera «bu<strong>en</strong>as prácticas de programación». En este tema, yo t<strong>en</strong>go mis sospechas. Eso siempre me pareció un inconv<strong>en</strong>i<strong>en</strong>te, como programador, volver al principio del bloque cada vez que necesitaba definir una nueva variable. También <strong>en</strong>cu<strong>en</strong>tro más legible el código cuando la definición de la variable está certa del punto donde se usa. Quizá esos argum<strong>en</strong>tos son estilísticos. En <strong>C++</strong>, sin embargo, existe un problema significativo si se fuerza a definir todos los objetos al comi<strong>en</strong>zo un ámbito. Si existe un constructor, debe invocarse cuando el objeto se crea. Sin embargo, si el constructor toma uno o más argum<strong>en</strong>tos, ¿cómo saber que se dispone de la información de inicialización al comi<strong>en</strong>zo del ámbito G<strong>en</strong>eralm<strong>en</strong>te no se dispone de esa información. Dado que C no ti<strong>en</strong>e el concepto de privado, la separación <strong>en</strong>tre definición e inicialización no es un problema. Además, <strong>C++</strong> garantiza que cuando se crea un objeto, es inicializado simultáneam<strong>en</strong>te. Esto asegura que no se t<strong>en</strong>drán objetos no inicializados ejecutándose <strong>en</strong> el sistema. C no ti<strong>en</strong>e cuidado, de hecho, C promueve esta práctica ya que obliga a que se definan las variables al comi<strong>en</strong>zo de un bloque, antes de disponer de la información de inicialización necesaria 2 . En g<strong>en</strong>eral, <strong>C++</strong> no permite crear un objeto antes de t<strong>en</strong>er la información de inicialización para el constructor. Por eso, el l<strong>en</strong>guaje no sería factible si tuviera que definir variables al comi<strong>en</strong>zo de un bloque. De hecho, el estilo del l<strong>en</strong>guaje parece promover la definición de un objeto tan cerca como sea posible del punto <strong>en</strong> el que se usa. En <strong>C++</strong>, cualquier regla que se aplica a un «objeto» automáticam<strong>en</strong>te también se refiere a un objeto de un tipo básico. Esto significa que cualquier clase de objeto o variable de un tipo básico también se puede definir <strong>en</strong> cualquier punto del bloque. Eso también significa que puede esperar hasta disponer de la información para una variable antes de definirla, de modo que siempre puede definir e inicializar al mismo tiempo: //: C06:DefineInitialize.cpp // Defining variables anywhere #include "../require.h" #include #include using namespace std; class G { int i; public: G(int ii); 2 C99, la versión actual del Estándar de C, permite definir variables <strong>en</strong> cualquier punto del bloque, como <strong>C++</strong> 191 ✐ ✐ ✐ ✐