Anda di halaman 1dari 9

Universidad Central de Venezuela

Facultad de Ciencias
Escuela de Computación
Estructuras De Datos

Guía 1: Introducción a C++

C++ es una versión mejorada de C. Entre estas mejorías está que C++
implementa conceptos de programación orientada a objeto, mientras
que C es puramente orientado a procedimientos. Esto permite que C++
permita desarrollar software más productivo, de mayor calidad y más
reutilizable.

1. Comentarios
Los comentarios de una línea dentro del programa serán identificados
por comenzar con //. Aquellos comentarios de una línea o más deberán
estar delimitados por /* y */.

2. Declaraciones en C++
Las declaraciones de variables o funciones pueden ser colocadas antes
de cualquier enunciado ejecutable, siempre y cuando las
declaraciones antecedan el uso de lo que se está declarando.

3. Reglas de alcance
El alcance de un identificador es la porción del programa en el cual
dicho identificador puede ser referenciado. Cuando declaramos una
variable local en un bloque, esta puede ser referenciada solamente en
dicho bloque o en los bloques anidados dentro de dicho bloque.

4. Cómo crear nuevos tipos de datos en C++


C++ proporciona la capacidad de crear nuevos tipos definidos por el
usuario mediante el uso de la palabra reservada enum, la palabra
reservada struct, la palabra reservada union y la palabra reservada
class.
Por ejemplo, las enumeraciones en C++ son declaradas mediante la
palabra enum y se convierte en un tipo de dato nuevo. Luego, para
declarar una variable del nuevo tipo de dato ya no es necesaria la
palabra reservada enum, sino que se utiliza directamente el nombre del
nuevo tipo de dato.
enum Bolean {FALSE, TRUE};
struct Nombre {
char primer [10];
char segundo[10]; };

5. Directivas del Preprocesador


5.1 Typedef
La palabra reservada Typedef proporciona un mecanismo para la
creación de sinónimos o alias para tipos de datos anteriormente
definidos. Al crear un nuevo nombre utilizando typedef no se crea un
nuevo tipo; typedef simplemente crea un nuevo nombre de tipo que
puede ser utilizado como un seudónimo para un nombre de tipo ya
existente, lo cual ayuda a autodocumentar el programa.
Typedef int IntArray10 [10];

5.2 La directiva del preprocesador #include


La directiva del preprocesador #include permite que se incluya una
copia del archivo especificado. Las dos formas de la directiva son:
#include <filename>
#include “filename”
La diferencia entre estas formas estriba en la localización donde el
preprocesador buscará el archivo a incluirse. Si el nombre del archivo
está encerrado entre comillas, el preprocesador buscará el archivo en
el mismo directorio que el archivo que se está compilando (este método
se utiliza normalmente para incluir archivos de cabecera definidos por el
programador). Si el nombre del archivo está encerrado entre corchetes
angulares (< y >) la búsqueda se llevará a cabo en los directorios
predesignados (por ejemplo cuando se incluyen los archivos de
cabecera de la biblioteca estándar).

5.3 La directiva del preprocesador #define: constantes simbólicas


La directiva #define crea constantes simbólicas –constantes
representadas como símbolos- y macros- operaciones definidas como
símbolos. El formato de la directiva #define es:
#define identificador texto_de_reemplazo
Cuando en un archivo aparece esta línea, todas las subsecuentes
apariciones de identificador serán de forma automática reemplazadas
por texto_de_reemplazo, antes de la compilación del programa. Por
ejemplo,
#define PI 3.14159
Reemplaza todas las ocurrencias subsiguientes de la constante
simbólica PI por la constante numérica 3.14159. Las constantes
simbólicas permiten al programador ponerle un nombre a una
constante y utilizarlo a todo lo largo del programa.

5.4 La directiva del preprocesador #define: macros


Una macro es una operación definida en una directiva del
preprocesador #define. Las macros pueden ser definidas con o sin
argumentos. Una macro sin argumentos se procesa como si fuera una
constante simbólica. En una macro con argumentos, los argumentos se
sustituyen en el texto de reemplazo, y a continuación la macro se
expande, es decir en el programa el texto de reemplazo reemplaza al
identificador y a la lista de argumentos. Por ejemplo:
#define AREA_CIRCULO(x) PI * (x) * (x)
Siempre que en el archivo aparezca CIRCLE_AREA(x), el valor de x será
sustituido por el valor de x en el texto de reemplazo, la constante
simbólica PI será reemplazada por su valor (previamente definido), y en
el programa la macro se expandirá.

6. Prototipos de función y verificación de tipo


Los prototipos de función le permiten al compilador verificar por tipo la
exactitud de las llamadas de función. En C++ los prototipos de función
son requeridos para todas las funciones. Sin embargo, una función
definida en un archivo, antes de cualquier llamada a la misma, no
requiere de un prototipo de función, ya que el encabezado de función
actúa como tal.
Todos los parámetros de la función deberán declararse entre los
paréntesis del prototipo y de la definición de función. En caso que no
existan parámetros, bastará con colocar paréntesis vacíos.
int potencia (int, int);

7. Calificador Const
Este calificador permite especificar que un argumento pasado a una
función no es modificable en dicha función o declarar “variables
constantes”, en vez de declarar constantes simbólicas en el
preprocesador con #define).
const float PI = 3.14159;

8. Operador de resolución de alcance unario


Es posible declarar variables locales y globales con un mismo nombre. El
operador de resolución de alcance unario (::) permite tener acceso a
una variable global cuando está en alcance una variable local con el
mismo nombre. El operador de resolución de alcance unario no puede
ser utilizado para tener acceso a una variable con el mismo nombre en
un bloque externo. Se puede tener acceso a una variable global de
forma directa, sin usar el operador de resolución de alcance unario,
siempre que no exista una variable local en alcance con el mismo
nombre.

9. Cómo llamar funciones: parámetros por valor y parámetros por


referencia.
Cuándo los argumentos se pasan en una llamada de una función por
valor se efectúa una copia del valor del argumento y este se pasa a la
función llamada. Las modificaciones a la copia no afectarán el valor
original de la variable del llamador.
Cuando un argumento es pasado por referencia, el compilador pasa la
dirección de memoria del valor del parámetro a la función. Cuando se
modifica el valor del parámetro (la variable local), este valor queda
almacenado en la misma dirección de memoria, por lo que al retornar
a la función llamadora la dirección de memoria donde se almacenó el
parámetro contendrá el valor modificado. Para declarar una variable
parámetro como paso por referencia, el símbolo & debe preceder al
nombre de la variable. Por ejemplo la función de intercambio, que
intercambia los valores de dos variables:
void intercambio ( int& a, int& b) {
int aux = a;
a = b;
b = aux;
}
Los parámetros a y b son parámetros por referencia. Por consiguiente,
cualquier cambio efectuado en el interior de la función se transmitirá al
exterior de la misma. Para llamar a la función intercambio () por
referencia, simplemente se pasan las variables a intercambiar, por
ejemplo:
int i = 3, j = 50;
intercambio (i, j);

10. Las clases estándar de C++ para entrada/salida


Las primeras versiones de C++ desarrolladas en 1980 por Bjarne
Stroustrup se basaban en el sistema de entrada y salida de su lenguaje
padre C. Aunque todavía se puede usar en C++ a través de la librería
<cstdio>, nos centraremos en cambio en el sistema de E/S basado en
canales, estas son las clases de la librería <iostream>.

10.1 La clase istream


La clase istream modela un canal de caracteres desde un dispositivo
arbitrario de entrada a un programa en ejecución. Cuando se
introducen caracteres desde el dispositivo, se insertan en un objeto
istream que transmite los caracteres desde el dispositivo al programa.
En la librería estándar <iostream> se asocia un objeto istream estándar al
teclado de forma que cualquier programa en C++ que incluya
<iostream> tendrá automáticamente un canal de entrada desde el
teclado al programa, dicho objeto se llama cin.
El operador >> El operador de entrada >> se define en la librería
<iostream> de forma que cuando se aplica a un objeto istream y a una
variable,
objetoIstream >> variable;
el operador intenta extraer una secuencia de caracteres
correspondientes a un valor del tipo de la variable desde el
objetoIstream. Por esta razón también se conoce al operador >> como
operador de extracción. Si no hay caracteres en istream, se detiene la
ejecución hasta que se introduzcan los caracteres y se consiga un
carácter de fin de línea.

10.2 La clase ostream


La clase ostream modela un canal de caracteres desde un programa
de ejecución hacia un dispositivo arbitrario de salida. Cuando un
programa produce caracteres de salida, se introducen en un objeto
ostream que transmite los caracteres al dispositivo que el usuario esté
utilizando para producir la salida –una ventana, un terminal, etc.-
En la librería estándar <iostream> se asocia un objeto ostream estándar
a la pantalla, este objeto es llamado llamado cout.
El operador << El operador de salida << está definido en la librería
<iostream> de forma que cuando se aplica a un objeto ostream y a una
expresión,
objetoOstream << expresión;
se evaluará la expresión, se convertirá su valor a la correspondiente
secuencia de caracteres y se insertaran dichos caracteres en el objeto
ostream. Por esta razón también se le conoce como el operador de
inserción en un canal.
11. E/S a través de archivos: clases ifstream y ofstream
Si un programa va a llevar a cabo una entrada o una salida a un
archivo, debe construir un canal para ello. Esta operación recibe el
nombre de abrir un canal hacia el archivo. Un programa que necesite
leer de un archivo necesita abrir un ifstream para ese archivo y un
programa que necesite escribir en un archivo debe abrir en un ofstream
para ese archivo. Estas clases están declaradas en la librería <fstream>
de forma que cualquier programa que quiera usarlas debe incluir esta
librería.

11.1 Declaración, apertura y cierre de canales para archivo


Para que un programa pueda leer o escribir valores de un archivo de
texto, debe construir un objeto ifstream o ofstream, respectivamente.
ifstream canal_entrada;
ofstream canal_salida;
Estas instrucciones declaran los objetos canal_entrada y canal_salida
como canales de archivo sin inicializar –como conexiones potenciales
entre el programa y los archivos-. Se convierten en conexiones reales
cuando se envía un mensaje open():
canal_entrada.open(“nombre_archivo_texto_entrada”);
canal_salida.open(“nombre_archivo_texto_salida”);
Estos dos pasos –declarar y abrir- se pueden combinar usando
declaraciones de inicialización:
ifstream canal_entrada(“nombre_archivo_texto_entrada”);
ofstream canal_salida(“nombre_archivo_texto_salida”);
Por defecto la apertura de un ofstream hacia un archivo es destructiva,
es decir, si el archivo existe, su contenido es destruido. Para evitar esto,
se puede enviar un mensaje de open() con un segundo argumento de
modo, que puede ser cualquiera de los siguientes:
Modo Descripción
Es el modo por defecto de los objetos ifstream. Abre un archivo para lectura, de
ios::in
forma no destructiva, colocándose para leer al principio del archivo.
ios::trunc Abre un archivo y borra su contenido.
Es el modo por defecto de los objetos ofstream. Abre un archivo para escritura,
ios::out
usando ios::trunc.
Abre un archivo para escritura, pero de forma no destructiva, colocándose para
ios::app
escribir al final del archivo (es decir, para concatenar).
Abre un archivo existente colocándose para leer (en los objetos ifstream) o para
ios::ate
escribir (en los objetos ofstream) al final del archivo.

ios::binary Abre un archivo sobre el que se hará E/S en modo binario en lugar de en modo
texto. Usando read() se leen bytes del archivo y se guardan en arreglos de char, y
usando write() se escriben bytes desde arreglos de char en el archivo.

Al finalizar el tratamiento con el archivo debe romperse la conexión


entre el programa y el archivo enviándole el mensaje close():
canal_entrada.close();
canal_salida.close();
Las clases ifstream, ofstream y fstream son subclases de la clase istream,
ostream y iostream, respectivamente. Por lo tanto, todas las operaciones
para E/S interactiva se pueden usar para E/S a través de fichero. Por
ejemplo, una vez que se haya declarado el objeto canal_entrada de
tipo ifstream y se ha conectado a un archivo de texto, se puede leer un
valor de él exactamente de la misma forma que hicimos para la E/S
interactiva:
canal_entrada >> variable;

12. Clases
En C y en otros lenguajes de programación procedurales, la
programación tiende a ser orientada a acción, en tanto que en la
programación C++ tiende a ser orientada al objeto. En C, la unidad de
programación es la función. En C++ es la clase a partir de la cual
eventualmente los objetos son producidos (es decir, son creados).
Los programadores en C++ se concentran en crear sus propios tipos de
datos, conocidos como clases. Para ello, deben definir el formato
general utilizando la palabra reservada class. Cada clase contiene
datos junto con un conjunto de funciones que manipula dichos datos.
Los componentes de datos de una clase se llaman miembros de datos.
Los componentes de función de una clase se llaman funciones
miembros. Al igual que un ejemplo de un tipo incorporado int se conoce
como una variable, un ejemplo de un tipo definido por un usuario (es
decir, una clase) se conoce como un objeto.
class nombre_clase {
miembros de datos
public:
funciones miembros
} lista_objetos;

12.1 Control de acceso a miembros


Se utilizan tres especificadores de acceso para controlar el acceso a los
miembros de la clase, estos son: public, private y protected. El
especificador public define miembros públicos, que son aquellos a los
que se puede acceder por cualquier función. A los miembros que
siguen al especificador private sólo se puede acceder por funciones
miembro de la misma clase o por funciones y clases amigas. A los
miembros que siguen al especificador protected se puede acceder por
funciones miembro de la misma clase o de clases derivadas de la
misma, así como amigas. Los especificadores public, private y
protected pueden aparecer en cualquier orden. Si se omite el
especificador de acceso, el acceso por defecto es privado.
class nombre_clase {
datos y funciones privadas
public:
datos y funciones públicas
} lista_objetos;
Una función amigo de una clase se define por fuera del alcance de
dicha clase, pero aún así tiene el derecho de acceso a los miembros
private y protected de la clase. Se puede declarar una función o toda
una clase como un friend de otra clase.
Para declarar una función como friend de una clase, en la definición de
clase preceda el prototipo de función con la palabra reservada friend.
Para declarar una clase B como amigo de la clase A entre los miembros
de la clase A debe existir la siguiente declaración:
friend B;
Esto significa que la amistad es concedida y no tomada, es decir, para
que la clase B sea un amigo de la clase A, la clase A debe declarar que
la clase B es su amigo. También la amistad no es ni simétrica ni transitiva,
es decir, si la clase A es un amigo de la clase B, y la clase B es un amigo
de la clase C, no es correcto pensar que la clase B es un amigo de la
clase A, que la clase C es un amigo de la clase B , ni que A es un amigo
de la clase C.

12.2 Archivos de cabecera


Cada biblioteca estándar tiene su archivo de cabecera
correspondiente, que contiene los prototipos de función de todas las
funciones de dicha biblioteca, y las definiciones de varios tipos de datos
y de constantes requeridas por dichas funciones. Por ejemplo la
biblioteca estándar encargada de manipular la hora y fecha, se puede
añadir a nuestro programa incluyendo el archivo de cabecera <time.h>
El programador también puede crear archivos de cabecera para cada
una de las clases que define en su programa. Para ello, el nombre de
dicho archivo deberá terminar en .h y podrá ser incluido utilizando la
directriz de preprocesador #include. Este archivo contendrá los
miembros de datos de la clase y los prototipos de las funciones
pertenecientes a dicha clase.

12.3 Funciones constructoras


Después que los objetos son creados, sus miembros pueden ser
inicializados mediante funciones constructor. Un constructor es una
función miembro de clase con el mismo nombre que la clase. El
programador proporciona el constructor que cada vez que se crea un
objeto de dicha clase, es invocado automáticamente. Los miembros de
datos de una clase no pueden ser inicializados en la definición de la
clase. Más bien, los miembros de datos deben ser inicializados en un
constructor de la clase o sus valores definidos más adelante después
que el objeto haya sido creado. Los constructores no pueden
especificar tipos de regreso y valores de regreso. Los constructores
pueden ser sujetos de homonimia, para permitir una variedad de
maneras de inicializar objetos de una clase.
nombre_clase (lista de parámetros);

12.4 Función destructora


Un destructor es una función miembro especial de una clase, su nombre
está basado en la tilde (~) seguida por el nombre de la clase. Un
destructor de una clase es llamado automáticamente cuando un
objeto de una clase se sale de alcance. De hecho el destructor mismo
no destruye el objeto, más bien ejecuta trabajos de terminación, antes
de que el sistema recupere el espacio de memoria del objeto con el fin
de que pueda ser utilizado para almacenar nuevos objetos.
Un destructor no recibe ningún parámetro, ni regresa ningún valor. Una
clase sólo puede tener un destructor – la homonimia de destructores no
está permitida.
~nombre_clase ();

Anda mungkin juga menyukai