Post on 16-Oct-2018
Nuevas palabras reservadas
asm
inline
public
virtual
catch
new
template
class
operator
this
delete
private
throw
friend
protected
try
Nueva forma para E/S
� Cualquier compilador de C++, acepta C.
� La biblioteca iostream incluye los operadores cin y cout (#include <iostream>).
� Ejemplo:char nombre;
int num=2;
std :: cout << "Introduzca el nombre del archivo " << num << ": ";
std :: cin >> nombre;
Declaración de variables
� En cualquier lugar del bloque:
for (double suma = 0.0, int i = 0; i<n; i++)suma += a[i];
� Variables const para tamaño de vectores:
int main() {const int SIZE = 5;char cs[SIZE] ;
}
Punteros const
� Apuntan siempre a la misma dirección.
� El valor de la variable apuntada sepuede modificar.
� Se declaran así:char* const nombre2 = "Ramón";
� Un puntero a variable const no puede modificar el valor de esa variable.
Punteros a variables const
� Se declaran así:const char *nombre1 = "Ramón";
� El código: #include <stdio.h>
int main() {const int i = 2;int *p;p = &i;*p = 3;printf("i = %d", i);
}
En ANSI C produce i = 3,
pero en C++ nocompila.
Conversiones explícitas de tipo
� Ejemplo de cast: (C y C++)
return (int) (x/y);
� C++ dispone de otra conversión:
y = double(25);
return int(x/y);
Sobrecarga de funciones
� Funciones distintas con mismo nombre.
� Distinto tipo y/o número de argumentos.
� No pueden diferir sólo en el tipo de
retorno.
� Tampoco en que un argumento se pase
por valor en una función y por referencia
en la otra.
Parámetros con valores por defecto
� En C++ se pueden definir valores por
defecto para todos o algunos argumentos
formales.
� En la llamada, si no están los argumentos
correspondientes, se toma el valor asignado.
� Los argumentos con valores por defecto
deben estar al final de la lista.
Parámetros con valores por defecto
� Si se omite un argumento en la llamada, se deben omitir los siguientes en la lista.
� Ejemplo:double modulo(double x[], int n=3);
� En C++ se puede invocar así:v = modulo(x, n);
v = modulo(x);
Variables de tipo referencia
� Se declaran con el operador '&'.
� Deben ser inicializadas.
� Nombre alternativo para un objeto.
� Utilidades más importantes:� especificación de argumentos.
� especificación de tipos de retorno.
� sobrecarga de operadores.
Variables de tipo referenciaint i = 1;int& r = i; // r e i ahora se refieren al
// mismo intint x = r; // x = 1r = 2; // i = 2r++; // i se incrementa a 3
� Ningún operador opera sobre una referencia.
� El valor de una referencia no se puede modificar (siempre se referirá al mismo objeto).
� &r es un apuntador al objeto denotado.
Los operadores new y delete
� Hasta ahora variables estáticas o automáticas.
� Con new y delete se crean y destruyen
variables según la necesidad del programador.
� Una variable puede traspasar su bloque.
� Se puede crear cualquier tipo de variable con
new y éste retorna un puntero de ese tipo.
� No se necesita conversión de tipo.
Clases, objetos y métodos
� Las clases se pueden ver como una generalización de las estructuras.
� Son verdaderos tipos de datos definidos por el usuario.
� Los objetos son las variables de una determinada clase.
� Los métodos pueden ser funciones uoperadores.
Estructura de un programa
� En los archivos de cabecera (.h), por lo general, se declara la clase, con los prototipos de las funciones.
� En un archivo NombreClase.cpp deimplementan los constructores,funciones y operadores.
� En un archivo main.cpp se define lafunción main.
Ejemplo: complejo.h
� Se declaran los campos miembro privados:class Complejo
{
private:
double real;
double imag;
� Los usuarios de la clase no podrán accedercon los operadores '.' y '->'.
� Las funciones miembro sí tienen acceso.
Ejemplo: complejo.h
� Se declaran un conjunto de funciones yoperadores miembro en la sección pública.
� Las tres primeras son los constructores:public:
// Constructores
Complejo();
Complejo(double, double im=0.0);
Complejo(const Complejo&);
Ejemplo: complejo.h
� El siguiente grupo de funciones permite dar valor a los campos:
void setData();
void setReal(double);
� O acceder a ellos:
double getReal(){return real;}
double getImag(){return imag;}
Ejemplo: complejo.h
� A continuación se declara la sobrecarga de los operadores aritméticos, comparación yasignación (operadores miembro).
Complejo operator+ (const Complejo&);
� Y luego la sobrecarga del operador de inserciónen el flujo de salida (operador amigo)
friend ostream& operator<< (ostream& const
Complejo&);
Sobrecarga de operadores
// operador miembro + sobrecargado
Complejo Complejo::operator+ (const Complejo &a)
{
Complejo suma;
suma.real = real + a.real;
suma.imag = imag + a.imag;
return suma;
}
Sobrecarga de operadores
� Los operadores y funciones miembro seindican con el operador de resolución dealcance '::' (no así los amigos).
� En una sentenciax + y; // x, y complejos
se utiliza el operador sobrecargado.� x es el argumento implícito.
� y se pasa explícitamente (como argumentoformal a) .
Puntero this
� La sobrecarga de '=' retorna (*this) que representa al argumento implícito.
� Es una variable predefinida para todas las funciones (u operadores) miembro.
� Contiene la dirección del objeto correspondiente.
� Forma de referirse al objeto como tal(argumento implícito).
Constructores
� Se debe dar valor inicial a las variablesmiembro. Esto se hace a través deconstructores.
� Se invocan automáticamente al crear unobjeto de una clase.
� Permiten la encapsulación.
� Tienen el mismo nombre que la clase.
� No tienen valor de retorno (ni siquiera void).
Inicializadores
� Los constructores inicializan variables.
� C++ permite inicializar variables fuera delcuerpo de una función.
C_Cuenta::C_Cuenta(double unSaldo, double unInteres) :Saldo(unSaldo), Interes(unInteres) // inicializadores{ } // En este caso el cuerpo del constructor está
vacío
� Permiten definir variables miembro const.
Constructor por defecto
� Es un constructor que no necesita que se lepasen argumentos para inicializar lasvariables. Hay dos opciones:� No tiene argumentos.
� Tiene argumentos, pero todos ellos tienen asignadoun valor por defecto en la declaración.
� Es necesario para declaraciones de la forma
Complejo z ; y Complejo datos[100];
Constructor de oficio
� Lo crea el compilador de C++ si elprogramador no define ningúnconstructor.
� No tiene argumentos, es un constructorpor defecto (no siempre un constructorpor defecto es un constructor de oficio).
� Suelen ser cómodos, correctos ysuficientes.
Constructor de copia
� Se utiliza cuando se debe crear un objeto a
partir otro objeto de la misma clase.
� Tiene un único argumento que es una
referencia constante a un objeto de la clase.
� El compilador también define un constructor
de copia de oficio si el programador no lo
hace (no funciona correctamente con
punteros).
Constructores y operador deasignación (=).
z2 = z1;
� Se supone que c1 y c2existían previamente.
� Se utiliza el operador deasignación que funciona como un constructor decopia.
� Se debe sobrecargar'='.
Complejo z2 = z1;
� Se invoca al constructor de copia.
� El constructor de copia por defecto es una copiabit a bit.
� Se debe sobrecargar.
Destructores
� Es llamado cuando el objeto va a dejarde existir.
� Para un objeto local o automáticodefinido en un bloque, el destructor es invocado cuando el programa llega al final del bloque.
� Los objetos creados con new deben serexplícitamente destruidos.
Clases y funciones friend
� Las funciones miembro (que acceden a lasvariables miembro) sólo pueden sermiembro de una única clase.
� Una función friend de una clase es una función que no pertenece a la clase, pero que tiene permiso para acceder a sus funciones y variables miembro.
� Una clase friend de otra tiene todas sus funciones amigas de esa segunda clase.
Herencia
class ClaseDerivada: public o private ClaseBase
� Un nombre redefinido oculta el nombre heredado.
� Hay algunos elementos de la clase base que no pueden ser heredados:
� Constructores
� Destructores
� Funciones friend� Funciones y datos estáticos de la clase
� Operador de asignación (=) sobrecargado
Constructores de clases derivadas
� Debe llamar al constructor de la clase base.
� Se debe especificar un inicializador base.
� Se puede omitir si la clase base cuenta con un constructor por defecto.
C_CuentaJoven(const char *unNombre,
int laEdad, double unSaldo=0.0, double unInteres=0.0): C_Cuenta(unNombre,unSaldo, unInteres)
Herencia múltiple
� Una clase puede heredar de una(herencia simple) o más clases base (herencia múltiple).
class CuentaEmpresarial:
public Cuenta, public Empresa
PolimorfismoFunciones Virtuales
� Son funciones distintas con el mismo nombre, declaradas virtual en la clasebase (ligadura dinámica).
� Funciones convencionales se invocan deacuerdo al tipo del objeto (en tiempo decompilación).
� Con funciones virtuales se resuelve entiempo de ejecución el problema de laasignación.
Funciones virtualesclass A {
public:
virtual void mostrar();
}
class B: public A {
public:
void mostrar();
}
A objA;
B objB;
A* ptrA1;
A* ptrA2;
ptrA1 = &objA;
ptrA2 = &objB;
ptrA2->mostrar();
Funciones virtuales puras
� La función virtual de la clase base debe declararse a pesar de no ser utilizada.
� En este caso no es necesario definirla.� Se declara como función virtual pura:virtual funcion1() const = 0;
� No se pueden definir objetos de esa clase.
� Se pueden definir punteros a esa clase.
Clases abstractas
� Contienen una o más funciones virtuales
puras.
� Si una clase derivada no define una
función virtual pura, la hereda como pura
y por lo tanto también es abstracta.
� Una clase que define todas las funciones
virtuales es una clase concreta.
Entrada/Salida
� Stream o flujo: dispositivo que produce o consume información.
� Flujos estándares:� cin: entrada estándar (teclado).
� cout: salida estándar (pantalla).
� cerr: salida de mensajes de error (pantalla).
� Las clases istream, ostream e iostream sonclases que heredan de ios.
Manipuladores
� Variables y/o métodos miembro que controlan el formato.
� Pueden tener argumentos (iomanip) o no (iostream).
� Sólo afectan al flujo al que se aplican.
� No guardan la configuración anterior (como sí lo hacen los indicadores).
Manipuladores
� Ejemplos:� endl: se imprime un ‘\n’ y se vacía el buffer de
salida.
� flush: se vacía el buffer de salida.
� setw(int w): establece la anchura mínima de campo.
cout << hex << 100;cout << setw(10) << mat[i][j] << endl;
� El efecto permanece hasta que se cambia por otro manipulador.
E/S de archivos
� En la biblioteca fstream se definen las clases ifstream, ofstream y fstream,que derivan de istream y ostream y a su vez de la clase ios.
� Ejemplos:fstream archivo;
archivo.open("datos.dat", ios::in);
ifstream archivo("datos.dat");
Excepciones
� Parte del código puede no ejecutarse por
algún error inesperado.
� Si ocurre una excepción se interrumpe la
normal ejecución del código.
� Se pueden manejar realizando una acción
adecuada para dejar al sistema en un
estado estable.
Excepciones en C++
� Se separa el código para el caso en que ocurre una situación excepcional y el queno:
� try: identifica un bloque de código en el cual puede surgir una excepción.
� throw: causa que se origine una excepción.
� catch: identifica el bloque de código en el cual la excepción se maneja.