Introducción a C++ Índice 1. 2. 3. 4. 5. 6. Diferencias entre C y C++. Diferencias entre C++ y Java . Ejemplos. Funciones. Memoria dinámica Librería de funciones. 1 1. Diferencias entre C y C++ Entrada / Salida C++ introduce los flujos como mecanismo unificado de E/S. #include <stdio.h> #include <iostream.h> int main(void) { printf(“Quiero daros %d saludos \n”, 8); return 0; } int main() { cout << “Quiero daros " << 8 << " Saludos!" << endl; } En C sólo se pueden declarar al principio de un bloque. En C++ en cualquier sitio. 2 Declaración de variables C no tiene booleanos. C++ tiene bool y true y false. #include <stdio.h> #define TRUE 1 #definr FALSE 0 #typedef int BOOL void main() { int a = 5, b = 3; BOOL compara; compara = (a > b) ? TRUE : FALSE; if (compara) printf(“a es mayor que b.\n”); else printf(“b es mayor que a.\n); } #inlude <iostream.h> int main(void) { int a = 5, b = 3; bool compara; compara = (a > b); if (compara) cout << “a es mayor que b.” << endl; else cout << “b es mayor que a.” << endl; return 0; } Declaración de variables C++ permite un nuevo tipo de casting. Estilo C Estilo C++ int main(void) { float a = (float)200; } int main(void) { float a = float(200); return 0; } 3 Declaración de funciones En C++ podemos utilizar referencias para ahorrarnos los punteros. #include <iostream> void f(int& r) { cout << "r = " << r << endl; cout << "&r = " << &r << endl; r = 5; cout << "r = " << r << endl; } int main() { int x = 47; cout << "x = " << x << endl; cout << "&x = " << &x << endl; f(x); cout << "x = " << x << endl; } Salida: x = 47 &x = 0065FE00 r = 47 &r = 0065FE00 r=5 x=5 Otras diferencias 1. C++ permite la sobrecarga de 2. 3. 4. operadores. C++ incluye soporte para excepciones (aunque las librerías del sistema no trabajan con ellas). C++ soporta namespaces. C++ soporta plantillas. 4 2. Diferencias entre Java y C++ Diferencias entre java y c++ Sintaxis: Sintaxis: Prácticamente Prácticamente idéntica idéntica en en C++ C++ yy Java Java Orientación Orientación aa objetos: objetos: En En C++ C++ se se pueden pueden escribir escribir programas programas orientados orientados aa objetos, objetos, no no orientados es junto clas orientados aa objetos, objetos, oo mezcla mezcla de de ambos ambos (por (por ejemplo, ejemplo, tener tener clases clases junto con con funciones funciones globales globales en en el el mismo mismo programa) programa) Java rtenecer pe Java es es puramente puramente orientado orientado aa objetos; objetos; cualquier cualquier función función debe debe pertenecer pertenecer aa alguna main alguna clase clase (es (es un un método). método). Existe Existe la la función función main, main,, pero pero es es un un método método estático estático de de una una clase clase (la (la clase clase principal) principal) Control Control sobre sobre la la plataforma plataforma (hardware+S.O.): (hardware+S.O.): CC yy C++: C++: el el programador programador tiene tiene control control del del procesador. procesador. Java: el programa se ejecuta sobre un procesador ue qque Java: el programa se ejecuta sobre un procesador virtual virtual (JVM) (JVM) que abstrae abstrae al al programador programador de de la la plataforma plataforma concreta concreta Código Código de de máquina máquina generado: generado: CC yy C++: rma platafo C++: el el compilador compilador genera genera código código de de máquina máquina para para una una plataforma plataforma concreta concreta Java: bytecode)) para ((bytecode) Java: el el compilador compilador genera genera código código de de máquina máquina (bytecode para el el procesador procesador JVM; JVM; dicho dicho código código debe debe ser ser interpretado interpretado aa posteriori posteriori 5 Diferencias entre java y c++ Liberación Liberación de de Memoria: Memoria: CC yy C++: delete)) ((delete) C++: aa cargo cargo del del programador programador (delete Java: automática; los objetos creados ente automáticam Java: automática; los objetos creados son son destruidos destruidos automáticamente automáticamente cuando se quedan sin referencias. Un proceso de la JVM llamado cuando se quedan sin referencias. Un proceso de la JVM llamado recolector garbage collector) ) ((garbage collector recolector de de basura basura (garbage collector) Punteros: Punteros: CC yy C++: tre otras en C++: existen existen punteros punteros con con una una aritmética aritmética bien bien definida, definida, yy entre entre otras cosas, permiten programador explorar la memoria del computador ísico ffísico cosas, permiten programador explorar la memoria del computador físico Java: s accedido Java: no no existe existe el el concepto concepto de de puntero; puntero; los los objetos objetos son son accedidos accedidos mediante referencias (una referencia se puede considerar como el propio mediante referencias (una referencia se puede considerar como el propio identificador identificador del del objeto); objeto); no no existe existe aritmética aritmética de de referencias referencias Paquetes: Paquetes: CC yy C++: vos de archi C++: no no existe existe tal tal concepto; concepto; lo lo más más aproximado aproximado son son los los archivos archivos de biblioteca (.h) biblioteca (.h) Java: Java: un un paquete paquete es es una una entidad entidad organizativa organizativa que que permite permite agrupar agrupar clases, clases, interfaces y excepciones, así como que sus elementos dispongan e una dde interfaces y excepciones, así como que sus elementos dispongan de una determinada uete paq determinada visibilidad visibilidad con con respecto respecto aa elementos elementos externos externos al al paquete paquete Diferencias entre java y c++ Conversión Conversión implícita implícita de de tipos: tipos: CC yy C++: C++: existe existe (flexibilidad (flexibilidad para para el el programador) programador) Java: Java: no no existe existe por por considerarse considerarse un un mecanismo mecanismo objeto objeto de de errores errores potenciales potenciales Sobrecarga Sobrecarga de de funciones funciones yy operadores: operadores: C++: existen ambos tipos C++: existen ambos tipos de de sobrecarga sobrecarga Java: sólo existe la sobrecarga Java: sólo existe la sobrecarga de de funciones funciones (métodos); (métodos); Los Los operadores que existen ya vienen sobrecargados por compilador operadores que existen ya vienen sobrecargados por el el compilador, compilador,, (p.e. (p.e. ++ para para sumar sumar números números oo concatenar concatenar cadenas). cadenas). Herencia múltiple: Herencia múltiple: C++: C++: existe existe Java: gunas al Java: no no existe existe por por considerarse considerarse poco poco eficiente eficiente (esto (esto implicó implicó algunas algunas críticas críticas aa Java Java desde desde ciertos ciertos sectores) sectores) Interfaces: Interfaces: C++: C++: no no existen existen este este concepto concepto Java: existe el concepto ciones especifica Java: existe el concepto de de interfaz interfaz como como conjunto conjunto de de especificaciones especificaciones de métodos y de atributos constantes; se estudiará en la siguiente te siguien de métodos y de atributos constantes; se estudiará en la siguiente práctica práctica 6 Diferencias entre java y c++ Estructuras Estructuras dinámicas: dinámicas: C++: C++: Librería Librería STL STL Java: Java: paquete paquete java.util java.util.. Los Los nombres nombres yy el el funcionamiento son distintos. funcionamiento son distintos. Compiladores: Compiladores: C++: C++: Muchos Muchos compiladores. compiladores. Pueden Pueden ser ser bastante bastante distintos. distintos. Java: Java: Un Un único único compilador compilador siempre siempre igual. igual. Objetos: Objetos: C++: C++: Ningún Ningún ancestro ancestro común. común. Java: Java: Todos Todos los los objetos objetos heredan heredan automáticamente automáticamente de Object . de Object. Conclusión Sabemos POO, Java y C: Ya sabemos C++ !!! Todo es cuestión de práctica. 7 Ejemplo Leer un número por teclado y mostrarlo: #include <iostream.h> int main() { int number; cout << "Escribe un número: "; cin >> number; cout << "Tu número es: " << number << endl; cout << "En octal es: " << oct << number << endl; cout << "En hexadecimal es: " << hex << number << endl; } Ejemplo Podemos usar las cadenas al estilo C, pero STD nos da la clase string #include <iostream.h> using namespace std; int main() { string s1, s2; string s3 = "Hola"; cout << "Escribe tu nombre: "; cin >> s2; s1 = s3 + " " + s2 + "!"; cout << s1 + "." << endl; } Ojo, el tipo de una cadena sigue siendo char * 8 Ejemplo ¿Qué hace este programa?. #include <iostream.h> char cfunc(int i) { if(i == 0) return 'a'; if(i == 1) return 'g'; if(i == 5) return 'z'; return 'c'; } int main() { cout << “Escribe un número: "; int val; cin >> val; cout << cfunc(val) << endl; } Ejemplo ¿Qué hace este programa?. #include <iostream.h> int main() { for(int i = 0; i < 128; i = i + 1) cout << " Valor: " << i << " Caracter: " << char(i) << endl; } 9 Ejemplo ¿Qué hace este programa?. #include <iostream.h> int main() { char c; while(true) { cout << "Elija una:" << endl << "l, r, q > "; cin >> c; if(c == 'q') break; if(c == 'l') { cout << "Letra l" << endl; continue; } if(c == 'r') { cout << "Letra r" << endl; continue; } cout << “Elija una de las tres!" << endl; } cout << "Fin." << endl; } 3. Funciones 10 Funciones insertadas Similar a las macros, en vez de llamarse se insertan: inline bool esPar(int n) { return !(n%2); } #include <iostream.h> int main() { if (esPar(8)) cout << 8 << " es par. " << endl; } #include <iostream.h> int main() { if (!(8%2)) cout << 8 << " es par. " << endl; } Parámetros por defecto C++ nos permite indicar valores por defecto para parámetros. void muestra(int a, int b=0, int c=0) { cout << "a = " << a << endl; cout << "b = " << b << endl; cout << "c = " << c << endl; } ¿Cuál es la salida de este programa? int main() { muestra(3); muestra(3, 3); muestra(3, 3, 3); return 0; } Ojo, los parámetros por defecto deben ser los últimos. 11 Práctica Volver a escribir programas hechos en C al sabor C++. 5. Memoria dinámica 12 Memoria dinámica Ya no usamos malloc !!!! int *p; p = (int (int *)malloc(sizeof(int )); *)malloc(sizeof(int)); (*p)=5; int *p; p = new int; int; (*p)=5; Tampoco usamos free !!!! free(p); free(p); delete p; Memoria dinámica ¿Cómo creamos una tabla dinámica en C++)? Exactamente igual que en Java. Ejercicio: crear una tabla dinámica, inicializarla y mostrarla (hay que liberar la memoria al final). #include <iostream.h > <iostream.h> int main() { int *p; p = new int[4]; int c; for (c = 0; c < 4; c++) *(p+c *(p+c)) = c; for (c = 0; c < 4; c++) cout << *(p+c )<< " "; *(p+c)<< cout << endl; endl; delete p; return 0; } 13 6. Librería de funciones Librería de funciones de C++ El Estándar C++ define la Librería Estándar que debe acompañar a cada implementación del compilador que se adhiera al estándar. La norma determina cuales son, como se llaman y como se utiliza este conjunto de algoritmos que deben acompañar (como mínimo) a cada implementación del compilador que quiera llamarse La versión, ISO/IEC 14882 del año 1998, especifica que se compone de 32 ficheros de cabecera: <algorithm> <ostream> algorithm> <iomanip> iomanip> <list> list> ostream> <streambuf> streambuf> <bitset> <ios> <locale> <string> bitset> ios> locale> <queue> queue> string> <complex> <set> <typeinfo> complex> <iosfwd> iosfwd> <map> map> set> typeinfo> <deque> <iostream> iostream> <memory> memory> <sstream> sstream> <utility> utility> <exception> <stack> <valarray> exception> <istream> istream> <new> new> stack> valarray> <fstream> fstream> <iterator> iterator> <numeric> numeric> <stdexcept> stdexcept> <vector> <functional> functional> <limits> limits> 14