Características Del C++.
Características Del C++.
Características Del C++.
INTRODUCCION
~~~~~~~~~~~~~~~~~~~~~~~~
Contenido:
~~~~~~~~~~
Una curiosidad: Por qu llamarle C++ ("C plus plus" es como lo llaman los
yanquis, aunque hay formas de leer su nombre para todos los gustos) y no D
(parece lgico que despus de la C vaya la D) o C+ (C "plus")? Realmente no lo
s, pero lo que s puedo decir es que fue una eleccin acertada, ya que su nombre
es una sentencia vlida del lenguaje que viene a significar algo as como "asigna
a C el valor C ms 1". Pocos lenguajes tienen encerrados en su nombre tiene
tanta filosofa...
Creo que con unas referencias como estas es una buena idea el ver por nosotros
mismos de qu va este lenguaje y aprender un poco de l, no? Pues all vamos.
Os espero en la siguiente entrega ;)
Aqu est la segunda entrega del cursillo. Esta entrega espero que sirva para que
si no has visto nunca un programa de C++, te vayan acostumbrando a su aspecto.
Si por el contrario has tenido oportunidad de ver programas o tienes experiencia
con C, tes sonar a concocido (o eso espero).
Cuando el curso haya avanzado algo, espero poder empezar a poner ejercicios,
pero todava es algo pronto para ello.
Et voil!
~~~~~~~~~~~~~~~~~~~~~~~~
Los comentarios. Decir qu vamos a utilizar para que el compilador sepa cmo se
utiliza. Dnde ponemos el cdigo. Los datos.
Contenido:
~~~~~~~~~~
Pues para empezar con algo tangible, vamos a ver el tpico programa de Hola
mundo! (s, ese que lo nico que hace es poner en pantalla ese curioso saludo).
Pues no esperemos ms, aqu lo tenemos:
===[hola.cpp]===
/*
* hola.cpp
*/
#include <iostream.h>
void
main() {
===[hola.cpp]===
===[hola.cpp]===
1: /*
2: * hola.cpp
3: */
4:
5: #include <iostream.h>
6:
7: void
8: main() {
===[hola.cpp]===
Lnea 5: en este caso, mencionar que mire cmo se usa el cout que utilizaremos
despus(1).
Vamos a verlas con un poco ms de detalle y digamos algo sobre cada una de
ellas.
Los comentarios en C++ pueden ser de dos formas; rodeando un texto (las que he
utilizado en el programa) y las que indican que el resto de la lnea es un
comentario. Los comentarios que se delimitan por los extremos, se empiezan con
un /* (barra-asterisco) y se terminan con un */ (asterisco-barra). Todo lo que est
entre esas dos cosas es un comentario, que puede ser de varias lneas de longitud.
Un ejemplo:
Los otros asteriscos que se ven en el programa (lnea 2) son slo de "adorno".
El otro tipo de comentarios, que no aparecen en el programa, son los de una sla
lnea, y su inicio se indica con un // (barra-barra), su fin es el fin de la lnea (el
ENTER, por decirlo de alguna manera). Un ejemplo:
Los comentarios del tipo de /**/ son los que haba en el lenguaje C (y por
supuesto, sigue habindolos en C++), mientras que los de // son exclusivos del
C++. Una cosa ms: los comentarios se puede poner prcticamente en cualquier
sitio.
Todo lo anterior estaba muy bien, pero nosotros queremos un programa que haga
algo. Y dnde ponemos las cosas que queremos que haga? En main() (4).
La palabra void que hay antes de main() indica que main() no devuelve ningn
resultado al sistema operativo (void significa vaco).
En el cuerpo de la funcin (la parte entre llaves) nos encontramos con una sla
instruccin (lnea 9), en la cual se manda un mensaje a cout. Antes habamos
includo el fichero iostream.h (lnea 5), slo para que el compilador supiera
cmo se puede llamar a cout. Pues bien, cout representa el dispositivo de salida
estndar, que suele ser la pantalla, y est definido de tal manera que las cosas que
queramos que se impriman en pantalla se le pasan poniendo entre el cout y el
mensaje un << (menorque-menorque).
Y LOS DATOS?
Pues en ese programa tan pequeo, no se han definido esplcitamente datos. Los
datos se pueden poner en cualquier sitio, pero slo puedes utilizarlos en un sitio
posterior a donde se han definido (en C haba una restriccin para las
definiciones de datos dentro de una funcin: slo podan estar justo detrs del
{ (abrir-llave) o siguiendo a otra definicin de datos).
Otra cosa ms sobre los datos: no es lo mismo colocarlos dentro que fuera de un
cuerpo de una funcin (si es dentro de una funcin slo se puede utilizar dentro
de la funcin en la que se ha definido y antes del siguiente } (cerrar-llave).
Todo esto lo veremos cuando lleguemos al captulo de las variables, por ahora
nos basta con saber que s se pueden poner datos en diferentes partes del
programa y que importa el lugar donde se coloquen.
-+-
He metido un par de ejercicios sencillos. Para que te los corrija, mndame tus
respuestas por NET al 2:341/66.3, y te devuelvo por NET las correcciones ok?.
He puesto una nota a pie de pgina... pero est algo fuera del nivel del captulo, o
sea que tampoco te preocupes mucho por ella.
Y aqu lo tienes :)
~~~~~~~~~~~~~~~~~~~~~~~~
Contenido:
~~~~~~~~~~
EL PREPROCESADOR Y EL COMPILADOR
No quera continuar el cursillo sin dejar claro que lo que nosotros llamamos
habitualmente el compilador de C/C++, realmente son dos programas diferentes
que trabajan en equipo. Los programas son: el preprocesador, que slo prepara el
cdigo fuente con ciertas tareas que podramos denominar de buscar/reemplazar,
y el compilador, que traduce nuestro bonito programa en C/C++ a cdigo objeto
(instrucciones del procesador mas algo de informacin para otros programas que
nos permitirn mezclar cdigo de varios compiladores y depurar el programa, por
mencionar dos de los usos ms importantes).
Mientras que est muy clara cul es la funcin del compilador, el que haya un
preprocesador puede parecer un poco extrao, sobre todo porque a la mayora de
los lenguajes les va muy bien sin ningn tipo de preprocesador. Vamos a ver
entonces qu servicios nos proporciona el preprocesador.
Provocar errores (mediante #error, su utilidad viene dada cuando se utiliza junto
con la compilacin condicional)
Las ms importantes, como podrs suponer, son las tres primeras, que son las que
vamos a ver en esta entrega. El resto las dejamos para cuando veamos el
preprocesador en profundidad.
Una cosa ms antes de meternos con algunas de las directivas del preprocesador:
en algunos textos de C++ se comenta que se tiende a intentar hacer menos uso
del preprocesador, y de hecho, que se aconsejaba que se usasen otras
caractersticas del lenguaje para el mismo trabajo cuando fuera posible. La
explicacin de esto es que algunas cosas en C slo se podan hacer a base de
macros, mientras que en C++ se pueden hacer tambin mediante el uso de
programacin orientada a objetos (ms exactamente mediante herencia y
polimorfismo, lo que en estos momentos seguramente te sonar a chino; no te
preocupes, que todo llegar). An as su uso es ms que obligado para muchas
tareas bsicas de la programacin en C/C++.
Como ya te habrs podido dar cuanta en la seccin anterior, las directivas del
preprocesador son palabras precedidas por # (almohadilla).
Adems tienen una restriccin con respecto a las instrucciones del compilador
propiamente dicho: la directiva del preprocesador tiene que estar sola en la lnea
(con sus parmetrso si es que los tiene), quedando cosas del estilo de:
===[ejemplospp.h]===
#include <iostream.h>
#include <string.h>
#include "misdef.h"
#if defined(__cplusplus)
#define MAX_VELOCIDAD 50
#endif
===[ejemplospp.h]===
LA DIRECTIVA #include
Como ya hemos visto, nos permite incluir un fichero de texto dentro de otro.
Es algo as cmo antes de continuar, procesa el contenido de este otro fichero.
Su sintaxis es:
#include <fichero_a_incluir>
#include fichero_a_incluir
La diferencia entre encerrar el fichero a incluir entre mayores y menor-ques (< >)
y entre comillas (" "), es en dnde busca el fichero a incluir. Como regla general,
para los ficheros que vienen con el compilador (como por ejemplo iostream.h,
stdio.h, string.h) se ponen entre mayores y menor-ques (< >), mientras que los
ficheros hechos por ti se ponen entre comillas (" "). Esto es as porque los que
pones entre comillas los busca primero en el directorio actual (presumiblemente
el directorio de tu programa), mientras que los otros los busca en el directorio de
nombre include que viene con el compilador.
===[ejemplosinc.h]===
#include <stdio.h>
#include <stdlib.h>
#include <strstrea.h>
#include defmias.hpp
===[ejemplosinc.h]===
Habamos dicho que la directiva #define nos serva para definir constantes y
macros. Veamos cmo se utiliza para cada una de esas tareas.
Una constante es algo que no vara (seguro que esa frase no me acredita para
recibir un premio Nobel). Constantes tpicas que nos encontramos en el mundo
real pueden ser la constante de gravitacin universal, el nmero pi, el nmero de
das que tiene una semana o el ao en que naciste.
Una razn para definir constantes en un programa es para evitar los nmeros
mgicos. Los nmeros mgicos son nmeros que aparecen en el programa y
hacen que funcione, pero que no sabes por qu funcionan (debido a que no sabes
qu representan). El uso de constantes en vez de nmeros mgicos tiene dos
ventajas: si por cualquier causa tienes que modificar el nmero y se utiliza en
varios sitios, el haberlo definido como una constante en un slo sitio hace ms
fcil el cambio; por otra parte se entiende mejor el programa, ya que se sabe qu
es lo que representa la constante (compara un si x es mayor que 40 da un pitido
con si x es mayor que COLUMNAS_PANTALLA da un pitido).
#define NOMBRE_DE_CONSTANTE
Como puedes ver, se pueden definir constantes sin asociar ningn valor a ellas.
Eso sirve para la compilacin condicional, ya que se basa en comprobar si una
constante ha sido definida, independientemente del valor (y de si tiene un valor
asociado o no).
Una vez que has definido una constante, el preprocesador sustituir el nombre de
la constante por el valor de la constante, sin importarle si el valor era un nmero,
un texto, una instruccion o una mezcla de todas ellas (vamos, que el valor de la
constante puede ser cualquier cosa, simpre que lo puedas meter en una sola
lnea).
El ejemplo que voy a poner a continuacin no es muy real (no es normal que las
cosas se hagan de esta manera), pero ilustra el uso de #define para definir
constantes:
===[ejemplospp2.cpp]===
/*
* ejemplospp2.cpp
*/
#include <iostream.h>
void
main() {
cout << TEXTO << " nmero " << NUMERO_DE_VEZ << endl;
ESCRIBEHOLAMUNDO;
===[ejemplospp2.cpp]===
void
main() {
cout << "Hola Mundo!" << " nmero " << 2 << endl;
Slo queda por explicar las macros. Ya me he cansado de repetirlo, pero por una
vez ms no pasa nada. Las macros son una especie de constantes parametrizadas.
Slo se diferencian de las constantes porque hay sustitucin dentro de ellas.
Vamos a ver su sintaxis y un ejemplo sencillo:
La sintaxis de #define para definir macros es (si por ejemplo tiene cuatro
parmetros):
===[ejemplosdef.h]===
===[ejemplosdef.h]===
Como puedes ver he rodeado en la expresin los parmetros con parntesis. Eso
se hace para evitar efectos laterales (ya que a y b pueden ser cualquier cosa, as
nos evitamos problemas, ahora mismo no nos importa cules, ya lo veremos la
explicacin de estos parntesis cuando veamos los operadores). Una vez que
hemos definido las anteriores macros, las lneas
se transformaran en
Ejercicios
1.- D para qu sirve la directiva del preprocesador #include
===[pp_ej1.cpp]===
void
main(void)
===[pp_ej1.cpp]===
-+-
(1) Por si tienes curiosidad, la razn principal de que se pongan parntesis es para
evitar efectos laterales cuando se utilizan macros con variables y operadores
unarios (incremento y decremento, por ejemplo), ya que podran salir cosas muy
extraas al hacer la sustitucin: SUMA(a,++b) quedara ((a)+(++b)), pero si no
hubisemos puesto los parntesis hubiera quedado a+++b, que los compiladores
la interpretaran como (a++)+(b), que da un resultado completamente diferente
del que pretendamos (incrementamos a en vez de b y el resultado de la suma es
un nmero menor). En estos momentos esto un pequeo galimatas, pero quedar
claro cuando veamos los operadores.
Aqu est la cuarta entrega del cursillo. La siguiente la mandar A PARTIR del
da 15 de Junio. En esta entrega veremos las variables: qu son, qu tipos
tenemos y cmo declararlas. Sigue sin ser suficiente para hacer programas tiles,
pero nos vamos acercando.
Tambin esta vez he metido un par de ejercicios sencillos. Para que te los corrija,
mndame tus respuestas por NET al 2:341/66.3, y te devuelvo por NET las
correcciones ok?.
Una cosa ms, no te asustes por el tamao (yo ya me he asustado por todos). El
contenido no es tan abstracto como el tema podra incitar y simplemente es que
est bastante desarrolado.
Y aqu lo tienes :)
4 VARIABLES
~~~~~~~~~~~~~~~~~~~~~~~~
Las variables. Tipos de datos de serie. Declaracin de las variables. Asignacin
de un valor en la declaracin. Declaracin de varias variables de un mismo
tipo.La eleccin de nombres para las variables.
Contenido:
~~~~~~~~~~
LAS VARIABLES
Por todo ello tiene que haber algn mecanismo de decir que queremos utilizar
una variable, qu nombre le damos y de qu tipo va a ser. Y en C/C++, sugn el
sitio donde lo digamos, vamos a definir en qu zona del programa se conoce la
existencia de esa variable (en qu zona es visible). Dar toda esa informacin se
llama declarar la variable, y es muy sencillo de hacer. Una declaracin tpica
sera:
int numero;
Con eso estamos diciendo: declaro la variable numero como un int (nmero
entero). Como he dicho antes, al declararla, segn el sitio donde pongamos la
declaracin, decimos implicitemente en qu zona es visible. Para eso necesitamos
saber qu es un bloque de instrucciones.
===[declvar.cpp]===
/*
* declvar.cpp
*/
#include <iostream.h>
void
main()
int numero;
numero=1;
cout << "numero tiene el valor " << numero << endl;
numero=2*numero+5;
cout << "numero tiene ahora el valor " << numero << endl;
===[declvar.cpp]===
Todo el programa es muy parecido a los que hemos visto hasta ahora. En este
caso la salida del programa ser algo as como:
Vamos a ver primero qu pueden contener las variables (qu tipos tenemos
disponibles) y despus cmo modificarlar y utilizarlas (los operadores). Despus
de eso, entender el programa anterior debera algo trivial. Vamos a ello.
Se puede decir que en C/C++ existen los siguientes tipos(2): char, enum, int, float
y double, a los que el C++ aade el wchar_t.
++
enum 16 o 32
int 16 o 32
En algunos casos se puede omitir parte del nombre del tipo: short implica short
int y long implica long int.
En C/C++ las letras (hablando propiamente debera decir los carcteres, como
puede ser la letra a ('A') o el carcter punto ('.')) son su cdigo ASCII (as la letra
'A' tiene de cdigo 65).
El que sea signed o unsigned determina el rango del char (signed va de -128 a
127, mientras que unsigned va de 0 a 255).
enum:
===
#include <iostream.h>
void
main(void)
int mi_mes;
mi_mes=marzo;
cout << "El mes es: " << mi_mes << endl;
===
Como ya hemos visto, se puede asignar un enum a un int. Los enums tambin
nos permiten evitar los nmeros mgicos(7) que habamos visto en nociones
bsicas sobre el preprocesador. Un ejemplo tpico sera cuando hemos definido
un enum con los errores que puede haber en el programa:
y en un momento dado del programa (suponiendo que existe una funcin llamada
copia() que usa los cdigos anteriores) podemos hecer algo como:
int error;
error=copia("hola.txt","adios.txt");
y en otro punto del programa podramos comparar copia con ok, error_lectura y
error_escritura.
short entero_corto;
entero_corto=4325;
int entero;
entero=13784;
long entero_largo;
entero_largo=57382L;
Estos tipos son los que nos permiten utilizar nmeros en coma flotante (nmeros
reales), tales como 3.141592654, 2.5, etc.
Entre ellos slo se diferencian en la precisin que nos dan y en la forma de poner
las constantes de dichos nmeros. Como regla general, para los nmeros en los
que basten con 6 dgitos de precisin, utilizaremos float, para los que
necesitemos 12 dgitos, utilizaremos double, y si necesitamos ms, utilizaremos
long double.
f, F float 10.3e5f
float numerof;
numerof=3.1415f;
// Ejemplo de declaracin y asignacin de un double
double numerod;
numerod=143e5;
numerold=4.53564e12L;
Y esos son todos los tipos que tenemos disponibles de serie. Haba comentado
al principio que el C++ nos permite definir nuevos tipos y las operaciones entre
ellos, de manera que estn igual de integrados con el sistema que los de serie. Si
has echado en falta un tipo de dato para nmeros complejos, no te preocupes,
porque en C++ est soportado mediante una clase (en la librera estndar de
clases) que se llama complex y que est definida en complex.h. En lo nico que
se diferencia su uso del de los nmeros en coma flotante es en la manera de
definir un nmero complejo, que es por medio de constructores(9), los cuales
veremos en su momento.
Nos faltan por ver slo dos cosas respecto a la declaracin de variables: que se
pueden asignar valores a las variables en su declaracin y que se pueden declarar
varias variables del mismo tipo a un tiempo.
int numero=184;
long cantidad=162626L;
float altura=180e-2f;
int i,j,k;
i=10;
j=25;
k=j;
===[declvar2.cpp]===
/*
* declvar2.cpp
* variables.
*/
#include <iostream.h>
void
main()
char letra='c';
int numero=1,otro_numero;
float pi=3.14159f,radio=4.0f;
cout << "numero tiene el valor " << numero << endl;
otro_numero=2*numero+5;
cout << "otro_numero tiene ahora el valor " << numero << endl;
cout << "El rea de un crculo de radio " << radio << " es " <<
===[declvar2.cpp]===
slo se pueden utilizar carcteres ASCII (<=127), con lo que nos tenemos que
olvidar de nuestra querida y , as como de poner acento grfico (tilde) a las
vocales (no podemos utilizar tampoco ).
No se puede dar como nombre de una variable una palabra clave del lenguaje (tal
como int, short, if, for,...).
EJERCICIOS
1.- Pon un ejemplo de una declaracin con inicializacin de cada uno de los tipos
de variables que hemos visto.
2.- Di si cada uno de los siguientes nombres seran vlidos para ser nombre de
una variable:
-+-
(1) Una de las diferencias que hay entre el C y el C++, es que el C pone ms
restricciones respecto al lugar donde se declaran las variables locales. En C++ se
pueden poner las declaraciones en cualquier lugar del bloque (y se recomienda
que sea cerca del punto donde se va a utilizar), mientras que en C slo se pueden
declarar las variables locales al principio del bloque (detrs del abrir-llave ({) o
detrs de otra declaracin).
(2) Esta definicin de los tipos de serie no es muy rigurosa, pero es la que se da
en los sistemas de 16bit y de 32bit que utilizo. Si alguna no es extensible a otros
sistemas, mandame un NET (Fido) al 2:341/66.3
(3) En principio el wchar_t se maneja de manera anloga al char, slo que en este
caso sus constantes se expresan con una L mayscula delante, seguida de dos
letras entre comilla simple (') como por ejemplo en L'ab'
(5) Gentileza del sistema de ayuda del Borland C++ v3.1, (c) Borland Intl., Inc,
etc, etc.
(7) Los nmeros mgicos eran nmeros que aparecen en el programa y hacen que
funcione, pero para un lector casual del programa no significan nada (p. ej.
variable=80, es menos evidente que un variable=COLUMNAS_PANTALLA).
Los enums tambin ayudan a evitar los nmeros mgicos
(8) En C/C++ los nmeros enteros se truncan a nivel de bits. As, si se asigna a
una variable de 16bits un dato de 32bits, en la variable slo se guardarn los 16
bits menos significativos del dato. El C++ es un lenguaje tipado, al contrario que
el C (que no protestaba cuando se introduca in int en vez de un char, por
ejemplo: el C haca silenciosamente la conversin truncando el valor si era
necesario), por lo que en C++ vamos a necesitar forzar las conversiones aunque
en un principio parezca que no son peligrosas, como podra ser dar un char a una
funcin en vez de un int, o dar un nmero sin signo en vez de uno con signo. Eso
se hace por medio de la conversin forzada de tipos o casting, que veremos
cuando veamos los operadores.
(9) Los constructores, como su nombre indica, se utilizan para construir nuevos
elementos de una determinada clase (u objeto). A cada elemento construido se le
llama instancia de ese objeto. La manera de construir nmeros complejos es
poniendo algo de la forma de complex(134,-5.9), siendo 134 la pate real y -5.9 la
parte imaginaria. Si se define el valor en su declaracin, se pone justo despus
del nombre de la variable: complex numero(5,6); Dicho as quizs parezca un
poco raro, pero es debido a que est definido como una clase y esa es la manera
de construir objetos de una clase, como veremos ms adelante.
Es increble que hayas llegado hasta aqu abajo :-b. Pero ya que lo has hecho,
recordarte que las variables son uno de los dos pilares bsicos para la
programacin en C/C++ (lo has adivinado, el otro son las funciones -- y
encapsulando datos y funciones tendremos las clases).
Eso significa que se puede decir que ya sabes un 50% de lo bsico }:).