El nuevo lenguaje C++ (C++11) - Pontificia Universidad Javeriana

Transcripción

El nuevo lenguaje C++ (C++11) - Pontificia Universidad Javeriana
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!