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 151 — #189<br />

✐<br />

4.3. El objeto básico<br />

dor de <strong>C++</strong> hará que el nombre de la estructura sea un nuevo tipo de dato automáticam<strong>en</strong>te<br />

<strong>en</strong> el programa (tal como los nombres de tipos de datos int, char, float y<br />

double).<br />

Todos los datos miembros de la estructura están declarados igual que antes; sin<br />

embargo, ahora las funciones están declaradas d<strong>en</strong>tro del cuerpo de la struct. Más<br />

aún, fíjese que el primer argum<strong>en</strong>to de todas las funciones ha sido eliminado. En<br />

<strong>C++</strong>, <strong>en</strong> lugar de forzar al usuario a que pase la dirección de la estructura sobre la<br />

que trabaja una función como primer argum<strong>en</strong>to, el compilador hará este trabajo,<br />

secretam<strong>en</strong>te. Ahora sólo debe preocuparse por los argum<strong>en</strong>tos que le dan s<strong>en</strong>tido a<br />

lo que la función hace y no de los mecanismos internos de la función.<br />

Es importante darse cu<strong>en</strong>ta de que el código g<strong>en</strong>erado por estas funciones es el<br />

mismo que el de las funciones de la librería al estilo C. El número de argum<strong>en</strong>tos es<br />

el mismo (aunque no se le pase la dirección de la estructura como primer argum<strong>en</strong>to,<br />

<strong>en</strong> realidad sí se hace) y sigue existi<strong>en</strong>do un único cuerpo (definición) de cada<br />

función. Esto último quiere decir que, aunque declare múltiples variables<br />

Stash A, B, C;<br />

no existirán múltiples definiciones de, por ejemplo, la función add(), una para<br />

cada variable.<br />

De modo que el código g<strong>en</strong>erado es casi idéntico al que hubiese escrito para una<br />

versión <strong>en</strong> C de la librería, incluy<strong>en</strong>do la «decoración de nombres» ya m<strong>en</strong>cionada<br />

para evitar los conflictos de nombres, nombrando a las funciones Stash_initialize(),<br />

Stash_cleanup() y demás. Cuando una función está d<strong>en</strong>tro de una<br />

estructura, el compilador <strong>C++</strong> hace lo mismo y por eso, una función llamada initialize()<br />

d<strong>en</strong>tro de una estructura no estará <strong>en</strong> conflicto con otra función initialize()<br />

d<strong>en</strong>tro de otra estructura o con una función initialize() global.<br />

De este modo, <strong>en</strong> g<strong>en</strong>eral no t<strong>en</strong>drá que preocuparse por los conflictos de nombres<br />

de funciones - use el nombre sin decoración. Sin embargo, habrá situaciones <strong>en</strong> las<br />

que deseará especificar, por ejemplo, esta initialize() pert<strong>en</strong>ece a la estructura<br />

Stash y no a ninguna otra. En particular, cuando defina la función, necesita especificar<br />

a qué estructura pert<strong>en</strong>ece para lo cual, <strong>en</strong> <strong>C++</strong> cu<strong>en</strong>ta con el operador ::<br />

llamado operador de resolución de ámbito (ya que ahora un nombre puede estar <strong>en</strong><br />

difer<strong>en</strong>tes ámbitos: el del ámbito global o d<strong>en</strong>tro del ámbito de una estructura. Por<br />

ejemplo, si quiere referirse a una función initialize() que se <strong>en</strong>cu<strong>en</strong>tra d<strong>en</strong>tro<br />

de la estructura Stash lo podrá hacer con la expresión Stash::initialize(int<br />

size). A continuación podrá ver cómo se usa el operador de resolución de ámbito<br />

para definir funciones:<br />

//: C04:CppLib.cpp {O}<br />

// C library converted to <strong>C++</strong><br />

// Declare structure and functions:<br />

#include "CppLib.h"<br />

#include <br />

#include <br />

using namespace std;<br />

// Quantity of elem<strong>en</strong>ts to add<br />

// wh<strong>en</strong> increasing storage:<br />

const int increm<strong>en</strong>t = 100;<br />

void Stash::initialize(int sz) {<br />

size = sz;<br />

quantity = 0;<br />

151<br />

✐<br />

✐<br />

✐<br />

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

Saved successfully!

Ooh no, something went wrong!