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

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

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

Saved successfully!

Ooh no, something went wrong!