Programación en c++Ander MijangosUniversidad de DeustoOctubre de 2010
Aspectos generales de c++Es una ampliación de c para dar soporte a la POOEl tercer lenguaje de programación más usado (octubre de 2010)1Se usa para SO, SGBD, sistemas de Tiempo Real…Case sensitiveLas variables sólo existen en su ámbito {…}Los programas se organizan en dos ficheros:.h: archivos de cabecera.cpp: archivos de código fuente (que incluyen el .h)1http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html
¡Hola Mundo!#include <iostream>usingnamespacestd;voidmain(){cout << "¡Hola mundo!" << endl;}
Tipos de datos básicosEnteros(signed/unsigned) (long/short) intChar (carácter y mucho más)(unsigned) char //1 byteComa flotantefloatdouble //64 bitsBooleanobool
Más tipos de datos (I)Definidos por el programadorstructclassenumunionArrays y punteros[]*
Más tipos de datos (II)sizeofsizeof(TIPO);typedeftypedef TIPO_ANTIGUO TIPO_NUEVO;Constantes1, true, 0x01 (hexadecimal), 0.1, ‘a’…Declaración e inicializaciónunsignedint contador;int a = 5, b = 5, c;
Entrada y salida por consolaHay que incluir la STL y especificar el namespace#include <iostream>usingnamespacestd;Sentencias:cout << "Introduzca el precio: ";cin >> precio;
StringEs una clase definida en la STL#include <string>Declaración e inicialización:stringnombreUsuario = “Ander”;Realmente se trata de una cadena de caracteres que finaliza en ‘\0’Algunas funciones miembro:size();
PreprocesadorInclude#include <FICHERO> Define#define SIMBOLO [VALOR] Ifdef#if(n)def SIMBOLO… #else…#endifLos archivos de cabecera se suelen asegurar ante inclusiones múltiples:#ifndef NOMBRE_DE_FICHERO_H#define NOMBRE_DE_FICHERO_H…#endif
ComentariosDe bloque:/* … */De línea:// …
TypecastConvierte un tipo de datos en otroint i = 1000;char c = (char)i;
Operadores (I)AritméticosBinarios+-*/% (módulo)Unarios-++--Aritméticos y de asignación+=-=*=/=%=Nota: con pre, primero se ejecuta el operador; con post, primero se evalúa la expresión y al final se ejecuta el operador.
Operadores (II)Operadores relacionales==!=<><=>=Operadores booleanos&& (AND)|| (OR)! (NOT)Nota: valor != 0 -> truevalor == 0 -> false
Precedencia de operadores(De arriba a bajo y de izquierda a derecha)
Control (I)ifif (EXPRESION){SENTENCIA(S);}else{SENTENCIA(S);}switchswitch (EXPRESION){case VALOR1:SENTENCIAS;break;case VALOR2:SENTENCIAS;break;case VALOR3:case VALOR4:SENTENCIAS;break;default:SENTENCIAS;}
Control (II)Operador condicional ?EXPRESION ? EXPRESION_TRUE : EXPRESION_FALSEwhilewhile(EXPRESION){SENTENCIA(S);}do whiledo{SENTENCIA(S);}while(EXPRESION);forfor(EXPRESION(ES)_INICIAL(ES); EXPRESION; EXPRESION(ES)_ITERATIVA(S)){SENTENCIA(S);}Break: acaba la sentencia condicional o repetitiva actualContinue: salta hasta la terminación de la iteración actual
FuncionesFormatoTIPO_RETORNO IDENTIFICADOR( [PARAMETRO(S)] ){[return VALOR;]}Se puede declarar  la función antes de implementarlaAl llegar a un return la función finaliza
Punteros (I)Es un tipo de datosGeneralmente tiene 32 bitsInterpretación: representa una dirección de memoriaFormato:int*punteroEntero;Indirección (acceso al contenido referenciado):*punteroEntero= 1000;Nunca se asigna directamente un valor a un punteroObtener la dirección de una variable:&miVariable
Punteros (II)El SO reserva memoria:Al declarar una variable (memoria estática):int i;A petición del programador (memoria dinámica)(explicado posteriormente)Utilidad de los punteros:Modificar una variable en una función
ArraysConjuntos de datos consecutivosDeclaración (obligatorio que sea un valor constante, si no, ver memoria dinámica):intarrayEnteros[20];Inicialización:intarrayEnteros[2] = {5, 9};intarrayEnteros[] = {5, 9};Acceder a los datos del array:arrayEnteros[0] = 0;arrayEnteros[1] = 0;Conocer el tamaño de un array:sizeof(arrayEnteros) / sizeof(int);Arrays multidimensionales:intarrayEntero2D[2][3] = {{1, 2, 3}, {1, 2, 3}};Nota: un array de N elementos tiene los elementos de 0 a N-1
Arrays y punterosEl identificador de un array es un puntero constante que apunta a la dirección de memoria del primer elemento del array.Un puntero puede usarse con [], sumando sobre la dirección inicial bytes según el tipo del puntero.Pasar un array como parámetro:funcion (array, 2);void funcion1(intarray[], inttamanio)  {…}void funcion2(int* puntero, inttamanio) {…}Sizeof funciona con el array entero, con un puntero devuelve el tamaño del puntero (32 bits)
Cadenas de caracteresSon arrays de tipo charconstchar* cadena = “Hola mundo”;En <string.h> hay muchas funcionesEl tipo de datos string encapsula todo esto
Memoria dinámicaReservar y liberar memoria:int* punteroEntero = new int();deletepunteroEntero;En el caso de arrays:int* puntero = new int[10];delete [] puntero;Un new obliga a usar un delete en algún momento.Utilidad: evitar perder la información cuando la variable muereFunción dinámica: función que devuelve una dirección de memoria
EstructurasEspecificación:struct TIPO{TIPO_0 dato0;TIPO_1 dato1;…TIPO_NdatoN;};Uso (.):ESTRUCTURA e;e.TIPO_0;Uso con un puntero a la estructura (->):ESTRUCTURA* pE;pE->TIPO_0;
POO: ClasesDeclaración:class Fecha{unsignedintanyo;unsignedint mes;unsignedintdia;};Una clase tiene:Datos miembro = atributosFunciones miembro = métodosClases y objetosClase: declaración del tipo de datosObjeto: variable de dicho tipo de datos (instanciación)
POO: EncapsulaciónProgramación Orientada a ObjetosConsta de:ClasesEncapsulaciónEncapsulación: determina si se puede acceder a los atributos y métodos desde fuera de la clase (programa principal).public: son accesibles desde fueraprivate: sólo son accesibles desde la clase (o algún método público que lo manipule -> más control)Generalmente: atributos privados y métodos públicosSe usan getters y setters para manipular los atributos
POO: Constructores y destructoresConstructor: método especial que se ejecuta al instanciar un objeto.No devuelve nadaSe llama igual que la clase, con () por ser métodoSe usa para inicializar los atributosHay un constructor por defectoDestructor: método especial que se ejecuta al eliminar un objeto de memoria.No devuelve nadaSe llama igual que la clase, precedido de ~ y con () por ser métodoSe usa para liberar memoria dinámica, cerrar ficheros…Hay un destructor por defectoPueden encapsularse como privados, pero en general serán públicos
POO: SobrecargaDos métodos pueden llamarse igual si cambian:El número de parámetrosEl tipo de los parámetrosSe puede sobrecargar el constructorNo tiene sentido sobrecargar el destructorUn constructor con parámetros hace que el constructor por defecto se pierda (obliga a pasar parámetros en la instanciación)
Constructor de copia y operador de asignaciónConstructor de copiaSe llama en cuatro casos:Al crear un objeto como copia de otroArrayInt ai2 = ai;ArrayInt ai2(ai1);Al llamar a una función pasándole por valor un objetoAl hacer return de un objetoCadena (const Cadena& c)Operador de asignaciónSe llama al hacer una asignaciónCadena& operator= (const cadena& c)   return *this
POO: Operador ::Generalmente, la clase se declara en un fichero .h y los métodos se implementan en un .cpp.Operador de resolución de ámbito:Fecha::Fecha()Llamada a un método:objeto.metodo(parámetros);
POO: Puntero thisEn los métodos no se pasa el objeto como parámetroEl compilador añade automáticamente:boolesBisiesto(Fecha* constthis)‘This’ es un puntero al objeto desde el que se llama a la función.Su uso no es obligatorio salvo:Para distinguir el atributo de otro parámetro llamado igual (this->atributo)Para referenciar al objeto en síPara que el objeto referenciado también sea constante, al final de la cabecera del método se escribe ‘const’
POO: Miembros estáticosAtributo estático: cada objeto no tiene su propio valor para el atributo sino que es compartido.Para acceder desde el programa principal:Fecha::MesesSe inicializa en el .cpp donde se implementan los métodos de la clase.Método estático: no recibe el objeto por parámetro (no tiene this).Para acceder desde el programa principal:Fecha::esBisiesto(2006)
Punteros a funcionesDeclaración del puntero:int (*punteroAIntFuncionIntInt) (int, int);Función que se va a referenciar:intfuncion(int, int){}Asignación de la dirección:punteroAIntFuncionIntInt = &funcion; //& opcionalLlamada a la función desde el puntero:funcion(1,3)punteroAIntFuncionIntInt(1,3); // Hacen lo mismo
ReferenciasPermiten modificar una variable en una función sin tratar con punterosCON PUNTEROS:voidfuncion(int* pi){*pi= 2;}voidmain(){int i = 1;funcion(&i);}CON REFERENCIAS:voidfuncion(int& ri){ri = 2;}voidmain(){int i = 1;funcion(i);}NORMAL (el valor nose modifica):voidfuncion(int i){i= 2;}voidmain(){int i = 1;funcion(i);}
Esta presentación está basada en los apuntes tomados en la asignatura de Laboratorio de Informática I impartida por Jesús Sanz e IkerJamardo, en la facultad de Ingeniería de la  Universidad de Deusto.Esta presentación está publicada bajo la licencia CreativeCommons Reconocimiento – No Comercial 3.0 Españahttp://creativecommons.org/licenses/by-nc/3.0/es/AnderMijangosUniversidad de Deustoandermijan (arroba) gmail (punto) comhttp://www.slideshare.net/andermijan

Programación en c++

  • 1.
    Programación en c++AnderMijangosUniversidad de DeustoOctubre de 2010
  • 2.
    Aspectos generales dec++Es una ampliación de c para dar soporte a la POOEl tercer lenguaje de programación más usado (octubre de 2010)1Se usa para SO, SGBD, sistemas de Tiempo Real…Case sensitiveLas variables sólo existen en su ámbito {…}Los programas se organizan en dos ficheros:.h: archivos de cabecera.cpp: archivos de código fuente (que incluyen el .h)1http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html
  • 3.
  • 4.
    Tipos de datosbásicosEnteros(signed/unsigned) (long/short) intChar (carácter y mucho más)(unsigned) char //1 byteComa flotantefloatdouble //64 bitsBooleanobool
  • 5.
    Más tipos dedatos (I)Definidos por el programadorstructclassenumunionArrays y punteros[]*
  • 6.
    Más tipos dedatos (II)sizeofsizeof(TIPO);typedeftypedef TIPO_ANTIGUO TIPO_NUEVO;Constantes1, true, 0x01 (hexadecimal), 0.1, ‘a’…Declaración e inicializaciónunsignedint contador;int a = 5, b = 5, c;
  • 7.
    Entrada y salidapor consolaHay que incluir la STL y especificar el namespace#include <iostream>usingnamespacestd;Sentencias:cout << "Introduzca el precio: ";cin >> precio;
  • 8.
    StringEs una clasedefinida en la STL#include <string>Declaración e inicialización:stringnombreUsuario = “Ander”;Realmente se trata de una cadena de caracteres que finaliza en ‘\0’Algunas funciones miembro:size();
  • 9.
    PreprocesadorInclude#include <FICHERO> Define#defineSIMBOLO [VALOR] Ifdef#if(n)def SIMBOLO… #else…#endifLos archivos de cabecera se suelen asegurar ante inclusiones múltiples:#ifndef NOMBRE_DE_FICHERO_H#define NOMBRE_DE_FICHERO_H…#endif
  • 10.
    ComentariosDe bloque:/* …*/De línea:// …
  • 11.
    TypecastConvierte un tipode datos en otroint i = 1000;char c = (char)i;
  • 12.
    Operadores (I)AritméticosBinarios+-*/% (módulo)Unarios-++--Aritméticosy de asignación+=-=*=/=%=Nota: con pre, primero se ejecuta el operador; con post, primero se evalúa la expresión y al final se ejecuta el operador.
  • 13.
    Operadores (II)Operadores relacionales==!=<><=>=Operadoresbooleanos&& (AND)|| (OR)! (NOT)Nota: valor != 0 -> truevalor == 0 -> false
  • 14.
    Precedencia de operadores(Dearriba a bajo y de izquierda a derecha)
  • 15.
    Control (I)ifif (EXPRESION){SENTENCIA(S);}else{SENTENCIA(S);}switchswitch(EXPRESION){case VALOR1:SENTENCIAS;break;case VALOR2:SENTENCIAS;break;case VALOR3:case VALOR4:SENTENCIAS;break;default:SENTENCIAS;}
  • 16.
    Control (II)Operador condicional?EXPRESION ? EXPRESION_TRUE : EXPRESION_FALSEwhilewhile(EXPRESION){SENTENCIA(S);}do whiledo{SENTENCIA(S);}while(EXPRESION);forfor(EXPRESION(ES)_INICIAL(ES); EXPRESION; EXPRESION(ES)_ITERATIVA(S)){SENTENCIA(S);}Break: acaba la sentencia condicional o repetitiva actualContinue: salta hasta la terminación de la iteración actual
  • 17.
    FuncionesFormatoTIPO_RETORNO IDENTIFICADOR( [PARAMETRO(S)]){[return VALOR;]}Se puede declarar la función antes de implementarlaAl llegar a un return la función finaliza
  • 18.
    Punteros (I)Es untipo de datosGeneralmente tiene 32 bitsInterpretación: representa una dirección de memoriaFormato:int*punteroEntero;Indirección (acceso al contenido referenciado):*punteroEntero= 1000;Nunca se asigna directamente un valor a un punteroObtener la dirección de una variable:&miVariable
  • 19.
    Punteros (II)El SOreserva memoria:Al declarar una variable (memoria estática):int i;A petición del programador (memoria dinámica)(explicado posteriormente)Utilidad de los punteros:Modificar una variable en una función
  • 20.
    ArraysConjuntos de datosconsecutivosDeclaración (obligatorio que sea un valor constante, si no, ver memoria dinámica):intarrayEnteros[20];Inicialización:intarrayEnteros[2] = {5, 9};intarrayEnteros[] = {5, 9};Acceder a los datos del array:arrayEnteros[0] = 0;arrayEnteros[1] = 0;Conocer el tamaño de un array:sizeof(arrayEnteros) / sizeof(int);Arrays multidimensionales:intarrayEntero2D[2][3] = {{1, 2, 3}, {1, 2, 3}};Nota: un array de N elementos tiene los elementos de 0 a N-1
  • 21.
    Arrays y punterosElidentificador de un array es un puntero constante que apunta a la dirección de memoria del primer elemento del array.Un puntero puede usarse con [], sumando sobre la dirección inicial bytes según el tipo del puntero.Pasar un array como parámetro:funcion (array, 2);void funcion1(intarray[], inttamanio) {…}void funcion2(int* puntero, inttamanio) {…}Sizeof funciona con el array entero, con un puntero devuelve el tamaño del puntero (32 bits)
  • 22.
    Cadenas de caracteresSonarrays de tipo charconstchar* cadena = “Hola mundo”;En <string.h> hay muchas funcionesEl tipo de datos string encapsula todo esto
  • 23.
    Memoria dinámicaReservar yliberar memoria:int* punteroEntero = new int();deletepunteroEntero;En el caso de arrays:int* puntero = new int[10];delete [] puntero;Un new obliga a usar un delete en algún momento.Utilidad: evitar perder la información cuando la variable muereFunción dinámica: función que devuelve una dirección de memoria
  • 24.
    EstructurasEspecificación:struct TIPO{TIPO_0 dato0;TIPO_1dato1;…TIPO_NdatoN;};Uso (.):ESTRUCTURA e;e.TIPO_0;Uso con un puntero a la estructura (->):ESTRUCTURA* pE;pE->TIPO_0;
  • 25.
    POO: ClasesDeclaración:class Fecha{unsignedintanyo;unsignedintmes;unsignedintdia;};Una clase tiene:Datos miembro = atributosFunciones miembro = métodosClases y objetosClase: declaración del tipo de datosObjeto: variable de dicho tipo de datos (instanciación)
  • 26.
    POO: EncapsulaciónProgramación Orientadaa ObjetosConsta de:ClasesEncapsulaciónEncapsulación: determina si se puede acceder a los atributos y métodos desde fuera de la clase (programa principal).public: son accesibles desde fueraprivate: sólo son accesibles desde la clase (o algún método público que lo manipule -> más control)Generalmente: atributos privados y métodos públicosSe usan getters y setters para manipular los atributos
  • 27.
    POO: Constructores ydestructoresConstructor: método especial que se ejecuta al instanciar un objeto.No devuelve nadaSe llama igual que la clase, con () por ser métodoSe usa para inicializar los atributosHay un constructor por defectoDestructor: método especial que se ejecuta al eliminar un objeto de memoria.No devuelve nadaSe llama igual que la clase, precedido de ~ y con () por ser métodoSe usa para liberar memoria dinámica, cerrar ficheros…Hay un destructor por defectoPueden encapsularse como privados, pero en general serán públicos
  • 28.
    POO: SobrecargaDos métodospueden llamarse igual si cambian:El número de parámetrosEl tipo de los parámetrosSe puede sobrecargar el constructorNo tiene sentido sobrecargar el destructorUn constructor con parámetros hace que el constructor por defecto se pierda (obliga a pasar parámetros en la instanciación)
  • 29.
    Constructor de copiay operador de asignaciónConstructor de copiaSe llama en cuatro casos:Al crear un objeto como copia de otroArrayInt ai2 = ai;ArrayInt ai2(ai1);Al llamar a una función pasándole por valor un objetoAl hacer return de un objetoCadena (const Cadena& c)Operador de asignaciónSe llama al hacer una asignaciónCadena& operator= (const cadena& c) return *this
  • 30.
    POO: Operador ::Generalmente,la clase se declara en un fichero .h y los métodos se implementan en un .cpp.Operador de resolución de ámbito:Fecha::Fecha()Llamada a un método:objeto.metodo(parámetros);
  • 31.
    POO: Puntero thisEnlos métodos no se pasa el objeto como parámetroEl compilador añade automáticamente:boolesBisiesto(Fecha* constthis)‘This’ es un puntero al objeto desde el que se llama a la función.Su uso no es obligatorio salvo:Para distinguir el atributo de otro parámetro llamado igual (this->atributo)Para referenciar al objeto en síPara que el objeto referenciado también sea constante, al final de la cabecera del método se escribe ‘const’
  • 32.
    POO: Miembros estáticosAtributoestático: cada objeto no tiene su propio valor para el atributo sino que es compartido.Para acceder desde el programa principal:Fecha::MesesSe inicializa en el .cpp donde se implementan los métodos de la clase.Método estático: no recibe el objeto por parámetro (no tiene this).Para acceder desde el programa principal:Fecha::esBisiesto(2006)
  • 33.
    Punteros a funcionesDeclaracióndel puntero:int (*punteroAIntFuncionIntInt) (int, int);Función que se va a referenciar:intfuncion(int, int){}Asignación de la dirección:punteroAIntFuncionIntInt = &funcion; //& opcionalLlamada a la función desde el puntero:funcion(1,3)punteroAIntFuncionIntInt(1,3); // Hacen lo mismo
  • 34.
    ReferenciasPermiten modificar unavariable en una función sin tratar con punterosCON PUNTEROS:voidfuncion(int* pi){*pi= 2;}voidmain(){int i = 1;funcion(&i);}CON REFERENCIAS:voidfuncion(int& ri){ri = 2;}voidmain(){int i = 1;funcion(i);}NORMAL (el valor nose modifica):voidfuncion(int i){i= 2;}voidmain(){int i = 1;funcion(i);}
  • 35.
    Esta presentación estábasada en los apuntes tomados en la asignatura de Laboratorio de Informática I impartida por Jesús Sanz e IkerJamardo, en la facultad de Ingeniería de la Universidad de Deusto.Esta presentación está publicada bajo la licencia CreativeCommons Reconocimiento – No Comercial 3.0 Españahttp://creativecommons.org/licenses/by-nc/3.0/es/AnderMijangosUniversidad de Deustoandermijan (arroba) gmail (punto) comhttp://www.slideshare.net/andermijan