98
Programación C++ Adolfo J. Millán Índice: Generalidades o Prólogo edición Web o Índice (esta página) o Convenciones y notación 0 Introducción o 0.1 El Ordenador Electrónico Digital 0.1.1 Computación: Máquina de Turing o 0.2 El Sistema Operativo o 0.3 El Hardware 1 Programación C++ o 1.1 Introducción a la POO o 1.2 El lenguaje C++ 1.2.1 Algunos conceptos básicos o 1.3 Estructura de un programa 1.3.1 Estructura lógica 1.3.1a Sintaxis de las sentencias C++ 1.3.1b Sintaxis de las expresiones C++ 1.3.2 Almacenamiento (aspectos lógicos) o 1.4 Proceso de creación de un programa 1.4.0 Construir un ejecutable 1.4.0a La utilidad Make (generalidades) 1.4.0a1 GNU Make 1.4.0a2 Borland Make 1.4.0b Topología de un fichero-imagen 1.4.1 El preprocesador 1.4.1a Constantes manifiestas 1.4.1b Macros, valores y tipos estándar 1.4.2 Compilación 1.4.3 Generador de código 1.4.3a Código WIntel 1.4.4 Enlazado 1.4.4a Fichero de definición 1.4.4b Librerías : generalidades 1.4.4b1 Librerías estáticas 1.4.4b2 Librerías dinámicas 1.4.4b2a Construir una DLL 1.4.4b2b Usar una DLL

01 Programación C++ al completo

Embed Size (px)

Citation preview

Programacin C++Adolfo J. Millnndice: Generalidades Prlogo edicin Web ndice (esta pgina) Convenciones y notacin 0 Introduccin 0.1 El Ordenador Electrnico Digital 0.1.1 Computacin: Mquina de Turing 0.2 El Sistema Operativo 0.3 El Hardware 1 Programacin C++ 1.1 Introduccin a la POO 1.2 El lenguaje C++ 1.2.1 Algunos conceptos bsicos 1.3 Estructura de un programa 1.3.1 Estructura lgica 1.3.1a Sintaxis de las sentencias C++ 1.3.1b Sintaxis de las expresiones C++ 1.3.2 Almacenamiento (aspectos lgicos) 1.4 Proceso de creacin de un programa 1.4.0 Construir un ejecutable 1.4.0a La utilidad Make(generalidades) 1.4.0a1 GNU Make 1.4.0a2 Borland Make 1.4.0b Topologa de un fichero-imagen 1.4.1 El preprocesador 1.4.1a Constantes manifiestas 1.4.1b Macros, valores y tipos estndar 1.4.2 Compilacin 1.4.3 Generador de cdigo 1.4.3a Cdigo WIntel 1.4.4 Enlazado 1.4.4a Fichero de definicin 1.4.4b Libreras: generalidades 1.4.4b1 Libreras estticas 1.4.4b2 Libreras dinmicas 1.4.4b2a Construir una DLL 1.4.4b2b Usar una DLL 1.4.4b2c Libreras de importacin 1.4.4b2d Librera de tipos 1.4.4b2e Carga retrasada 1.4.4b3 Libreras de recursos 1.4.5 Depuracin 1.4.6 Tamao de los ejecutables 1.5 Secuencia de ejecucin 1.5.1 Funciones de terminacin 1.5.2 Soporte de runtime 1.6 Tratamiento de excepciones 1.6.1 Lanzar excepciones 1.6.1a Excepciones en la Librera Estndar 1.6.2 Capturar excepciones 1.6.3 Excepciones imprevistas 1.6.4 Especificar excepciones 1.6.5 Excepciones en la prctica 1.7 Programacin actual 1.7.1 Tecnicismos 1.7.2 API de MS Windows 1.7.3 El shell 1.7.4 Eventos 1.7.5 Programacin Windows 1.8 Estructura de la informacin 1.8a Colas, Pilas, Listas enlazadas 1.8b .rboles 2 Objetos y algoritmos 2.1 Atributos 2.2 Tipos 2.2.1 Tipos bsicos 2.2.1a Tipos carcter 2.2.1a0 Sistemas de codificacin 2.2.1a1 El carcter ancho 2.2.1a2 UCS y Unicode 2.2.2 Tipos derivados 2.2.3 Modificadores de tipo 2.2.4 Representacin interna y rango 2.2.4a Formas de representacin binaria 2.2.4b Formas de representacin simblica 2.2.4c Tamao de los tipos bsicos 2.2.5 Conversiones estndar 2.2.5a Conversiones estndar con tipos abstractos 2.2.6 Almacenamiento (aspectos fsicos) 2.2.6a Orden de almacenamiento 3 Elementos lxicos 3.1 Comentarios 3.2 Tokens 3.2.1 Palabras clave 3.2.1atypedef 3.2.1a1 typedefs en Windows 3.2.1bbool,false,true 3.2.1cconst 3.2.1dvolatile 3.2.1etypename 3.2.2 Identificadores 3.2.3 Constantes 3.2.3a Expresiones constantes 3.2.3b Constantes enteras 3.2.3c Constantes fraccionarias 3.2.3d Constantes carcter 3.2.3e Secuencias de escape 3.2.3f Constantes literales(cadenas alfanumricas) 3.2.3g Constantes de enumeracin 3.2.6 Puntuadores 4 Estructura del lenguaje 4.1 Declaraciones 4.1.1 Entidades 4.1.2 Declaraciones y definiciones 4.1.3 mbito 4.1.3a Tipos y variables globales 4.1.4 Visibilidad 4.1.5 Duracin 4.1.5a Control de recursos 4.1.8 Clase de almacenamiento 4.1.8aauto 4.1.8bregister 4.1.8cstatic 4.1.8dextern 4.1.8emutable 4.1.9 Modificadores auxiliares(de variables, funciones y clases) 4.1.11 Espacio de Nombres("namespace") 4.1.11a Declarar un Subespacio 4.1.11b Subespacio annimo 4.1.11c Acceso a elementos 4.1.11c1 Acceso a subespacios en clases 4.1.11c2 Acceso a la Librera Estndar 4.1.11d Ampliar un Subespacio 4.2 Punteros 4.2.1 Puntero a objeto 4.2.1a Declaracin 4.2.1b Modelado 4.2.1c Puntero a puntero 4.2.1d Puntero genrico 4.2.1e Puntero constante/a constante 4.2.1f Puntero a clase 4.2.1g Puntero a miembro 4.2.1g1 Puntero a miembro no esttico 4.2.1g1-2 Punteros internos a miembros no estticos 4.2.1g1-3 Punteros externos a miembros no estticos 4.2.1g2 Puntero a miembro esttico 4.2.2 Aritmtica de punteros 4.2.3 Referencias 4.2.4 Puntero a funcin 4.2.4a Declaracin/definicin 4.2.4b Invocacin mediante puntero 4.2.4c Funciones como parmetros 4.3 Matrices 4.3.1 Declaracin 4.3.2 Punteros y Matrices 4.3.3 Almacenamiento de Matrices 4.3.4 Matrices alfanumricas 4.3.5 Matrices de punteros 4.3.6 Matrices de matrices 4.3.7 Inicializacin de Matrices 4.3.8 Matrices como argumento de funciones 4.4 Funciones 4.4.1 Declaracin 4.4.1a Sobrecarga de funciones 4.4.1b Especificadores opcionales 4.4.2 Definicin 4.4.3 Declaracin Implcita 4.4.4 Funcinmain() 4.4.5 Argumentos 4.4.6 Invocacin de funciones 4.4.6a Formas de invocacin 4.4.6b Sobre el rendimiento 4.4.6c Recursin 4.4.7 Valor devuelto 4.5 Estructuras 4.5.1 Declaracin 4.5.2 Inicializacin 4.5.3 Operaciones permitidas 4.5.4 Acceso a miembros 4.5.5 Estructuras y funciones 4.5.5a Crear estructuras 4.5.5b Manipular estructuras 4.5.5c Estructuras de Librera Estndar 4.5.6 Matrices de Estructuras 4.5.7 Punteros a Estructuras 4.5.8 Estructuras autoreferenciadas(rboles y listas binarias) 4.5.8a Equilibrio de rboles binarios 4.5.8b Buscar elementos en rboles binarios 4.6 Campos de bits 4.6.1 Alineacin interna 4.7 Uniones 4.8 Enumeraciones 4.9 Operadores 4.9.0 Resumen 4.9.0a Evaluacin de expresiones(asociatividad y precedencia de operadores) 4.9.1 Operadores Aritmticos 4.9.2 Operadores de Asignacin 4.9.2a Asignacin de propiedades 4.9.3 Operadores de Comparacin y Manejo de Bits(desplazamientos,bitand,bitor,xor,compl) 4.9.3a Tecnicismos y ejemplos adicionales 4.9.5 Operador Coma, 4.9.6 Operador Condicional? : 4.9.8 Operadores Lgicos (and,or,not) 4.9.9 Operadores de Modelado de tipos 4.9.9aconst_cast 4.9.9bstatic_cast 4.9.9cdynamic_cast 4.9.9dreinterpret_cast 4.9.9e El modelado en la programacin Windows 4.9.10 Operador de Preproceso #define #error #if, #elif, #else, #endif #ifdef, #ifndef #import #include #line #pragma #undef 4.9.11 Operadores de puntero 4.9.12 Operadores Relacionales(de comparacin) 4.9.13 Operadorsizeof 4.9.14 Operadortypeid 4.9.14a Clasetype_info 4.9.16 Operadores aadidos[ ]( ).-> 4.9.18 Sobrecarga de Operadores 4.9.18a Sobrecarga del operador= (asignacin) 4.9.18b Sobrecarga de operadores binarios 4.9.18b1 Sobrecarga de operadores relacionales 4.9.18b2 Sobrecarga de operadores aritmticos 4.9.18b3 Sobrecarga de operadores de manejo de bits 4.9.18c Sobrecarga de operadores unarios 4.9.18d Sobrecarga del operador[] (elemento de matriz) 4.9.18e Sobrecarga del operador-> (selector indirecto de miembro) 4.9.18f Sobrecarga del operador( ) (invocacin de funcin) 4.9.18g Sobrecarga de operadores lgicos 4.9.18h Sobrecarga de enumeraciones 4.9.18k Sobrecarga del operador de modelado(operadores de conversin) 4.9.18t Tecnicismos 4.9.19 Operador::de acceso a mbito 4.9.20 Operadornew 4.9.20a Funcin-operadornew() 4.9.20b Definir sitio de almacenamiento 4.9.20c Operadornewcon matrices (new[ ]) 4.9.20d Manejo de errores 4.9.21 Operadoresdeleteydelete[ ] 4.10 Sentencias 4.10.1 Sententencias de etiqueta 4.10.2 Sentencias de seleccin (control de flujo) 4.10.3 Iteraciones (bucles) 4.10.4 Sentencias de salto 4.10.5 Sentencias de expresiones con coma 4.11 Clases 4.11.1 Formas de creacin 4.11.2 Declaracin 4.11.2a Construccin inicial 4.11.2a1friend 4.11.2a2 Sobrecarga de mtodos 4.11.2a3 Clases locales 4.11.2b Herencia y accesibilidad(la cuestin del acceso) 4.11.2b1 Punteros en jerarquas de Clases 4.11.2b2 Espacio de nombres y sobrecarga de mtodos 4.11.2c Herencia mltiple 4.11.2c1 Clases-base virtuales 4.11.2d Creacin y destruccin de objetos 4.11.2d1 Constructores 4.11.2d2 Destructores 4.11.2d3 Iniciar miembros 4.11.2d4 Copiar objetos (Constructor-copia) 4.11.2d5 Observaciones y errores frecuentes 4.11.2e Acceso a miembros 4.11.3 Nombres de Clases 4.11.3a Estructuras annimas 4.11.4 Ambito de nombres 4.11.5 Instanciado de Clases 4.11.6 Punterothis 4.11.7 Miembros estticos 4.11.8 Clases polimrficas 4.11.8a Funciones virtuales 4.11.8b Funciones dinmicas 4.11.8c Clases abstractas 4.12 Plantillas (programacin genrica) 4.12.1 Funciones genricas 4.12.1a Instanciacin explcita & versin explcita(sobrecarga de funciones genricas) 4.12.1b Otros conceptos 4.12.2 Clases genricas 4.12.2a Clases genricas II 4.12.2b Clases genricas en la Librera Estndar 4.12.2b1 Punteros inteligentes (auto_ptr) 4.13 Tecnicismos 4.13.1 Reglas de buena prctica 4.13.2 Clases dentro de clases 4.13.3 Objetos-puntero 4.13.4 Tcnica manejador-cuerpo 4.13.5 Constructores virtuales 4.13.6 Conversin automtica a tipos bsicos 4.13.7 Asignacin a funciones 5. Librera EstndarNota:la seccin5, correspondiente a la Librera Estndar C++, est en fase de redaccin.

Por el momento estas pginas solo son accesibles parcialmente. 5.1 STL 5.1.1 Contenedores 5.1.1a Seleccionar un contenedor 5.1.1b Cuestiones adicionales 5.1.1c Secuencias 5.1.1c1vector 5.1.1c2vector 5.1.1c3deque 5.1.1c4list 5.1.1c5stack 5.1.1d Adaptadores 5.1.1d1queue 5.1.1d2priority_queue 5.1.1e Contenedores asociativos 5.1.1e1bitset 5.1.1e2set 5.1.1e3multiset 5.1.1e4map 5.1.1e5multimap 5.1.2 Iteradores 5.1.2a Iteradores de entrada(InputIterator) 5.1.2b Iteradores de salida(OutputIterator) 5.1.2c Iteradores adelante(ForwardIterator) 5.1.2d Iteradores bidireccionales(BidirectionalIterator) 5.1.2e Iteradores de acceso aleatorio(RandomAccessIterator) 5.1.2f Iteradores para flujos de entrada/salida 5.1.2g Iteradores de insercin 5.1.2h Manipulacin de iteradores 5.1.3 Algoritmos 5.1.3a Funciones y predicados 5.1.3a1 Objetos-funcin 5.1.3a2 Funcin-adaptador 5.1.3b Algoritmos no modificativos 5.1.3b1 for_each() 5.1.3b2 find() 5.1.3b3 find_end() 5.1.3b4 find_first_of() 5.1.3b5 adyacent_find() 5.1.3b6 count() 5.1.3b7 mismatch() 5.1.3b8 equal() 5.1.3b9 search() 5.1.3c Algoritmos modificativos 5.1.3c1 copy() 5.1.3c2 swap() 5.1.3c3 transform() 5.1.3c4 replace() 5.1.3c5 fill() 5.1.3c6 generate() 5.1.3c7 remove() 5.1.3c8 unique() 5.1.3c9 reverse() 5.1.3c10 rotate() 5.1.3c11 random_shuffle() 5.1.3c12 partition() 5.1.3d Operaciones de ordenacin 5.1.3e Elemento ensimo 5.1.ef Busqueda binaria 5.1.3g Composicin ("Merge") 5.1.3h Operaciones de comprobacin 5.1.3i Operaciones de modificacin en estructuras ordenadas 5.1.3j Operaciones de montn 5.1.3k Mximos y mnimos 5.1.3l Comparaciones lexicogrficas 5.1.3m Generadores de permutaciones 5.1.4 Adaptadores ("Adaptors") 5.1.5 Asignadores de memoria("Allocators") 5.2 Internacionalizacin 5.2.1 Facetas 5.2.2 Localismos 5.3 Entradas/Salidas(generalidades) 5.3.1 E/S en la Librera Estndar 5.3.2 Jerarqua de clases de E/S 5.3.2a ios_base 5.3.2a1 Datos de usuario(iword/pword/xalloc) 5.3.2a2 Retrollamadas("Callbacks") 5.3.2a3 Controles de formato(flags/setf/precision/width) 5.3.2b basic_ios 5.3.2c basic_istream 5.3.2d basic_ostream 5.3.2e basic_iostream 5.3.2f basic_streambufel bufer de flujo 5.3.3 E/S asociadas con ficheros 5.3.3a E/S no-formateadas asociadas con ficheros 5.3.3b E/S formateadas asociadas con ficheros 5.3.3c Manipuladores 5.3.3c1 Manipuladores estndar 5.3.4 Vaciado de buffers en C/C++ 5.5 Librera clsica 5.5.1 Fecha y hora en C/C++(generalidades) 5.5.1a Fecha y hora en la Librera Estndar 5.5.2 Directorios y ficheros en C/C++ 5.5.2a Problemas con directorios y ficheros 6. Apndices 6.1 Reglas de lectura 7. Bibliografa 9 Librera de ejemplos 9.0 Recursos Web 9.1 Fecha y hora 9.2 Datos por teclado 9.3 Manejo de cadenas alfanumricas 9.3.1 Un "parser" muy simple 9.3.2 Una clase String 9.4 Manejo de bits 9.4.1 Representacin interna (IEEE) 9.5 Conversores 9.6 Llamadas al Sistema 9.7 Clculos matemticos

1 Programacin C++"No programming language can be all things to all programers. No matter how many features a language has, there's always someone who wants just one more". Dan Saks "C/C++ Users Journal" Enero 1990.1Observaciones y comentarios sobre los lenguajes C/C++Se ha dicho: "C++es un lenguaje potente, pero a veces no es precisamente un paseo por el parque... De acuerdo, de acuerdo, es orientado a objetos. Correcto. Yo personalmente conozco gente que ha trabajado toda una semana en herencia mltiple, para retirarse completamente frustrado a Carolina del Norte a limpiar cochineras". Joshua Trupin: MSDN Magazine, Septiembre 2000www.msdn.microsoft.com/msdnmag/default.asp "Chace fcil dispararse en los propios pies;C++lo hace ms difcil, pero cuando lo haces, te vuela la pierna completa". Stroustrup. C++es un lenguaje difcil en el que puede existir una lnea muy tenue entre una caracterstica y un 'bug'". Programming inC++: Rules and Recommendations, Ellemtel Telecommunication Systems Laboratories, Sweden. "Para nuestro gustoC++ya es demasiado largo y complicado". Comit de estandarizacin del C++. "Tiene una sintaxis compleja, semntica sutil y una temible reputacin". Steve Donovan "Scripting C++". InformIT Marzo 2002 "Todos los hombres ascienden en la escala hasta alcanzar su mximo nivel de ineficacia". Dr. Laurence J. Peter. "La pirmide de Peter". Ed. Plaza & Janes S.A. Barcelona [5].Creo queC++es un magnfico ejemplo de que lo anterior es aplicable tambin a los lenguajes de programacin. En efecto,C++es una muestra de como las cosas pueden seguir mejorndose hasta llegar a un nivel de complejidad que las hace prcticamente inutilizables por el comn de los mortales, a no ser que les dediquen un mnimo de 500 horas para empezar a entenderlas [9]. Como botn de muestra, incluyo un comentario encontrado en Amazon [1] sobre el libro "The C++ Programming Language" (TC++PL para los ntimos) del ya citado Stroustrup: "Estoy en mi tercer ao de aprendizaje de C++ (s, se tarda un tiempo en conocer el C++, en conocerlo realmente), todava lo leo una y otra vez, y cada vez encuentro ms y ms cosas tiles y consejos importantes", Caliv Nir (Israel).Afortunadamente parece que las cosas vuelven a su cauce. Hace poco tiempo que algunos se dieron cuenta que el asunto haba empezado a desmadrarse, as que empezaron a quitarle cosas y a simplificarlo..., Estaba naciendo Java! (es tambin la explicacin "oficial" de Microsoft para inventar elC#;-)Nota: Esta es la situacin por el momento, pero no os preocupis. Vemos como Java se est perfeccionando a marchas rpidas, con lo que a no tardar ser tan complejo comoC++y habr que volver a inventar algo ms sencillo...[4] En cuanto alC#: Sea bienvenida cualquier mejora!!. Aunque se me ocurre que no estara de ms aquello de mantener una cierta "diversidad gentica" en la informtica, mucho me temo que al paso que vamos acabemos todos vestidos de gris con el "Libro Rojo" en el bolsillo :-( [6]2Resea histricaDesde un punto de vista histrico, elCes anterior alC++, aunque el estndarC++fuera publicado antes que el deC[2], de modo, que paradjicamente el hijo influy en el estndar del padre. As pues, la propuesta de ANSICrecogi algunas de las normas delC++. Ambos nacieron en los prestigiosos laboratorios Bell de la AT&T (American Telephone and Telegraph) en Murray Hill (New Jersey USA) [3]. El primero de la mano de Brian W. Kernighan y Dennis M. Ritchie (la "K" y la "R" deK&R, siglas con las que se les conoce), el segundo es de Bjarne Stroustrup.La primera edicin del libro: "El lenguaje de programacin C" de K&R es de 1978. Por su parte la primera edicin de: "El lenguaje de programacin C++" de Stroustrup es de 1986. El propio Stroustrup reconoce que comenz a trabajar en su diseo en 1979; justo un ao despus de la publicacin del clsico de K&R. Las primeras versiones en uso del lenguaje (bajo el nombre de "C con clases") en el entorno de los departamentos de investigacin de la AT&T se remontan a 1980. La primera utilizacin del lenguaje fuera del entorno de investigacin data de Agosto de 1983. La designacin actual C++ fue acuada en el verano de 1.983 por Rick Mascitti. El primer compilador comercial fue lanzado en Octubre de 1985.Como todos los lenguajes (naturales y de programacin), el C++ es un resultado de la evolucin; de forma que recoge influencia de sus ancestros, algunos de los cuales ya se han sealado (0.1). Adems es en s mismo un producto en evolucin. Las ltimas aportaciones datan de los 80, y se refieren principalmente al mecanismo de excepciones y a las plantillas ("Templates").Sin duda la mejor fuente de informacin sobre la historia y evolucin de este lenguaje es su propio inventor, de modo que remitimos al lector a sus propias palabrasD&EC++.2.1 Situacin actualDespus de dcadas de aparente inactividad por parte del Comit Internacional encargado de elaborar el estndar, el 25 de Marzo de 2011, los medios especializados de todo el mundo, se hacan eco de que finalmente, el comit ISO para el C++ haba sido aprobado el ltimo borrador del nuevo estndar en sureunin de primavera en Madrid. Esta versin, en la que se haba estado trabajando intensamente, era conocida comoC++09porque se supona que sera aprobada en el 2009. Sin embargo, el proceso sufri sucesivos retrasos, de forma que finalmente era conocido -quizs un poco humorsticamente- comoC++0x, en relacin a que no se saba cuando aparecera. Finalmente, si las cosas discurren como es de suponer, la aprobacin ocurrir dentro de este ao, as que el prximo estndar ser elC++2011.Nota: a la hora de escribir estas lneas, la ltima revisin publicada lo era bajo el ttuloISO_C0x_final_draft. Un documento .PDF de nada menos que 11 MB.

Podra decirse que despus de vivir una poca dorada, la popularizacin y uso del C++ haba sufrido una cierta ralentizacin en favor de nuevas modas y nuevos lenguajes, y que incluso su desarrollo y evolucin haban quedado estancados desde los aos 70. Sin embargo, esta aparente "inactividad" ha estado lejos de ser real y el nuevo estndar incluye un sinnmero de avances conceptuales y materiales -en forma de nuevas libreras- que lo colocan de nuevo en una posicin puntera dentro del mundo de la programacin, en especial en lo que respecta a grandes sistemas. Precisamente, la razn principal de los retrasos ocurridos en el proceso de aprobacin del nuevo estndar, tienen mucho que ver con la magnitud, nmero y calado de las nuevas extensiones y libreras.Con independencia de que los cambios se hagan oficiales, muchas de las nuevas herramientas ya estaban en la calle de forma ms o menos oficial, de la mano de los fabricantes de compiladores. De forma que se habla incluso de un "renacimiento" del C++ como herramienta y concepto. Para que el lector pueda hacerse una idea de por donde van las ltimas tendencias, a continuacin le incluyo algunos enlaces ilustrativos. Entrevista de Craig Symonds y Mohsen Agsen, dos profesionales que sin duda gozan de una buena perspectiva del mundo de la programacin actual: "C++ Renaissance" Un comentario desde dentro de Microsoft, la compaa que ha gastado billones de Dlares en popularizar el denominado "cdigo no nativo" (interpretado): "C++ Renaissance: First Symptoms of Contagion in Traditionally Non-Native Teams". Artculo de Danny Kalev en Informit (conocido experto que ha sido miembro del Comit de Estandarizacin del C++): "C++ is Back with a Vengeance".3 Estudiar C++"C++ should not be for beginners, as it is better to learn the principles from a clearer language than be confused by what all the syntactic knobs and dials, and superfluous constructs do in C++. As for courses, C++ has proven so difficult to learn that you need lots of courses". Ian Joyner "C++??" ( [Joyner-96]).

Para tener una perspectiva histrica parece natural estudiar primeroCy despusC++, con lo que se empiezan a ver las diferencias y salvedades entre uno y otro. Este es el enfoque de algunos libros; de hecho el ya comentado manual de ayuda "C++ Builder Languaje Guide" sigue ms o menos esta pauta. Dedica muchos comentarios a las diferencias entreCyC++, y al final dedica un captulo a los asuntos que son exclusivos de este ltimo. Algunos de estos libros incluso hacen comentarios curiosos, que ya solo tienen sentido desde un punto de vista histrico. Por ejemplo, citan que los ficheros fuente de los programasCdeben tener nombres con terminacin ".c" y los deC++terminaciones ".cc" o ".cpp", lo que es superfluo para los compiladores actuales. Por ejemplo, Borland C++Builder puede compilar perfectamente fuentes.ccomoCo comoC++con un simple indicador (-P) en la orden de llamada.Nota: Otros, como los compiladores GNU C/C++, permiten utilizar ambos criterios. Adems de poder utilizar una directiva explcita, pueden distinguir el tipo de compilacin por la terminacin de los fuentes. Por ejemplo, las terminaciones.cson tratadas y compiladas como fuentesC, mientras que los sufijos.C;.Cpp;.C++;.ccson compilados comoC++. Otros compiladores C++ Unix como Solaris de SUN o HP-UX pueden compilar fuentes con terminaciones.C,.c,.cc,.cppo.cxx.

C++no naci como un lenguaje orientado a objetos puro. Ms bien se trataba de aadirle "objetos" al clsicoCde K&R, ya que el nuevo paradigma de programacin "con objetos", se mostraba como un paso adelante en el arte de la programacin. De hecho, aunqueC++introduce nuevas palabras clave y operadores para manejo de clases, algunas de sus extensiones tienen aplicacin fuera del contexto de programacin con objetos (fuera del mbito de las clases). Esta es tambin la causa de queC++, junto con las magnficas cualidades delC, arrastre algunas de sus deficiencias. Sigue siendo permisivo (aunque menos) "intentando hacer algo razonable con lo que se haya escrito", solo que a veces, sin que nos demos cuenta, se pasa de listo. Por supuesto, con ambos lenguajes resulta cierto el viejo aforismo informtico: "Un programa no hace lo que queremos que haga, sino lo que le hemos dicho que haga". En el caso delC++quizs tendramos que aadir: "Mas lo que l decide por su cuenta"...:-)Cuando se trata de programas sencillos, que no requieren necesariamente de las caractersticas "++" de la POO, surge inmediatamente la cuestin si ser mejor hacerlo enCo enC++, Cual es mas rpido? Cual proporciona un cdigo ms compacto? Segn dicen los expertos, con los actuales compiladores el resultado est en tablas. Las diferencias se mantienen en un margen de 5% y por lo general los resultados se encuentran a la par. Sin embargo, en cuanto se trata de escribir programas algo ms complicados que mostrar el consabido "Hola mundo", las diferencias de productividad son notables, con una indiscutible ventaja a favor delC++.Nota: En cierta forma esta discusin, usarC++oC, es un poco bizantina, dado que a efectos prcticos el segundo es un subconjunto del primero (de hecho, los compiladores GNU C y C++ estn integrados en un solo producto). Ms bien cabra discutir si, utilizandoC++, merece o no la pena usar los recursos de la POO.

Dicho esto queda una cuestin: Aunque estudiarC++a partir deCproporciona una perspectiva histrica, una visin del desarrollo del lenguaje, de como fueron sucediendo las cosas. En mi opinin, hacerlo de esta forma no solo es innecesario sino quizs contraproducente para el estudiante normal. No digo que est de ms, solo que es un camino innecesariamente farragoso. Me parece que se trata de una situacin parecida a la de alguien que quisiera aprender Espaol empezando por aprender Latn. Por supuesto no estara de ms si tiene tiempo y gana, si se es un lingista. Se tendr un mayor conocimiento del lenguaje y su evolucin; se comprender mejor el porqu de ciertas cosas. Pero para el extranjero que simplemente necesita entenderse en Espaol, es evidentemente innecesario. Digo esto, porque al ser la POO un paso superior de abstraccin respecto de los primeros sistemas de "traslacin de frmulas". Un paso en la evolucin de los lenguajes de programacin, con un cuerpo de doctrina ya suficientemente consolidado y coherente, las cosas pueden explicarse partiendo directamente del estudio deC++y aprovechando todas sus posibilidades desde el principio. Incluso dira que intentando "olvidarse" del viejoCque an pervive en su interior. Es perfectamente factible introducir el concepto general de clase y objeto, para decir despus que las estructuras son una "clase" especial que tiene estas y las otras propiedades (todas sus propiedades son pblicas), sin necesidad de introducir el concepto tradicional de "estructura"C, para luego decir que enC++son un tipo especial de clase... Esto tendr la ventaja adicional de permitir al nefito empezar a pensar "en objetos" con ms rapidez.Nota: Tena ya una gran cantidad de material recopilado cuando me di cuenta de esta realidad, as que tuve que volver a rehacer una parte de la estructura de este "libro", volviendo a empezar directamente con elC++, e intentando hacer la menor cantidad de referencias al viejoC. A la hora de escribir estas lneas todava no est terminado el trabajo (no se si lo estar algn da), pero esta es la intencin, de forma que si cuando caiga en manos del lector quedan referencias al viejoC, que no sean meramente histricas o comparativas, sepa que se debe simplemente a un trabajo inacabado.1.1 Introduccin a la POO1 Qu es eso de los "Objetos"?En la programacin tradicional exista una clara diferenciacin entre los datos y su manipulacin, es decir, el conjunto de algoritmos para manejarlos. Los tipos de datos eran muy simples; todo lo ms nmeros de diverso tipo y caracteres (aislados o agrupados en cadenas o matrices), pero nunca elementos heterogneos.La situacin para el programador era que el lenguaje pareca decirle:estos son los posibles contenedores para la informacin que debes manejar (los tipos de datos soportados por el lenguaje) y aqu aparte, las operaciones que puedes realizar con ellos (las operaciones definidas para dichos datos). Por ejemplo, si son datos numricos las operaciones aritmticas, las comparaciones, las asignaciones, etc. Con estas herramientas el programador construa su cdigo, y para poner un poco de orden en la maraa de algoritmos solo tena el recurso de agruparlo en funciones.Si se tena que hacer un programa de gestin comercial, la informacin correspondiente a un concepto ms o menos real, por ejemplo un "cliente", tena que ser desmenuzada en una serie de datos aislados: nombre, domicilio, poblacin, provincia, telfono, condiciones de compra, saldo, tipo de descuento, nmero de vendedor asignado, fecha de ltima compra, etc. etc. Luego, para hacer una factura, todos estos elementos eran tomados y procesados individualmente.Un primer intento de construir tipos de datos ms complejos, que se parecieran a las situaciones del mundo real y que pudieran ser tratados (ms o menos) como una unidad, lo constituyen, entre otros, las "estructuras" del C clsico ("registros" en otros lenguajes). Una estructura es una agregacin de datos de diverso tipo construida a criterio del programador mediante la agrupacin de elementos ya incluidos en el lenguaje (bsicamente los antedichos nmeros y caracteres). Esto supuso un paso en el nivel de abstraccin de los datos, aunque las herramientas para manipularlos seguan siendo elementos totalmente diferenciados.En esta etapa ya poda crearse una estructura "cliente" que albergara toda la informacin antes dispersa, pero aparte de leer y escribir la informacin en un solo bloque, poco ms poda hacerse, los datos tenan que seguir siendo procesados individualmente con expresiones parecidas a:cliente->fecha_ult_compra = date();tot_factura = suma * cliente->descuentocliente->saldo = cliente->saldo + tot_factura;etc.Ante esta situacin surge una nueva idea: crearnuevos tipos de datosagrupando los tipos tradicionales en entidades ms complejas que reciben el nombre genrico declases. Las clases son conjuntos de datos definidos por el programador, parecidos a las mencionadas "estructuras", pero con la importante novedad de incluir tambin las herramientas necesarias para su manipulacin; es decir: operadores y funciones de la programacin tradicional. Dicho de otro modo: los nuevos tipos de datos pueden ir acompaados de su "lgebra"; de las operaciones que se pueden realizar con ellos [3].La idea es construir una especie de caja negra que incluya no solo los datos, tambin los algoritmos necesarios para su manipulacin (sus operaciones), de forma que pueda ser vista desde el exterior (el programador que las usa) como un ente al que se le envan preguntas u rdenes y responde con el resultado [2]. Este comportamiento de la clase frente al mundo exterior es lo que se llama suinterfazo protocolo. Cmo es el detalle de su interior no le interesa al usuario-programador en absoluto, solo le interesa conocer la forma de "comunicarse" con ella y que posibilidades le ofrece. El hecho de empaquetar juntos datos y funcionalidad, dejando visible al exterior solo lo estrictamente necesario, se denominaencapsulamientoy es otro de los distintivos de la POO.Para ilustrar la idea en un caso concreto consideremos un ejemplo clsico: Supongamos que en un programa tradicional hay que manejar nmeros complejos. La solucin es definir dos variables fraccionarias (de coma flotante)ReYpara representar respectivamente las partes reales e imaginaria de cada complejo. Luego para obtener, por ejemplo la suma (Rr, Yr), de dos complejos (R1, Y1), (R2, Y2), tenemos que codificar:Rr = R1 + R2Yr = Y1 + Y2para calcular el valor del mdulomtenemos que hacer:m = SQRT( (Rr * Rr) + ( Yr * Yr) )as sucesivamente para cualquier manipulacin que queramos efectuar.Supongamos ahora que tenemos esta posibilidad de "construir" un nuevo tipo de variable, que denominaremos laclasede los complejos (la designamos porCc), y que hemos incluido en dicha clase la informacin necesaria para realizar todas las operaciones permitidas en el lgebra de los nmeros complejos. No solo la suma, tambin la asignacin, la comparacin, el clculo del mdulo, etc. Incluso los procedimientos para crear elementos nuevos (complejos) y para destruirlos (eliminarlos de la memoria). Ahora el funcionamiento sera algo parecido a:Cc x = (R1, Y1);Cc y = (R2, Y2);

Estamos declarando quexeyson objetos de la nueva clase y les estamos asignando los valores correspondientes.Fjese que estosobjetosson casos concretos del nuevo tipo, la clase de los complejos (en el mismo sentido que un 5 es un caso concreto del concepto genrico de "nmero entero"). En el ejemplo suponemos queR1,Y1,R2,Y2siguen siendo nmeros fraccionarios tradicionales, los mismos que en el ejemplo anterior. Fjese tambin que la asignacinx = (R1, Y1)supone que el compilador sabe que al serxun complejo, el smbolo "=" no representa aqu la misma operacin que en el caso de, por ejemplo,z = 6; tambin supone que el compilador sabe que significa exactamente la expresin(R1, Y1)a la derecha.Si ahora queremos calcular el resultado de la suma de los dos complejos y el valor de su mdulo, solo tenemos que hacer:Cc z = x + y;float m = z.mod();

Observe que en la primera lnea el operador "+" no es exactamente el mismo que cuando se utiliza con enteros (por ejemplo, en 3 + 5). Esto lo deduce el compilador, porque sabe quexeyson complejos (dentro de la nueva clase hemos definido la operacin "suma" entre sus elementos y le hemos asignado el operador "+"). Por otra parte, en la segunda lnea solo tenemos que mandarle al complejozel mensajemod() - calcula el mdulo -; la sintaxis es la sealada:z.mod(). Ya sabemos que el resultado es un escalar y lo asignamos al nmero fraccionariom.Fjese tambin que en ambas lneas el operador de asignacin "=" no representa la misma operacin.En la primera se trata de una asignacin entre complejos; en la segunda es la tradicional asignacin entre nmeros fraccionarios. Esta capacidad "camalenica" de los operadores es tpica de la POO, y se conoce comosobrecarga[4] (veremos que tambin puede haber sobrecarga de funciones). El compilador sabe en cada momento que operador debe utilizar de toda la panoplia disponible aunque estn bajo el mismo smbolo; lo sabe por el contexto (por la naturaleza de los operandos involucrados).En la POO es frecuente que mtodos anlogos de clases distintas se referencien utilizando las mismas etiquetas. Es decir: supongamos que tenemos tres clases: los Complejos, los Vectores y los Racionales. Puede ocurrir que, por ejemplo, el mtodo para calcular el mdulo se denominemod() en las tres clases. Aunque el resultado sea un nmero racional positivo en los tres casos, naturalmente su operatoria es distinta si se aplica a racionales, vectores o matrices. Sin embargo, no existe posibilidad de confusin en el programa porque cuando apliquemos el mtodo en cada caso concreto, el compilador sabe a cual de ellos nos estamos refiriendo en base a los objetos involucrados. Esta caracterstica de la POO, da origen a lo que se llamapolimorfismo. El nombre es bastante descriptivo de su significado, y la posibilidad resulta ser de gran utilidad, pues simplifica la lectura del cdigo. Cada vez que encontremos una invocacin al mtodomodtenemos una imagen mental del resultado con independencia del objeto concreto al que se aplique.Llegados a este punto, introduciremos algn vocabulario especfico para adaptarnos a la terminologa, algo especial, que utiliza la POO:En vez de "variables" como en la programacin clsica, los datos contenidos en las clases (y en los objetos concretos) se denominanpropiedades, de forma que en el ejemplo anterior, nos referiremos a las partes real R1 e imaginaria Y1 del complejoxcomo las propiedadesReYdex (los complejos siguen teniendo una parte "real" y otra "imaginaria" incluso en la POO).Por su parte las operaciones de manipulacin contenidas en las clases (bajo la forma de funciones) reciben el nombre demtodos. Siguiendo con el ejemplo anterior, en vez de referirnos a funcinmod(), que calcula el mdulo, diremos quemodes un mtodo de la clase de los complejos. En lenguajes como C++, que puede tener elementos de ambos mundos, de la programacin tradicional y de la POO, poder utilizar indistintamente los vocablos "funcin" o "mtodo" es una ventaja, ya que nos permite distinguir en cada caso a que nos estamos refiriendo, si a funciones tradicionales o a funciones pertenecientes a clases.En uno de los prrafos anteriores hemos dicho: "... estosobjetosson casos concretos del nuevo tipo, la clase de los complejos..."; utilizando la terminologa correcta diramos: "... estosobjetossoninstanciasde la clase de los complejos...".Como puede verse,instanciasignifica una sustanciacin concreta de un concepto genrico (laclase). En el mismo sentido podramos decir que el nmero 5 (un objeto), unainstanciade la clase de los nmeros enteros, que tiene a su vez determinadosmtodos; en este caso las conocidas operaciones aritmticas: suma, resta, multiplicacin..., as como las operaciones de asignacin, la comparacin, etc.Siguiendo este criterio, la expresin: Cc x = (R1, Y1) no se dice: "declaracin dexcomo objeto de la nueva clase". Es ms correcto sealar: "xes unainstanciade la clase de los complejos". Al hecho de sustanciar un objeto concreto de una clase se le denominainstanciardicho objeto. Esta operacin (crear un objeto) est encomendada a un tipo especial de mtodos denominadosconstructores. Siguiendo con nuestro ejemplo, podemos suponer que la expresin:Cc c1(1, 3);crea un complejoc1cuyas partes real e imaginaria valen respectivamente 1 y 3, y que este objeto ha sido creado por una funcin (mtodo) deCccuya misin es precisamente crear objetos segn ciertos parmetros que son pasados como argumentos de la funcin.En ocasiones, cuando se quiere distinguir entre los valores y funcionalidades genricos (de las clases) y los concretos (de los objetos), se suelen emplear las expresiones:propiedades de claseymtodos de clasepara las primeras, ypropiedades de instanciaymtodos de instanciapara los segundos. As mismo, cuando se quiere distinguir entre una funcin normal (de la programacin tradicional) y una funcin perteneciente a una clase (un mtodo de la clase), se suele emplear para esta ltima la expresinfuncin miembro(se sobreentiende "funcin miembro_de_una_clase") [1].Como puede suponerse, elencapsulamiento, junto con la capacidad desobrecarga, constituyen en si mismos una posibilidad de abstraccin para los datos mayor que la que facilitaba la programacin tradicional. Ya s puede pensarse en un complejo como algo que tiene existencia "real" dentro de nuestro cdigo ya que lo tratamos (manipulamos) como ente independiente con caractersticas propias; de forma parecida a la imagen que de l tenemos en nuestra mente.Con ser lo anterior un paso importante, sin embargo, las mejoras de la POO respecto de la programacin clsica no terminan aqu. Los Lenguajes Orientados a Objeto como el C++, adems de los tipos de datos tradicionales, incluyen algunas clases pre-construidas, pero debido al hecho de que la "construccin" de un nuevo tipo de variable (como la clase Cc de los complejos en el ejemplo anterior) requiere un cierto trabajo de programacin inicial para disear la clase, se pens que sera estupendo poder aprovechar el trabajo realizado en determinados diseos para, a partir de ellos, obtener otros nuevos de caractersticas ms o menos parecidas. Se trataba en suma de intentar reutilizar el cdigo dentro de lo posible; en el mismo sentido que lo hacemos cuando tenemos que escribir una carta circular y buscamos en el ordenador si hay alguna anterior parecida para utilizarla junto con el procesador de textos, como punto de comienzo para la nueva. Para esto se dot al lenguaje de dos nuevas capacidades: laHerenciay laComposicin.Porherencia("Inheritance") se entiende la capacidad de poder crear nuevas clases a partir de alguna anterior, de forma que las nuevas "heredan" las caractersticas de sus ancestros (propiedades y mtodos). Se trata por tanto de la capacidad de crear nuevos tipos de datos a partir de los anteriores. Una caracterstica especial de la herencia es que si se cambia el comportamiento de laclase antecesora(tambin llamadapadre,baseosuper), tambin cambiar el comportamiento de lasclases derivadasde ella (descendientes).Como puede deducirse fcilmente, la herencia establece lo que se llama unajerarqua de clasesdel mismo aspecto que el rbol genealgico de una familia. Se entiende tambin que estos conceptos representan niveles de abstraccin que permiten acercar la programacin a la realidad del mundo fsico tal como lo concebimos. Por ejemplo, entendemos que un motor elctrico deriva de la clase general de los motores, de la cual derivan tambin los de gasolina, diesel,vapor, etc. y que, sin dejar de ser motores, cada subclase tiene sus caractersticas peculiares.Por supuesto que no tendra ningn sentido utilizar la herencia para crear simplemente un clnico de la clase base. En realidad, como en el ejemplo de la carta circular, la herencia se emplea como un primer paso (partir de algo existente) para a continuacin, perfilar los comportamientos o datos que queremos pulir en la nueva versin de la clase. Como lo que principalmente interesa al usuario de una clase es su interfaz, son justamente algunos aspectos de esta interfaz los que se modifican, al objeto de adecuar la nueva subclase a las necesidades especficas del caso. Por lo general esta modificacin de la interfaz se consigue de dos formas: 1. Aadiendo propiedades y/o mtodos que no existan en la clase base 2. Sobrescribiendo propiedades del mismo nombre con distintos comportamientos (sobrecarga y/o polimorfismo).

Aunque la herencia es uno de los pilares de la POO, tiene tambin sus inconvenientes.Por ejemplo, dado que el compilador debe imponer ciertas caractersticas en tiempo de compilacin sobre las clases creadas por herencia, esto resulta en cierta rigidez posterior. Sin embargo, como hemos visto, una de sus ventajas es la reutilizacin del cdigo.

Lacomposicin(tambin llamadaherencia mltiple) es la segunda va para crear nuevas clases a partir de las existentes.Por composicin se entiende la capacidad que presenta la POO de ensamblar un nuevo tipo (clase) cuyos elementos o piezas son otras clases. Es posible declarar clases derivadas de las existentes especificando que heredan los miembros de una o ms clases antecesoras. Siguiendo con el smil de la carta circular, la composicin equivaldra a escribirla reutilizando trozos de cartas anteriores. Es clsico el ejemplo de sealar que podramos crear una clase "coche" declarando que tiene un motor y cuatro ruedas, bastidor, aire acondicionado, etc, elementos estos pertenecientes a la clase de los motores, de las ruedas, los bastidores y los sistemas de climatizacin respectivamente.Este sistema tiene tambin sus ventajas e inconvenientes, pero es muy flexible, ya que incluso pueden cambiarse los componentes en tiempo de ejecucin.2 Resumen:Como resumen de este rpido repaso, podemos sealar que la Programacin Orientada a Objetos (POO) tiene sus propios paradigmas y ventajas, entre las que destaca la reutilizacin del cdigo. A los acadmicos les gusta decir que se sustenta en cuatro columnas a las que ya hemos hecho referencia:Encapsulamiento: Poder separar la interfaz de una clase de su implementacin, o dicho en otras palabras: no es necesario conocer los detalles de cmo estn implementadas las propiedades para poder utilizarlas. Los objetos funcionan a modo de caja negra en la que estn empaquetados los datos y las instrucciones para su manipulacin, de las que conocemos solo lo necesario para utilizarla.Herencia Crear nuevos elementos a partir de los existentes de forma que heredan las propiedades de sus ancestros. Existen dos clases de herencia: simple y mltiple.Sobrecarga: Posibilidad de crear diferentes mtodos dentro de una clase que comparten el mismo nombre, pero que aceptan argumentos diferentes y se comporten de forma distinta segn la naturaleza de estos argumentos (4.4.1a).Polimorfismo Es una caracterstica que resulta de gran ayuda en programacin pues facilita la claridad y consistencia del cdigo, aunque es un concepto bastante genrico (y frecuentemente malinterpretado). Se conoce con este nombre el hecho de que un mtodo tiene el mismo nombre y resulta en el mismo efecto bsico pero est implementado de forma distinta en las distintas clases de una jerarqua.3 Bibliografa:Para una ms detallada exposicin sobre los conceptos involucrados en la POO y su relacin con el C++, sugerimos dos referencias: "Thinking in C++" (Bruce Eckel) y "What is Object-Oriented Programming?" (Stroustrup), aunque desafortunadamente ambas en ingls. La primera bastante didctica enfocada a los aspectos "++" del C; la segunda algo ms terica pero con la autoridad que le confiere ser del inventor del C++.

1.2 El lenguaje C++"Learn not just the hows, but the whys too". Greg Comeau [7].1 GeneralidadesC++es un lenguaje imperativo orientado a objetos derivado delC[1]. En realidad un superconjunto deC, que naci para aadirle cualidades y caractersticas de las que careca. El resultado es que como su ancestro, sigue muy ligado al hardware subyacente, manteniendo una considerable potencia para programacin a bajo nivel, pero se la han aadido elementos que le permiten tambin un estilo de programacin con alto nivel de abstraccin.Nota: estrictamente hablando, C no es un subconjunto de C++; de hecho es posible escribir cdigo C que es ilegal en C++. Pero a efectos prcticos, dado el esfuerzo de compatibilidad desplegado en su diseo, puede considerarse que C++ es una extensin del C clsico. La definicin "oficial" del lenguaje nos dice que C++ es un lenguaje de propsito general basado en el C, al que se han aadido nuevos tipos de datos, clases, plantillas, mecanismo de excepciones, sistema de espacios de nombres, funciones inline, sobrecarga de operadores, referencias, operadores para manejo de memoria persistente, y algunas utilidades adicionales de librera (en realidad la librera Estndar C es un subconjunto de la librera C++).Respecto a su antecesor, se ha procurando mantener una exquisita compatibilidad hacia atrs por dos razones[2]: poder reutilizar la enorme cantidad de cdigoCexistente, y facilitar una transicin lo ms fluida posible a los programadores deCclsico, de forma que pudieran pasar sus programas aC++e ir modificndolos (hacindolos ms "++") de forma gradual. De hecho, los primeros compiladoresC++lo que hacan en realidad era traducir (preprocesar) aCy compilar despus[3](las consecuencias se dejan sentir todava en el lenguaje1.4.2).Por lo general puede compilarse un programaCbajoC++, pero no a la inversa si el programa utiliza alguna de las caractersticas especiales deC++. Algunas situaciones requieren especial cuidado. Por ejemplo, si se declara una funcin dos veces con diferente tipo de argumentos, el compiladorCinvoca un error de "Nombre duplicado", mientras que enC++quizs sea interpretado como una sobrecarga de la primera funcin (que sea o no legal depende de otras circunstancias).Comose ha sealado,C++no es un lenguaje orientado a objetos puro (en el sentido en que puede serlo Java por ejemplo), adems no naci como un ejercicio acadmico de diseo. Se trata simplemente del sucesor de un lenguaje de programacin hecho por programadores (de alto nivel) para programadores, lo que se traduce en un diseo pragmtico al que se le han ido aadiendo todos los elementos que la prctica aconsejaba como necesarios, con independencia de su belleza o purismo conceptual ("Perfection, in some language theoretical sense, is not an aim of C++. Utility is" [6]). Estos condicionantes tienen su cara y su cruz; en ocasiones son motivo de ciertos "reproches" por parte de sus detractores, en otras, estas caractersticas son precisamente una cualidad. De hecho, en el diseo de laLibrera Estndar C++(5.1) se ha usado ampliamente esta dualidad (ser mezcla de un lenguaje tradicional con elementos de POO), lo que ha permitido un modelo muy avanzado de programacin extraordinariamente flexible (programacin genrica).AunqueC++introduce nuevas palabras clave y operadores para manejo de clases, algunas de sus extensiones tienen aplicacin fuera del contexto de programacin con objetos (fuera del mbito de las clases), de hecho, muchos aspectos deC++que pueden ser usados independientemente de las clases [5].

DelCse ha dicho: "Por naturaleza, el lenguajeCes permisivo e intenta hacer algo razonable con lo que se haya escrito. Aunque normalmente esto es una virtud, tambin puede hacer que ciertos errores sean difciles de descubrir" (Shildt). Respecto alC++podramos decir otro tanto, pero hemos de reconocer que su sistema de deteccin de errores es mucho ms robusto que el deC, por lo que algunos errores de este sern rpidamente detectados.Desde luego,C++es un lenguaje de programacin extremadamente largo y complejo; cuando nos adentramos en l parece no acabar nunca. Justo cuando aprendemos un significado descubrimos que una mano negra ha aadido otras dos o tres acepciones para la misma palabra. Tambin descubrimos que prcticamente no hay una regla sin su correspondiente excepcin. Cuando aprendemos que algo no se puede hacer, hay siempre algn truco escondido para hacerlo, y cuando nos dicen que es un lenguaje fuertemente tipado ("Strong type checking"), resulta completamente falso.A pesar de todo, ha experimentado un extraordinario xito desde su creacin. De hecho, muchos sistemas operativos [4], compiladores e intrpretes han sido escritos enC++(el propio Windows y Java). Una de las razones de su xito es ser un lenguaje de propsito general que se adapta a mltiples situaciones. Para comprobar el xito e importancia de los desarrollos realizados enC++puede darse una vuelta por la pgina que mantiene el Dr. Stroustrup al respecto:www.research.att.com.Tanto sus fervientes defensores como sus acrrimos detractores han hecho correr ros de tinta ensalzando sus cualidades o subrayando sus miserias, aunque todo el mundo parece estar de acuerdo en que es largo y complejo. Ha servido de justificacin para el diseo de otros lenguajes que intentan eliminar sus inconvenientes al tiempo que mantener sus virtudes (C# y Java por ejemplo), y una de sus ltima incorporaciones, las plantillas (4.12), ha sido origen de un nuevo paradigma de programacin (metaprogramacin).En mi opinin, cualquier lenguaje de propsito general que comoC++, permita tocar ambos mundos, la programacin de bajo nivel y altos niveles de abstraccin, resultar siempre e inevitablemente complejo. Ocurre lo mismo con los lenguajes naturales que son tambin extraordinariamente complejos (esto lo saben bien los gramticos). Cualquier comunicacin entre humanos presupone una ingente cantidad de conocimientos y suposiciones previas entre los interlocutores. A pesar de lo cual, la comunicacin exacta y sin ambigedades entre dos personas no resulta fcil.2Consejos para mejorar el rendimientoLo mismo que en su ancestro, en el diseo delC++prim sobre todo la velocidad de ejecucin del cdigo [4]. Tanto uno como otro representan los ejecutables ms rpidos que se pueden construir para una mquina y circunstancias determinadas. En este sentido, la nica alternativa de mejora es la codificacin manual, el "pulido" de determinadas rutinas (o de todo el cdigo) en ensamblador, aunque evidentemente esto es impracticable para aplicaciones medianamente grandes, a no ser que se disponga de todos los recursos y tiempo del mundo.Con todo, a pesar de ser un lenguaje intrnsecamente rpido, y de que los compiladores modernos son bastante "inteligentes" en este sentido (adoptan automticamente las decisiones que resultan en el cdigo de ejecucin ms eficiente), es mucho lo que puede hacer el programador para favorecer esta rapidez con solo adoptar algunas sencillas precauciones. Estos son los consejos: Use enteros (int) con preferencia sobre cualquier otro tipo de variable numrica. En especial en los contadores de bucles. Las operaciones con enteros son del orden de 10 a 20 veces ms rpidas que las de nmeros en coma flotante. Use operadores incremento y decremento ++/-- (4.9.1) Use variables de registro, en especial en los bucles crticos, sobre todo si son anidados (4.1.8b). Use aritmtica de punteros frente a subndices de matrices (4.2.2). En problemas de computacin numrica recuerde que el clculo de funciones trascendentes es por lo general muy lento. Use referencias para argumentos y valores devueltos en funciones, antes que objetos "por valor" (4.2.3) Al definir clases utilice al mnimo las funciones virtuales (1.4.4;4.11.8a), as como los punteros a funciones-miembro (4.2.1g) Tenga en cuenta lo sealado respecto al rendimiento al tratar de: Sustitucionesinlineen funciones definidas por el usuario (4.4.6b) Preste atencin al modo de uso de aquellas funciones de librera que se presentan en dos versiones (5.1 Funciones y macros)Los compiladores modernos permiten fijar que criterio de optimizacin ser dominante: La velocidad de ejecucin o el tamao. Tanto Borland C++ (1.4.3) como MS Visual C++ utilizan la misma convencin de llamada para este propsito (opciones-O2o-O1respectivamente). Por su parte, GNU gcc dispone de varias opciones de optimizacin. En particular, la opcin-Osadopta las medidas tendentes a reducir el tamao del cdigo resultante.Nota: Aparte de las decisiones de optimizacin que puedan adoptar automticamente los compiladores y las reglas de precaucin anteriores, las modernas "suites" ofrecen herramientas de anlisis que permiten conocer de forma objetiva como es la utilizacin de recursos dentro del programa, de forma que se puedan adoptar precauciones en las zonas que resulten ms costosas, y concentrar nuestros esfuerzos de optimizacin en la zonas donde resulten ms provechosos. El compilador GNU cpp dispone de la utilidadgcov, queofrece estadsticas para analizar el rendimiento del cdigo.Entre otros datos: Cmo se ejecuta cada lnea de cdigo Qu lnea se est ejecutando actualmente. Cuanto tiempo consume cada seccin de cdigo Posibilidad de anlisis a nivel de fichero o de funcin

1.2.1 Lxico y conceptos fundamentales"Este ha sido mi ltimo curso. Me acabo de jubilar despus de cerca de 40 aos dedicado a la enseanza. A pesar de la poca consideracin que mi profesin ha tenido econmica y socialmente, acabo con la misma ilusin con la que comenc. E igualmente convencido de la trascendencia de la tarea de educar. Slo me duele un poco el comprobar la menor eficacia que sta ha tenido estos ltimos aos.

Cules han sido las causas? Ni la mentalidad hedonista que rehuye cualquier tipo de sacrificio, ni el permisivismo de los padres que satisfacen todos los caprichos de los hijos, ni los planes de estudios que se fundamentan en una visin ldica de la educacin, ni las polticas educativas con pretensiones de progresismo que priman el uniformismo sobre la bsqueda de la excelencia han favorecido en absoluto la cultura del esfuerzo, imprescindible en cualquier proceso personal de mejora, como es la educacin". Federico Gmez Pardo en "La voz del Lector" de "El Confidencial Digital" (22-06-2006)ECD.1 PresentacinCreo que buena parte de la dificultad del principiante respecto a algunos conceptos del lenguaje C++, y de muchas otras reas de la ciencia informtica, proviene de un conocimiento incompleto o vago de algunos conceptos fundamentales. En realidad se trata de una cuestin semntica; de conocer el significado exacto de algunas palabras; de disponer de un vocabulario mnimo que sirva de soporte para entender el resto. Ocurre con frecuencia que los textos informticos estn plagados de trminos que supuestamente son de uso comn, pero que en realidad no lo son tanto y cuyo significado tampoco est claramente explicado en ningn sitio. Se dan por sabidos, pero las ms de las veces el estudiante es incapaz de verbalizar correctamente su significado. Es importante que este "corpus" mnimo sea conocido sin ambigedades, de forma que los conceptos construidos sobre l no tengan fisuras y resulten de una solidez conceptual a toda prueba.Estas cuestiones semnticas son evidentemente el objeto fundamental de los gramticos y de los puristas del lenguaje (aunque sean lenguajes artificiales como los de programacin), de forma que en el caso del C++, la primera preocupacin del Estndar es definir sin ambigedad una serie de trminos. Introducir aqu algunos de los que creo ms importantes, en la seguridad de que su conocimiento atae no solo al lenguaje C++, sino al acerbo cultural de cualquier interesado en esta disciplina.2Algunos conceptosRTFM Siglas por las que se conoce un principio universal y de gran inters en la ciencia informtica actual [5].Escribir un programa es establecer el comportamiento de una mquina mediante una serie de algoritmos que definirn su funcionamiento (1.4). Segn el DRAE (Diccionario de la Real Academia Espaola de la Lengua) unalgoritmoes un conjunto ordenado y finito de operaciones que permite hallar la solucin de un problema [4]. En informtica se utiliza en el sentido de un conjunto ordenado y finito de instrucciones que gobiernan el comportamiento de una mquina para conseguir un comportamiento determinado. Las instrucciones se expresan en un lenguaje artificial (inventado conscientemente por el hombre) denominado lenguaje de programacin.Al llegar a cierto grado de madurez y universalidad algunos lenguajes son estandarizados, lo que significa que un comit internacional (1) se encarga de establecer sus reglas de uso. En el caso de los lenguajes (naturales o artificiales) estas reglas constituyen lo que se denomina sugramtica. El lenguaje C++ alcanz oficialmente esta madurez y universalidad en 1989, de forma que a partir de entonces, el Estndar C++ establece la gramtica del lenguaje que nos ocupa.Aunque todos los lenguajes de programacin tienen su "Gramtica", el enfoque respecto a la misma vara grandemente de unos a otros. En ciertos casos, como en C++, estas reglas son tremendamente estrictas, lo que tiene sus pros y sus contras. Por ejemplo, una gramtica rgida permite afinar mucho en los matices de lo que deseamos hacer; manipular los conceptos (principalmente los datos) con gran precisin, y ser advertidos de posibles errores involuntarios. Pero hay que estar muy atento a los detalles del cdigo, y hasta que no se tiene cierta prctica, los mensajes de aviso y errores del compilador pueden desesperar a cualquiera.Otro extremo est representado por los lenguajes de sintaxis ms o menos "borrosa". Por ejemplo JavaScript o Perl, en los que el compilador, o intrprete, pretende adivinar qu se supone que queremos hacer. Este comportamiento se conoce como DWIM ("Do what I mean") [7].

La gramtica se concreta en una serie de reglas y condiciones, aunque puede haber otras. Por ejemplo, de estilo. Las que imprescindiblemente debe cumplir un programa C++ para ser correcto, son de dos clases:semnticas(de significado) ysintcticas(de forma1.3.1a). Justamente es el contenido de estas normas lo que hace que un programa C++ sea distinto de un programa Java o Fortran por ejemplo. Las reglas sintcticas son muchas, pero comienzan por las que definen elalfabetodel lenguaje. Es decir: el conjunto de grafos que pueden utilizarse para escribir su cdigo.C++ permite utilizar un alfabeto de 96 caracteres ASCII en la escritura de sus programas. De ellos 91 son los caracteres grficos (representables por un grafo) que se incluyen en la tabla; los cinco restantes son caracteres no representables: Espacio; tabulacin horizontal; tabulacin vertical; salto de formato y nueva lnea.Caracteres grficos del alfabeto C++:a b c d e f g h i j k l m n o p q r s t u v w x y zA B C D E F G H I J K L M N O P Q R S T U V W X Y Z0 1 2 3 4 5 6 7 8 9_ { } [ ] # ( ) < > % : ; . ? * + / ^ & | ~ ! = , \ "

La norma C++ establece que cuando en un programa no se respetan las formas (reglas sintcticas) el compilador debe lanzar un mensaje de error o indicacin de que no entiende lo que queremos decir. Por ejemplo, el caso de que olvidemos el punto y coma al final de una sentencia. Sin embargo, con las reglas semnticas no ocurre siempre as. El estndar distingue dos tipos de reglas de significado: diagnosticables y no diagnosticables. En cuanto a las primeras, denominadasreglas de significado diagnosticable("Diagnosable semantic rules"), la Norma establece que en caso de infraccin, el compilador enviar al menos un mensaje de error. En el caso de las segundas no se requiere esta exigencia.Nota:en principio, todo el conjunto de reglas semnticas definidas en el Estndar pueden considerarse de significado diagnosticable, a excepcin de aquellas que tienen una indicacin explcita de que no necesitan diagnstico.

Las reglas estn definidas de modo que cuando se establece una condicin diagnosticable y laformadel programa no cumple este requisito, deber generarse un mensaje de error correspondiente. Sin embargo, cuando se establece un requisito diagnosticable para undatoy este no se cumple durante la ejecucin, el Estndar no establece ningn comportamiento especial para el programa.

Comportamiento dependiente de la implementacin: Cuando el comportamiento de un programa correctocon datos correctos, depende de la implementacin. Este comportamiento debe estar documentado en cada implementacin. Comportamiento indefinido: Es el comportamiento de un programa en aquellas circunstancias o situaciones para las que el Estndar no especifica un comportamiento especfico. Sera el caso del comportamiento en runtime de un programa que recibe datos incorrectos. Observe que, segn lo indicado al principio, muchos casos de programas errneos no generan un comportamiento indefinido, sino un aviso de diagnstico. Implementacin: Un compilador concreto para una plataforma determinada. Lmites de implementacin: Restricciones impuestas a los programas por una implementacin.Programa correcto("Well-formed"): Programa C++ construido de acuerdo con las reglas sintcticas de este lenguaje, con reglas de semntica diagnosticable, y que sigue la regla de una sola definicin (4.1.2). Unprograma incorrecto("Ill-formed") es el que no sigue los condicionantes anteriores.Unidentificadores un conjunto de caracteres alfanumricos de cualquier longitud que sirve para identificar las entidadesdel programa.Los identificadores pueden ser combinaciones de letras y nmeros, y cada lenguaje tiene sus propias reglas que definen como pueden estar construidos (3.2.2 Identificadores C++).Nota:algunas combinaciones de caracteres, las denominadas palabras-clave ("Keywords"), tienen un significado especfico para el lenguaje y no pueden ser utilizadas en otro contexto (3.2.1).

Generalmente los identificadores se introducen en el programa para designar una entidad; entonces se dice de ellos que son unnombre. C++ permite utilizar el mismo identificador para designar entidades diferentes a condicin de que estn en mbitos (4.1.3) diferentes, o que sean funciones con distinto nmero y/o tipo de argumentos.Nota:otro tipo especial de identificadores lo constituyen lasetiquetas; en vez de representar entidades sirven para significar sentencias [1]. Se utilizan para identificar el destino en sentencias de salto (4.10.4).

La introduccin de un nombre en el programa puede efectuarse mediante alguna de estas formas: Si el nombre representa a una entidad, mediante una declaracin (4.1.2). Si el nombre representa a una sentencia (es una etiqueta), mediante una sentencia etiquetada (4.10.1) o una instruccin de saltogoto[2].Que un mismo nombre utilizado en dos unidades de compilacin designe o no a una misma entidad, depende del tipo de enlazado que tenga el identificador en cada una de ellas (1.4.4).Cuando compilador encuentra un identificador en un programa, supone que es un nombre o una etiqueta y antes de realizar el "parsing" (1.4), intenta determinar a que entidad representa. Esta operacin, que asocia sin ambigedad cada nombre con una declaracin de dicho nombre, se denominabsqueda de nombres("Name-lookup"). Si al final del proceso no ha aparecido la declaracin correspondiente entonces el programa es incorrecto ("Ill-formed").Cuando el identificador corresponde a una funcin, puede ocurrir que el "Name-lookup" asocie un mismo nombre con ms de una declaracin. Es el caso de funciones sobrecargadas, en las que un mismo nombre corresponde a varias definiciones de la "misma" funcin. En estos casos, despus de esta primera bsqueda tiene lugar otro proceso denominado deresolucin de sobrecarga("Overload resolutin"4.4.1a) en el que se intenta averiguar a que definicin concreta corresponde el identificador.El proceso de bsqueda de nombres sigue un conjunto relativamente extenso de reglas que cubren todas las posibilidades que pueden presentarse; adems existen modificadores que alteran la forma de esta bsqueda, los denominados especificadores o modificadores de acceso. Ver en la hoja adjunta una somera descripcin del proceso (Name-lookup).

El concepto deentidades muy amplio;corresponde a:un valor; clase; elemento de una matriz; variable; funcin; miembro de clase; instancia de clase; enumerador; plantilla, o espacio de nombres del programa (ms detalles en4.1.1).Unobjetoes una entidad a la que corresponde una zona de almacenamiento [3], razn por la que se dice de ellos que tienen existencia real o fsica. Los objetos son introducidos en el programa mediante una declaracin, y creados mediante una definicin (4.1.2). Gozan de una serie de propiedades que vienen definidas desde el momento de su creacin, entre ellas est laduracinde su almacenamiento, que tiene influencia en su ciclo vital ("Lifetime"), y puede ser de tres tipos:esttica, dinmica y automtica (4.1.5). Otra propiedad no menos importante de los objetos es sutipo, que tambin viene determinado desde el momento de su creacin (2.2).

Las entidades del programa pueden tener otros atributos o propiedades cuya comprensin es igualmente importante: direccin (Lvalue) y valor (Rvalue). Sus caractersticas se detallan en el apartado correspondiente (2.1), pero adelantemos aqu queRvaluese asigna al concepto de "valor"; algo que tenga valor es un Rvalue (o tiene esta propiedad). Por su parteLvaluese asimila al concepto de direccin; espacio de almacenamiento que pueda recibir un valor [6].Una entidad puede tener uno o ambos de estos atributos. Por ejemplo:char func () { ... }char c = '5';const int k = 2 + 3;La funcinfuncpuede ser considerada un Rvalue en el sentido que devuelve un valor: tambin la variablec; la constantek, o la expresin2 + 3pueden ser consideradas Rvalues porque tienen o representan un valor.Tanto la variable c como la constante k son tambin Lvalues, en el sentido que ambas disponen de una direccin y un espacio de almacenamiento correspondiente (que en el primer caso puede ser alterado y en segundo no). Sin embargo, ni la funcin func, ni las expresins '5' o 2 + 3 pueden considerarse como tales porque no les corresponde una direccin o espacio de almacenamiento donde pueda colocarse un Rvalue. En este contexto tiene sentido decir que unLvalue modificablees aquel que puede cambiar el valor contenido en su almacenamiento.

Unaexpresines un conjunto de operadores, operandos y signos de puntuacin que especifican una computacin (suponen una secuencia de instrucciones concretas para la mquina); generalmente, como resultado de esta computacin producen un valor, aunque tambin, como consecuencia de ella pueden producirse otros efectos denominados efectos laterales (1.3.1).

1.3 Estructura de un programa"The input of computation is energy and information; the output is order, structure, extropy" Kevin Kelly: "God Is the Machine" en Wired Magazinewww.wired.com1 SinopsisLa estructura de un programa es una cuestin que puede ser abordada desde varios puntos de vista, en este captulo consideramos solo dos:Componentes lgicos:se refiere a los diversos elementos que componen una aplicacin, desde los ms complejos hasta los ms simples. Si comparamos un programa con un edificio, los elementos iran desde el edificio como un todo, a los ladrillos (sus elementos ms pequeos)1.3.1.Almacenamiento:se refiere a como estn alojadas sus partes en la mquina que lo ejecuta. Esta cuestin puede ser abordada desde dos perspectivas: Organizacin lgica.Comprende las caractersticas de los diversos tipos de almacenamiento que se distinguen en un programa C++ (1.3.2). Organizacin fsica.Toma en consideracin los diversos dispositivos fsicos utilizados por el programa para alojarse l mismo y sus datos (2.2.6).

1.3.1 Estructura lgica.Part of the problem is that programming is hard to teach. Programming is a mixture of a highly technical skill and an aesthetic art. And thats a very difficult combination. James Maguire en su artculo "The 'Anti-Java' Professor and the Jobless Programmers". Basado en una entrevista con Robert Dewar, profesor emrito de Ciencia de la Computacin en New York.1 SinopsisDesde el punto de vista lgico, puede considerarse que los programas comprenden dos tipos de elementos diferentes:estructuras de datos y algoritmos. O dicho en otras palabras:datos, e instrucciones para su manipulacin. Su representacin codificada adopta dos formas: una entendible por la mquina (ejecutable y ficheros de datos) y otra entendible por el humano (fuente). Para el conjunto de ambas puede considerarse una escala conceptual que, si vamos de lo general a lo particular, podemos representarla como sigue:Nota: clasificaciones como la que aqu proponemos solo tiene una finalidad didctica; son un vehculo para introducir al lector en la comprensin global del concepto y no un asunto dogmtico e inamovible, ya que este tipo de asuntos depende grandemente del punto de vista que se adopte. Como botn de muestra, vaya por delante la definicin de lo que es un programa en palabras de Ellis y Stroustrup [63.3], que por lo dems ofrece un punto de vista muy interesante: "Un programa consiste en uno o ms ficheros enlazados juntos. Un fichero consiste en una secuencia de declaraciones" (ver Declaraciones y definiciones en4.1.2). A continuacin admiten que esta afirmacin puede parecer extraa a aquellos acostumbrados a pensar en un programa como una serie de sentencias ejecutables acompaadas de las declaraciones de las variables correspondientes. Pero recuerdan que en C++, las sentencias estn contenidas en funciones, y que en realidad, el cuerpo de una funcin es en s mismo una declaracin (de la propia funcin). En consecuencia, puesto que las declaraciones pueden contener inicializadores, tambin deben ser consideradas como "ejecutable" (lo que hemos denominado algoritmo).2AplicacinComprende ejecutables y datos. Puede haber mltiples ficheros de ambos tipos (ficheros de datos y ejecutables).3ProgramaParte de una aplicacin (cdigo) que puede cargarse y ejecutarse independientemente.4Fichero fuente:Se llaman as (abreviadamente) los ficheros que contienen el cdigo fuente (ficheros .C / .CPP) escrito por el programador.Un "fuente" se compila de una vez, cuando recibe la accin del preprocesador (1.4.1), dando lugar a lo que tcnicamente se denominaunidad de compilacin(1.4.2). Un solo fuente puede ser dividido en mltiples ficheros, cada uno de los cuales puede contener varias funciones, aunque la inversa no es cierta:una funcin no puede ser dividida entre varios fuentes.La mayora de las aplicaciones de cierto porte ocupan ms de un fuente. Los diversos ficheros son creados y mantenidos por distintos programadores. Despus, los ficheros son compilados y enlazados para producir una aplicacin final.Es conveniente recordar que C y C++ se desarrollaron en ambientes UNIX, por lo que desde su cuna son lenguajes sensibles a las maysculas/minsculas ("case sensitive") [3]. Esto no representa inconveniente para los programadores acostumbrados a entornos Unix/Linux, pero suele ser fuente de errores para los que han desarrollado en Sistemas MS-DOS y Windows donde esta distincin no es tan importante. Por ejemplo, en C++ la declaracinint X, x;declara dos variables distintas.5Funcin:Una parte de un programa (subrutina) con un nombre, que puede ser invocada (llamada a ejecucin) desde otras partes tantas veces como se desee. Opcionalmente puede recibir valores (argumentos); se ejecuta y puede devolver un valor (4.4).main(4.4.4) es la primera funcin en cualquier programa C++; es llamada desde unas rutinas especiales "de inicio" que se incluyen automticamente en todo programa C++. Esta funcin es el punto de inicio del programa desde el punto de vista del programador (donde este toma el control).6BloqueLista, que puede estar vaca, de sentencias delimitadas por corchetes{ }(3.2.6). Desde el punto de vista sintctico, un bloque puede ser considerado como una sola sentencia (sentencia compuesta4.10). Dentro de las posibilidades de memoria, los bloques pueden ser anidados a cualquier nivel (los bloques pueden contener otros bloques). El aspecto de los bloques "anidados" es como sigue:... // espacio global del ficheromain{ // comienzo del bloque main .... // espacio del bloque main{ // bloque anidado ... // espacio del bloque anidado} // fin de bloque ....} // fin del bloque main7SentenciaSi establecemos una analoga entre un lenguaje natural y un lenguaje computacional como C++, podemos afirmar que lassentencias("Statements") juegan en C++ el mismo papel que lasoracionesen el lenguaje natural, y del mismo modo que una oracin gramatical es una palabra o conjunto de ellas, con que se expresa un sentido gramatical completo [4], las sentencias se componen de una o variasexpresionesy tienen sentido computacional completo.La sentencia es la unidad lgica completa ms simple en un programa; en C/C++ terminan en punto y coma;. Un caso especial es la expresin nula (;aislado). En el apartado1.3.1ase describe su sintaxis y en el captulo4.10se ofrece su definicin formal y una clasificacin de los distintos tipos que existen en C++.Un caso especial lo componen las directivas de preprocesado (4.9.10), que suponen transformaciones en el fuente por parte del preprocesador (1.4.1).8ExpresinSiguiendo en sentido ascendente de simplicidad en el lenguaje natural, despus de las oraciones estn lasfrases, Conjunto de palabras que basta para formar sentido, especialmente cuando no llega a constituir una oracin cabal [5]. Su equivalente en el lenguaje C++ sern lasexpresiones.Lasexpresionesson secuencias de tokens (operadores, operandos y elementos de puntuacin) que especifican una computacin; tienen sentido computacional en s mismas. Son los bloques de computacin ms simples con los que se construye un programa [65] aunque no pueden ejecutarse separadamente sino cuando forman una sentencia.Como ver el lector, la diferencia entre sentencia y expresin es algo arbitraria. Una o varias expresiones terminadas en punto y coma constituyen una sentencia. Desde el punto de vista lgico, cada sentencia se ejecuta de una vez (aunque sus expresiones sean evaluadas individualmente siguiendo ciertas reglas). En el programa suele estar muy claro cual es el orden de ejecucin de sus sentencias, no as de sus expresiones dentro de ellas, toda vez que el Estndar es permisivo en algunos aspectos de detalle.Es importante sealar que, en contra de lo que ocurre en otros lenguajes, en C/C++, el final de lnea no significa necesariamente el fin de la expresin, de forma que esta puede ocupar ms de una lnea (en realidad el compilador ignora los pares de caracteres CR/LF que aaden los editores al final de lnea). Por ejemplo: la expresinint x = 5*(4+(3/2-1))puede ser escrita como:int x = 5* ( 4+ (3/2-1) );

Los conocedores de otros lenguajes advertirn que en C++ no tiene sentido la barra inclinadas \ con que otros lenguajes indican que la siguiente lnea de cdigo es en realidad una continuacin de la anterior. Se excepta naturalmente el caso de constantes de cadena, dondesies preciso indicar al compilador que, en su caso, la cadena contina en la lnea siguiente. Ejemplo, aunque es correcto escribir:int x = 5;En cambio es incorrecto ponerchar* string = "Las constantes de cadena pueden tenercualquier longitud";En este caso es necesario indicar al compilador que la cadena contina en la lnea siguiente:char* string = "Las constantes de cadena pueden tener \cualquier longitud";

Del mismo modo que los gramticos distinguen varios tipos defrases(hecha, musical, proverbial, etc), los informticos distinguen tambin varios tipos deexpresiones. Los ejemplos que siguen son meramente ilustrativos y no pretenden ser una relacin completa: De asignacin: Si tienen uno, o varios, operadores de asignacin (4.9.2). Ejemplos:x += 3;z = y = x/2; Declarativas: Si dan a conocer un identificador al compilador (4.1.2). Ejemplos:extern int funcX(int x, char c);class MiClase; Definiciones: Establecen la creacin de un objeto reservndole espacio fsico. Ejemplo:int x = 2;MiClase c1 (x, y, z); Condicionales: Definen alternativas de accin en el programa. Ejemplos:int y = 6 ? 7: 8;if (salida = 'S') break; De salto: Obligan al programa a seguir en un sitio distinto de la secuencia natural (la siguiente sentencia). Ejemplos:break;continue; Bitwise. De manejo y comparacin de bits (4.9.3). Ejemplos:x | y;x namepostfix-expression++postfix-expression--const_cast< identificacin-de-tipo > ( expresin )dynamic_cast< identificacin-de-tipo > ( expresin )reinterpret_cast< identificacin-de-tipo > ( expresin )static_cast< identificacin-de-tipo > ( expresin )typeid( expresin )typeid( nombre-de-tipo )lista de expresiones:(expression-list)expresin-de-asignacinlista-de-expresiones, expresin-de-asignacinexpresin-unitiaria:(unary-expression)postfix-expression++ expresin unitaria- - expresin-unitariaoperador-unario expresin-de-modeladosizeof expresin-unitariasizeof( nombre-de-tipo )expresin de asignacin-de-memoria (allocation-expression)expresin-de-desasignacinoperador-unario: (alguno de los siguientes)& * + - ! ~expresin-de-asignacin-de-memoria: (allocation-expression)new new-type-name new (nombre-de-tipo) placement:(lista-de-expresiones )new-type-name:especificadores-de-tipo declarador-new:(new-declarator)ptr-operator declarador-new [ ]expresin de desasignacin:(deallocation-expression)delete expresin-de-modeladodelete[ ] expresin-de-modeladoexpresin-de-modelado:(cast-expression)expresin-unitaria( nombre-de-tipo ) expresin-de-modeladoexpresin-pm:(pm-expression)expresin-de-modeladopm-expresion.* expresin-de-modeladopm-expresion->* expresin-de-modeladoexpresin-multiplicativa:(multiplicative-expression)expresin-pmexpresin-multiplicativa* pm-expressionexpresin-multiplicativa/ pm-expressionexpresin-multiplicativa% pm-expressionexpresin-aditiva:(additive-expression)expresin-multiplicativaexpresin-aditiva+ expresin-multiplicativaexpresin-aditiva- expresin-multplicativaexpresin-de-desplazamiento:(shift-expression):expresin-aditivaexpresin-de-desplazamiento expresin-aditivaexpresin relacional:(relational-expression)expresin-de-desplazamientoexpresin-relacional expresin-de-desplazamientoexpresin-relacional= expresin-de-desplazamientoexpresin-de-igualdad:(equality-expression)expresin-relacionalexpresin-de-igualdad== expresin-relacionalexpresin-de-igualdad!= expresin-relacionalexpresin-AND:(AND-expression)expresin-de-igualdadexpresin-AND& expresin-de-igualdadexpresin-de-OR-exclusivo:(exclusive-OR-expression)expresin-ANDexpresin-de-OR-exclusivo^ expresin-ANDexpresin-de-OR-inclusivo:(inclusive-OR-expression)expresin-de-OR-exclusivoexpresin-de-OR-inclusivo| expresin-de-OR-exclusivoexpresin-lgica-AND:(logical-AND-expression)expresin-de-OR-inclusivoexpresin-lgica-AND&& expresin-de-OR-inclusivoexpresin-lgica-OR:(logical-OR-expression)expresin-lgica-ANDexpresin-lgica-OR|| expresn-lgica-ANDexpresin condicional:expresin-lgica-ORexpresin-logica-OR? expresin: expresin-condicionalexpresin-de-asignacin:(assignment-expression)expresin condicionalexpresin-unitiaria operador-de-asignacin expresin-de-asignacinoperador-de-asignacin (alguno de los siguientes):=*=/=%=+=-==&=^=|=expresin:expresin-de-asignacinexpresin, expresin-de-asignacinexpresin-constante:expresin-condicional

1.3.2 AlmacenamientoNota: en este captulo tratamos algunos aspectos lgicos del almacenamiento de un programa en una computadora (cdigo y datos). En el captulo2.2.6se amplan algunos conceptos relativos al almacenamiento de los datos que incluyen detalles sobre el soporte fsico utilizado.1 PrembuloLos aspectos concretos de almacenamiento de un programa dependen de la plataforma, no existe un modelo nico. Por ser con mucho el ms extendido, nos referiremos aqu al modelo de almacenamiento tpico de un programa ejecutable estndar (no una librera dinmica [0] ) en el entorno Windows 32. Modelo que, salvo algunos detalles, puede aplicarse a otras plataformas modernas.2El proceso de cargaEn el entorno Windows-32, cuando el Sistema carga un ejecutable (fichero-imagen) desde la memoria externa (disco), se inicia un proceso bastante complejo hasta que sus distintos mdulos, que aqu se llamansegmentos, quedan alojados en las posiciones de memoria asignadas por el Sistema.Nota: Los distintos segmentos no necesariamente resultan contiguos entre s, pero las entidades de cada segmento s estn dispuestas de forma contigua dentro de ellos.Para entender el proceso, recordemos que la mquina no entiende de conceptos tales comoa = b + 1, para el procesador no existen las variablesaob. En consecuencia, la actuacin combinada del compilador y ellinkerdebe reducir la expresin anterior a algo como "copia en el registroRel contenido de lasnposiciones de memoria a partir de la posicinx(direccin de la variableb); smale una unidad, y copia el resultado ennposiciones de memoria a partir de la posicinz(direccin que corresponder a partir de ahora a la variablea)". Toda esta informacin se encuentra codificada en binario en el fichero imagen, pero el problema es que el enlazador no puede conocer de antemano en qu posiciones de memoria ser cargado el programa para su ejecucin (en realidad puede ocupar posiciones distintas en cada ejecucin). En consecuencia, las posicionesxyzconsignadas en el fichero imagen, no son posiciones absolutas sino relativas a una posicin inicial que ser asignada por el Sistema en el momento de la carga.La consecuencia final es que, adems del acomodo en memoria de los distintos mdulos, la utilidad de carga debe recalcular las direcciones contenidas en la imagen, sumndoles un desplazamiento inicial ("offset") segn el punto de inicio del segmento correspondiente. Recuerde que en el ejecutable no existen identificadores (nombres), solo direcciones de memoria. Es frecuente utilizar la siguiente terminologa: Direccin baseBA ("Base Address") de un fichero imagen cargado en memoria, es la direccin de inicio. Direccin virtual relativaRVA ("Relative Virtual Address") de un objeto en un fichero imagen, es el valor de su direccin despus de cargado en memoria menos la direccin base del fichero imagen. Direccin virtualVA ("Virtual Address") de un objeto en un fichero imagen cargado en memoria, es el valor de su direccin. La razn de que se denomine "virtual" es porque el Sistema Operativo crea un espacio de direcciones distinto para cada proceso que corre en el sistema. Este espacio es independiente de la memoria fsica, ya que puede utilizar memoria virtual (en disco).Montn local(local heap)

Pila(Stack)

Datos estticos no inicializados

Datos estticos inicializados

Cdigo del programa(code segment)

La disposicin final de los mdulos en memoria sigue un esquema como el de la figura, pero en un SO moderno no debe pensarse en la imagen cargada en memoria como un todo indivisible. De hecho, el segmento de cdigo es bastante independiente del de datos (en la figura lo hemos separado deliberadamente). Puede a su vez estar constituido por un solo trozo o por varios que pueden ser cargados en memoria de forma no simultanea, solo cuando se necesitan (carga bajo demanda). Adems, puede ocurrir que los distintos segmentos obtengan distintos permisos de uso por parte del Sistema Operativo. Por ejemplo, la aplicacin propietaria puede tener permiso de solo lectura ("read-only") sobre el segmento de cdigo, y de lectura-escritura para el resto. Sin embargo, en las libreras dinmicas (compartidas), el segmento de cdigo puede tener autorizacin de lectura para cualquier proceso que lo solicite..3Segmento de cdigoEn la parte ms baja del espacio ocupado por la aplicacin se sita el cdigo del programa, denominado tambinsegmento de cdigo("Code segment") contiene el cdigo (algoritmo) ejecutable y todos los valores que han podido ser resueltos en tiempo de compilacin, como es el caso de algunas constantes que no reciben un Lvalue. Recordemos que en esta zona est el cdigo de todas las funciones (incluyendo las funciones-clase4.11.5), y que los punteros-a-funcin sealan precisamente direcciones de este segmento.En realidad no necesariamente existe un segmento de cdigo para cada instancia del programa en ejecucin. Por razn de eficiencia y economa de espacio, existen casos como el de las mencionadas libreras dinmicas (DLLs), en los que varias instancias de un mismo programa comparten el mismo segmento de cdigo (por supuesto cada instancia tiene su propio segmento de datos).Cuando ocurre esto se dice que el cdigo es reentrante y puede ser utilizado simultneamente por varias instancias sin peligro de corrupcin debido precisamente a la independencia de los datos de cada una de ellas.4Segmento de datosDonde termina el segmento de cdigo, comienza una zona destinada a datos, es el denominadosegmento de datos("Data segment") o memoria local, aunque tampoco debe pensarse en el segmento de datos como un todo de tamao fijo e indivisible. Est organizado en cuatro subzonas que no necesariamente son contiguas (puede que lo sean), con caractersticas particulares y distintas en funcin del tipo de dato y cmo son manejados por el programa. Durante el proceso de carga, el Sistema les asigna el espacio necesario dentro de la memoria total disponible. A continuacin, cuando se inicia el proceso, estas zonas son inicializadas.Las zonas dedatos estticospermanecen constantes en tamao a lo largo de la vida del programa,precisamente porque aqu se guardan variables y constantes cuyo tamao es conocido en tiempo de compilacin. Pero lapilay elmontn, pueden variar de tamao durante la ejecucin porque guardan objetos que son conocidos en runtime. En el primer caso (lapila) porque ah se guardan los valores de las funciones, y en el caso de la invocacin de funciones con gran nivel de anidamiento (4.4.6b) esta estructura puede crecer indefinidamente. En el caso delmontn, puede ocurrir que en tiempo de ejecucin el proceso demande ms memoria para datos persistentes, espacio que ms adelante puede ser liberado de nuevo (3.4). En ambos casos, el tamao de estas zonas puede aumentar y disminuir, y consecuentemente, la memoria total demandada al Sistema por el proceso en ejecucin.Nota:piense que un Sistema Operativo moderno asigna espacio segn demandan sus aplicaciones [4]. Cuando no hay memoria interna disponible, la simula mediante un mecanismo dememoria virtual(H5.1), que utiliza el disco para estos menesteres. Tericamente el Sistema puede proporcionar memoria a una aplicacin mientras exista espacio en disco, pero tambin puede prevenirse que una aplicacin no pueda asignar memoria por encima de un cierto valor (HEAPSIZE1.4.4a).La subzona que le corresponde a un dato concreto depende de las siguientes caractersticas: Que el dato sea conocido en tiempo de compilacin o en runtime. Que el dato sea persistente (esttico) o se destruya cuando el programa sale del bloque en que fue definido (automtico)Nota: algunas caractersticas de los elementos descritos en este captulo, por ejemplo su tamao, pueden ser establecidos mediante las rdenes oportunas al enlazador ("Linker"1.4). Ver al respecto:Fichero de definicin(1.4.4a).4.1Datos estticosSon objetos cuya vida se extiende durante todo el programa. Tienen existencia semntica y fsica (disponen de espacio de almacenamiento) antes que el programa inicie su ejecucin y terminan al finalizar este. Corresponden a entidades declaradas fuera de cualquier funcin (mbito de fichero) o de mbito de funcin que han sido declaradas estticas. Pueden ser de cualquier tipo y se almacenan en una zona especial del segmento de datos. Seran el caso de los objetos sealados en el ejemplo:static int x = 12; // Esttica iniciadastatic int y; // dem no iniciadaint X = 10; // Ok. tambin esttica iniciadaint Y; // dem no iniciada...void foo (int x) { static int n1 = 22; // Esttica iniciada static int n2; // Esttica no iniciada ...}Nota: aparte de los "estticos", existe otro tipo de datos persistente, que son almacenados en otro sitio y declarados de modo distinto. Son los objetos del montn que se describen ms adelante. Aparte de la zona de almacenamiento y su forma de declaracin, se diferencian de los estticos en que, aunque son de duracin indefinida, esta es iniciada y cancelada por el programador a voluntad. Resulta as que desde el punto de vista de la persistencia, en los programas C++ se distinguen tres tipos de entidades: Objetos automticos: Se almacenan en la pila y tienen duracin de bloque de sentencia. Se dice de ellos que tienen almacenamiento dinmico. Objetos estticos: Tienen la misma duracin que el programa. Se dice de ellos que tienen almacenamiento esttico. Objetos del montn. Tienen duracin entre dos instantes a voluntad del programador: el momento de su creacin y el de su destruccin. Se dice de ellos que tiene almacenamiento asignado ("Allocated storage").4.1aDatos estticos inicializadosEsta primera zona contiene datos estticos inicializados. Es decir, que reciben un valor explcito en el cdigo del programa. Suelen ser cadenas literales y entidades numricas, aunque pueden ser de cualquier tipo. Es tambin el caso de objetos estticos (instancias de clases) cuya inicializacin corre a cargo del constructor correspondiente. Por ejemplo, los iostreams de la Librera Estndar C++ de E/S (5.3)4.1b Datos estticos no inicializadosAnlogos a los anteriores pero sin inicializacin. Hemos indicado que en cualquier caso, dispongan de inicializacin explcita o no, los objetos estticos tienen existencia fsica antes que se inicie la ejecucin del programa. A este respecto, el Estndar establece que todas las variables estticas que no hubiesen sido inicializadas se inicializan a 0 cuando el segmento de datos es creado en memoria.Nota: Cuando en los textos informticos se dice coloquialmente "guardar datos en el segmento", se refieren a alguna de estas dos zonas de datos estticos.4.2Pila ("Stack")Es un rea muy importante manejada directamente por la UCP para alojar datos durante la ejecucin del programa. Su nombre deriva de su propio mecanismo de funcionamiento. Es un almacn de datos contiguos del tipoLIFO("Last In First Out"1.8). Frecuentemente es comparada con una pila de platos; el ltimo en ser colocado es el primero en ser retirado.Se usa para muchas cosas, por ejemplo, aqu se almacenan las variables locales automticas y los datos involucrados en el mecanismo de invocacin de funciones, de forma que si se utilizan muchas de estas invocaciones forma anidada o recursiva, la pila crece. En algunos sistemas, la pila y el montn son contiguos y el crecimiento desmesurado de la pila puede llegar a sobrescribir el rea inferior del montn. Ms informacin al respecto en: (4.4.6b Carga y descarga de funciones).Los movimientos en el stack son generalmente rpidos, a veces basta una simple instruccin del procesador para almacenar o borrar algo en la pila. Los objetos colocados en ella se asocian a unaduracin automtica. El trmino se refiere a que es el compilador el que determina cuando se destruyen. El lenguaje C++ se caracteriza por hacer un uso extensivo de la pila (muchos objetos son "automticos" por defecto) y el mecanismo de invocacin de funciones se basa en su utilizacin. Decimos que C++ es un lenguaje orientado a la pila.La localizacin y desalojo de variables de la pila se realiza de forma automtica (son decisiones tomadas por el compilador), no obstante, la directivaregister(4.1.8b) permite indicar que algunas variables que normalmente iran en esta zona, sean alojadas en los registros del procesador.Precisamente este "automatismo" hace que la llamada explcita al destructor de objetos que hayan sido construidos en esta zona sea extremadamente peligroso, ya que si se realiza antes de que el objeto salga de mbito, el destructor ser llamado de nuevo cuando sea liberado el marco de la pila correspondiente a dicho mbito. A cambio la pila presenta la comodidad que supone la destruccin automtica de los objetos alojados en ella cuando salen de mbito (con la liberacin de la memoria correspondiente), lo que supone que no hay peligro de prdidas inadvertidas porque el programador olvide destruir el objeto. Es el siguiente caso:class MiClase { ......}...{ // un mbito cualquiera... .... MiClase objeto1; ....} // Ok. objeto1 es destruido al llegar a este punto4.3Montn local ("Local heap")Es un rea fija de memoria, asignada en runtime por las rutinas de inicio antes de que comience la ejecucin demain(4.4.4). Se usa para la asignacin dinmica de memoria. Por eje