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