Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
✐<br />
✐<br />
✐<br />
“Volum<strong>en</strong>1” — 2012/1/12 — 13:52 — page 191 — #229<br />
✐<br />
6.3. Eliminación del bloque de definiciones<br />
despus de la ócreacin de Tree<br />
la altura del árbol es 12<br />
antes de la llave de cierre<br />
d<strong>en</strong>tro del destructor de Tree<br />
la altura del árbol es 16é<br />
despus de la llave de cierre<br />
Puede ver que el destructor se llama automáticam<strong>en</strong>te al acabar el ámbito (llave<br />
de cierre) <strong>en</strong> el que está definido el objeto.<br />
6.3. Eliminación del bloque de definiciones<br />
En C, siempre se defin<strong>en</strong> todas las variables al principio de cada bloque, justo<br />
después de la llave de apertura. Ése es un requisito habitual <strong>en</strong> los l<strong>en</strong>guajes de programación,<br />
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<br />
programación». En este tema, yo t<strong>en</strong>go mis sospechas. Eso siempre me pareció un<br />
inconv<strong>en</strong>i<strong>en</strong>te, como programador, volver al principio del bloque cada vez que necesitaba<br />
definir una nueva variable. También <strong>en</strong>cu<strong>en</strong>tro más legible el código cuando<br />
la definición de la variable está certa del punto donde se usa.<br />
Quizá esos argum<strong>en</strong>tos son estilísticos. En <strong>C++</strong>, sin embargo, existe un problema<br />
significativo si se fuerza a definir todos los objetos al comi<strong>en</strong>zo un ámbito. Si existe<br />
un constructor, debe invocarse cuando el objeto se crea. Sin embargo, si el constructor<br />
toma uno o más argum<strong>en</strong>tos, ¿cómo saber que se dispone de la información de<br />
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.<br />
Dado que C no ti<strong>en</strong>e el concepto de privado, la separación <strong>en</strong>tre definición<br />
e inicialización no es un problema. Además, <strong>C++</strong> garantiza que cuando se crea un<br />
objeto, es inicializado simultáneam<strong>en</strong>te. Esto asegura que no se t<strong>en</strong>drán objetos no<br />
inicializados ejecutándose <strong>en</strong> el sistema. C no ti<strong>en</strong>e cuidado, de hecho, C promueve<br />
esta práctica ya que obliga a que se definan las variables al comi<strong>en</strong>zo de un bloque,<br />
antes de disponer de la información de inicialización necesaria 2 .<br />
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<br />
para el constructor. Por eso, el l<strong>en</strong>guaje no sería factible si tuviera que<br />
definir variables al comi<strong>en</strong>zo de un bloque. De hecho, el estilo del l<strong>en</strong>guaje parece<br />
promover la definición de un objeto tan cerca como sea posible del punto <strong>en</strong> el que<br />
se usa. En <strong>C++</strong>, cualquier regla que se aplica a un «objeto» automáticam<strong>en</strong>te también<br />
se refiere a un objeto de un tipo básico. Esto significa que cualquier clase de objeto o<br />
variable de un tipo básico también se puede definir <strong>en</strong> cualquier punto del bloque.<br />
Eso también significa que puede esperar hasta disponer de la información para una<br />
variable antes de definirla, de modo que siempre puede definir e inicializar al mismo<br />
tiempo:<br />
//: C06:DefineInitialize.cpp<br />
// Defining variables anywhere<br />
#include "../require.h"<br />
#include <br />
#include <br />
using namespace std;<br />
class G {<br />
int i;<br />
public:<br />
G(int ii);<br />
2 C99, la versión actual del Estándar de C, permite definir variables <strong>en</strong> cualquier punto del bloque,<br />
como <strong>C++</strong><br />
191<br />
✐<br />
✐<br />
✐<br />
✐