El nuevo lenguaje C++ (C++11) Antal A. Buss Pontificia Universidad Javeriana - Cali Septiembre 3 2013 Lenguaje C++ C++ es un lenguaje de propósito general, multi-paradigma (OOP, Prg. Genérica, Funcional, Estructurada), estáticamente tipado y compilado. Lenguaje C++ C++ es un lenguaje de propósito general, multi-paradigma (OOP, Prg. Genérica, Funcional, Estructurada), estáticamente tipado y compilado. #include<iostream> int main() { std :: cout << ”Hola Mundo!\n”; } Lenguaje C++ C++ es un lenguaje de propósito general, multi-paradigma (OOP, Prg. Genérica, Funcional, Estructurada), estáticamente tipado y compilado. #include<iostream> int main() { std :: cout << ”Hola Mundo!\n”; } Mayor acceso al hardware (System programming) Mayor desempeño (Performance) C++ Creado por Bjarne Stroustrup en AT&T Bell Labs en 1980. Combinación entre Simula (Código estructurado) y C (Programación de sistemas y eficiencia) Llamado inicialmente C con Clases C++ en la industria Ejemplo de desempeño Multiplicación de matrices: C(n,m) = A(n,p) × B(p,m) Ci,j = p X k=1 Ai,k ∗ Bk,j Ejemplo de desempeño Multiplicación de matrices: C(n,m) = A(n,p) × B(p,m) Ci,j = p X Ai,k ∗ Bk,j k=1 for ( i =0; i< filas (A); ++i) for ( j=0; j<columnas(B); ++j) for (k=0; k<columnas(A); ++k) C[i , j ] = C[i, j ] + A[i,k]∗B[k, j ] ejemplo: multmat.py multmat.cc C++11 C++ esta estandarizado bajo la ISO (SC22 WG21) http: //www.open-std.org/jtc1/sc22/wg21/docs/papers/ C++11 es el último ISO C++ estándar. Los estándares anteriores son reconocidos como C++98 o C++03. Comité despues de C++11 fue ratificado en Agosto 2011 Caracteristicas nuevas en C++11 - cplusplus - alignments - attributes - atomic operations - auto - C99 features - enum class - copying and rethrowing exceptions - constant expressions (constexpr) - decltype - default and delete - move and copy - delegating constructors - dynamic initialization and destruction with concurrency - exception propagation (noexcept) - explicit conversion operators - extended integer types - extern templates - range-for statement - in-class member initializers - inherited constructors - initializer lists - inline namespace - lambdas - local classes as template arguments - long long integers - memory model - move semantics - null pointer (nullptr) - override and final control - PODs - raw string literals - right-angle brackets - rvalue references - Simple SFINAE rule - static assertions - template alias - template typedef - thread-local storage - unicode characters - Uniform initialization - unions (generalized) - user-defined literals - variadic templates C++11 “C++11 se siente como un nuevo lenguaje” B.S. Compatible con los estándares anteriores. Mejoras y adiciones en el core del lenguaje y en la librerı́a estándar. auto, decltype, lambdas, initialization lists, move semantics, variadic templates, constexpr, ... Concurrencia, hilos, expresiones regulares, nuevos contenedores, nuevos algoritmos, ... C++11 C++11 es implementado por diferentes compiladores (parcial o completamente): GCC 4.8 (completo) Clang 3.3 (completo) Microsoft Visual Studio 2013 (parcial) Intel C++ compiler (parcial) IBM XLC (parcial) ... http://wiki.apache.org/stdcxx/C%2B%2B0xCompilerSupport C++11 Algunas caracterı́sticas de C++ para facilitar el desarrollo de programas: auto decltype Contenedores y algoritmos (STL) Listas de inicialización Ciclos por rangos Literales definidos por el usuario Inferencia de tipos: auto auto : El tipo de la variable es determinado por el compilador usando el tipo de dato que se asigna al lado derecho de la sentencia (rvalue). int plus (int x, int y) { return x+y; } ... auto x = 5; auto y = plus(x ,7); // y = 12 auto add3 = std::bind( plus , 3, 1 ); // add3 es una funcion unitaria auto w = add3(5.5); // w = 8 Inferencia de tipos: decltype decltype : Determina el tipo de una expresión en tiempo de compilación. decltype(y) w = 2.34; decltype(plus(w,x)) k = plus(w,x); Inferencia de tipos: decltype decltype : Determina el tipo de una expresión en tiempo de compilación. decltype(y) w = 2.34; decltype(plus(w,x)) k = plus(w,x); template <typename T1, typename T2> auto plus(T1 x, T2 y) −> decltype(x+y) { return x+y; } auto w = plus(3.14, 50); auto z = plus(3, 10); ejemplo: auto, decltype // w es un flotante // z es un entero Contenedores (Estructuras de datos) en STL STL (Standard Template Library) es una biblioteca que provee un conjunto de algoritmos (sort, find, copy, etc.) y estructuras de datos. array - dynarray (C++14) vector - deque list - forward list set - multiset map - multimap unordered set unordered multiset unordered map unordered multimap stack - queue - priority queue Lista de inicialización Una lista de inicialización (initialization list) permite definir una secuencia de valores para inicializar estructuras y contenedores. std :: vector<int> x = {3, 4, 5, 8}; Lista de inicialización Una lista de inicialización (initialization list) permite definir una secuencia de valores para inicializar estructuras y contenedores. std :: vector<int> x = {3, 4, 5, 8}; struct persona { int id ; string nombre; }; persona p = {35,”Pedro”}; std :: vector<persona> y = {p, {102,”Paco”},{105,”Luis”}}; std :: map<int,string> w = {{101,”Hugo”}, {102,”Paco”},{105,”Luis”}}; std :: cout << w[102] << std::endl; Ciclos por rangos Un ciclo por rangos (range for statement) permite iterar sobre los elementos de un contenedor. Todos los contenedores en STL, std::string, una lista de inicialización y un arreglo de C, puede ser usado como un rango. std :: vector<int> v = {1,4,6,3,7,2,4,2,4,5}; for(auto x : v) std :: cout << x << std::endl; for(auto& x : v) ++x; ejemplo: init list.cc, init list.py Literales definidos por el usuario Ariane5Eplosion.mp4 Literales definidos por el usuario C++ tiene la habilidad de adicionar sufijos a literales para representar diferentes valores. Por ejemplo: auto auto auto auto peso = 10kg; distancia = 104.5 m energia = 3.8 N temperatura = 45 C // // // // kilogramos metros Newtons Grados centigrados Literales definidos por el usuario C++ tiene la habilidad de adicionar sufijos a literales para representar diferentes valores. Por ejemplo: auto auto auto auto peso = 10kg; distancia = 104.5 m energia = 3.8 N temperatura = 45 C // // // // kilogramos metros Newtons Grados centigrados La definición de sufijos se realiza usando sobrecarga de operadores: Temperatura<Centigrados> operator”” C(long double t) { return Temperatura<Centigrados>(t); } ejemplo: usr literal.cc Referencias http://isocpp.org http://www.stroustrup.com/C++11FAQ.html http://cppreference.com http://www.cplusplus.com/ El nuevo lenguaje C++ (C++11) Antal A. Buss Pontificia Universidad Javeriana - Cali Septiembre 3 2013 Gracias!