Programación en C++ Mejoras menores de C++ respecto de C Prof. José A. Rodríguez Mondéjar Prof. Álvaro Sánchez Miralles UPCO ICAI Departamento de Electrónica y Automática 1 Programación en C++ Comentarios de línea • • • Desde // hasta que acaba la línea se considera comentario. Se recomienda utilizar siempre // para los comentarios. Sólo utilizar /* */ para comentar código en caso de necesidad. – Entre /* */ puede haber comentarios de línea y viceversa. int i; Compilador: OK /* fprintf(pfic,"%s\n",p->sNom); fprintf(pfic,"%d\n",p->nHijos); // Recorrer hijos for(i=0;i<p->nHijos;i++) ArbolGenSalva(pfic,p->pHijos+i); */ int i; Compilador: Error /* fprintf(pfic,"%s\n",p->sNom); fprintf(pfic,"%d\n",p->nHijos); /* Recorrer hijos */ for(i=0;i<p->nHijos;i++) ArbolGenSalva(pfic,p->pHijos+i); */ Prof. José A. Rodríguez Mondéjar Prof. Álvaro Sánchez Miralles UPCO ICAI Departamento de Electrónica y Automática 2 Programación en C++ Ámbito (scope) de las variables • • Las variables pueden ser declaradas en cualquier punto del programa: – No sólo al principio del programa. main () { int i=1; printf("%d\n",i); Ámbito de una variable – Una variable existe desde su declaración hasta la llave de cierre del bloque de código donde ha sido declarada. La llave anterior más cercana de apertura a la declaración de la variable define el inicio del bloque de código. – Fuera de ese bloque la variable no existe si no lleva un modificador especial. – Problema con los for i int j=2; printf("%d\n",j); j { int k=-2; printf("%d\n",k); k } for (int k=0;k<2;k++) { printf("%d\n",k); } getchar(); k } • ¿k pertenece al interior o al exterior? En general al interior Prof. José A. Rodríguez Mondéjar Prof. Álvaro Sánchez Miralles UPCO ICAI Departamento de Electrónica y Automática 3 Programación en C++ Modificador de tipo const (type modifier) • • • El valor de la variable dado en la inicialización permanece constante. En los punteros se puede especificar como constante: – El puntero – A lo que apunta el puntero. – Tanto puntero como a lo que apunta. Util para pasar valores a funciones que no se quieren modificar. Prof. José A. Rodríguez Mondéjar Prof. Álvaro Sánchez Miralles const int LON=5; char s[LON]; LON no se puede modificar const char *ps1=s; s[0]='\0'; ps1++; *ps1='\0'; Se puede modificar ps1 No se puede a lo que apunta char * const ps2=s; ps2[0]='\0'; Se puede modificar a lo que apunta ps2++; No se puede modificar const char * const ps3=s; ps3++; ps3[1]='\0'; No se puede modificar nada UPCO ICAI Departamento de Electrónica y Automática 4 Programación en C++ Paso por referencia: ¡¡ POR FIN !! • • • • • Se puede modificar desde dentro de una función una variable externa sin necesidad de pasar el puntero a dicha variable. & indica que lo que se pasa a la función no es el valor de variable, sino la propia variable. Toda referencia a la variable dentro de la función repercute directamente sobre la variable externa. La misma variable es manejada dentro de la función pero con un nombre diferente (alias). Limita el uso de los punteros a lo estrictamente necesario. Prof. José A. Rodríguez Mondéjar Prof. Álvaro Sánchez Miralles void swap(int &, int &); main () { int i1=1; int i2=2; No paso su valor, sino su referencia swap(i1,i2); } No se crea una nueva variable, i es ahora el alias de i1 void swap(int &i, int &j){ int t; t=i; i=j; j=t; Leo i1 directamente Modifico i1 directamente } UPCO ICAI Departamento de Electrónica y Automática 5 Programación en C++ Más sobre el tipo referencia (&) • • • • Declara un nuevo nombre para hacer referencia a una variable ya declarada: – Es simplemente un alias de una variable. – La inicialización conecta el alias con la variable elegida. Sólo cuando se utiliza en la declaración de una variable funciona como referencia. Fuera de las declaraciones & funciona como operador para calcular la dirección de una variable. En las funciones, la inicialización se da en la llamada a la función. Prof. José A. Rodríguez Mondéjar Prof. Álvaro Sánchez Miralles j hace referencia a la misma variable que i main() { int i=5; int &j=i; int &k; Falta la inicialización: hay que hacer printf("%d",j); referencia a una variable que ya exista } 5 UPCO ICAI Departamento de Electrónica y Automática 6 Programación en C++ Más sobre el paso por referencia (&) • Utilizar el modificador const si no se quiere modificar la variable desde dentro de la función la variable. int iSuma(const int &i, const int &j); main () int int int { i1=1; i2=2; i3; 1+2=3 i3=iSuma(i1,i2); printf("%d + %d = %d",i1,i2,i3); } int iSuma(const int &i, const int &j){ return i+j; } Prof. José A. Rodríguez Mondéjar Prof. Álvaro Sánchez Miralles UPCO ICAI Departamento de Electrónica y Automática 7 Programación en C++ Operadores new y delete • • Sustituyen a calloc y free en la gestión de memoria dinámica – Al ser operadores, la gestión de memoria forma parte del propio lenguaje. main () { int *pi; pi=new int; Dos tipos de utilización: double *pd=new double; – Para un solo elemento • new • delete delete pd; delete pi; – Para un vector de elementos • char *ps=new char[10]; • new[ tam ] • delete [ ] Para más adelante: new y delete utilizan el constructor y el destructor de un objeto. Prof. José A. Rodríguez Mondéjar Prof. Álvaro Sánchez Miralles delete [ ] ps; } UPCO ICAI Departamento de Electrónica y Automática 8 Programación en C++ Sobrecarga de funciones (del nombre de una función) • • • int Max(int *pi); double Max(double *pd); Se pueden utilizar el mismo nombre para diferentes funciones que tengan diferente tipo o número de parámetros. – No vale para funciones que sólo tengan distinto el tipo de la función. – El funcionamiento es semejante a como el operador + puede funcionar entre enteros, doubles, etc. Muy útil para funciones que realizan operaciones semejantes sobre datos diferentes. No se debe utilizan con funciones con comportamientos diferentes main() { int i; double d; Sobre doubles Sobre enteros Max(&d); Max(&i); } int Max(int *pi) { printf("Sobre enteros\n"); return 0; } double Max(double *pd) { printf("Sobre doubles\n"); return 0; } Prof. José A. Rodríguez Mondéjar Prof. Álvaro Sánchez Miralles UPCO ICAI Departamento de Electrónica y Automática 9 Programación en C++ Modificador inline • • • • Permite sustituir la llamada a una función por el código correspondiente en el punto del programa donde se realiza la llamada. Esto se realiza en tiempo de compilación. El resultado son programas más eficientes, pero a la vez programas más largos. No siempre el compilador sustituye la llamada a la función por el código correspondiente: inline void swap(int &i, int &j) { int t; t=i; i=j; j=t; } main() { int i1,i2; i1=1; i2=2; swap(i1,i2); printf("%d %d",i1,i2); } 21 – Caso que internamente la función tenga una sentencia de bucle (for, while, ...). Prof. José A. Rodríguez Mondéjar Prof. Álvaro Sánchez Miralles UPCO ICAI Departamento de Electrónica y Automática 10