SlideShare una empresa de Scribd logo
1 de 33
MADRID · NOV 27-28 · 2015
MADRID · NOV 27-28 · 2015
int foo;
foo es un entero
MADRID · NOV 27-28 · 2015
int* foo;
foo es un puntero a un entero
MADRID · NOV 27-28 · 2015
char *(*(**foo [][8])())[];
foo es un array de arrays de 8 punteros a función retornando un
puntero a un array de punteros a char
Bienvenido de nuevo
C++
(O por qué es mala idea aprender C
antes de C++)MADRID · NOV 27-28 · 2015
Eduard
Tomàs
@eiximenis
http://geeks.ms/blogs/etomas
etomas@gmail.com
Desarrollador en plain concepts
http://plainconcepts.com
Cervecero aficionado
https://untappd.com/user/eiximenis
MADRID · NOV 27-28 · 2015
C++ no es un “mejor C”
Olvida las “buenas prácticas” de C: no tienen porque ser
“buenas prácticas” de C++
No uses const char* para cadenas. Usa std::string
Usa la librería estándard de C++, “olvida” la de C
(strcpy, printf, ...)
No uses arrays directamente. Usa las clases de la
librería de C++ (std::vector, std::map,...) en su lugar
Usa referencias antes que punteros
MADRID · NOV 27-28 · 2015
C++98... C++11... C++14
C++98 es el estándard más usado de C++. Con el que
(casi) todos aprendimos, vaya :P
El lenguaje ha evolucionado mucho. El estándard
C++0x se concebió para estandarizar muchas de esas
evoluciones.
C++0x terminó siendo C++11
C++14 es una revisión menor de C++11
Modern C++
Ámbito de pila antes de ámbito de heap
Smart pointers antes que punteros
“desnudos”
Contenedores estándard antes que
propios
Algoritmos estándard antes que propios
Excepciones para reportar errores
Expresiones lambda
Range-based loops en lugar de bucles
normales
...
MADRID · NOV 27-28 · 2015
Classical C++...
circle* p = new circle();
shape** shapes = load_shapes_classic();
for (int idx = 0; idx < 10; idx++) {
cout << "Shape found " << shapes[idx]->name().c_str() << "n";
}
// Need to delete all shapes
for (int idx = 0; idx < 10; idx++) {
delete shapes[idx];
}
delete shapes;
delete p;
MADRID · NOV 27-28 · 2015
Modern C++
auto p = make_shared<circle>();
auto v = load_shapes_modern();
for_each(v.begin(), v.end(), [&](const shared_ptr<shape>& s) {
cout << "Shape found " << s->name().c_str() << "n";
});
MADRID · NOV 27-28 · 2015
Inferencia de tipos
Palabra clave auto declara el tipo de una variable en
función de su expresión
auto i = 10;
auto v = vector<int>();
...
MADRID · NOV 27-28 · 2015
auto
Muy útil en aquellos casos en que el tipo es realmente
complicado o complejo de saber
auto v = std::vector<int>();
// antes:
std::vector<int>::iterator i = v.begin();
// ahora:
auto i = v.begin();
MADRID · NOV 27-28 · 2015
auto
Necesario en aquellos casos en que el tipo es
imposible de saber por el desarrollador (pero sí por el
compilador en tiempo de compilación):
template<typename T, typename S>
void foo(T lhs, S rhs) {
????? prod = lhs * rhs;
// code...
}
MADRID · NOV 27-28 · 2015
decltype
Similar a auto en su concepción, pero decltype deduce un tipo en
base a una expresión pasada a decltype:
decltype(10) a; // a es int
decltype(2*3.0) b; // b es double
Necesario cuando el tipo de retorno de una función no es
conocido por el desarrollador (pero sí por el compilador en tiempo
de compilación)
MADRID · NOV 27-28 · 2015
decltype
¿Cual es el tipo de retorno de la función? Dependerá de
los tipos T y S resueltos en compilación.
template<typename T, typename S>
???? foo(T lhs, S rhs) {
auto prod = lhs * rhs;
return prod;
}
MADRID · NOV 27-28 · 2015
decltype
Problema: La idea es correcta pero no compila porque
lhs y rhs no están definidos al usar decltype
template<typename T, typename S>
decltype(lhs * rhs) foo(T lhs, S rhs) {
auto prod = lhs * rhs;
return prod;
}
MADRID · NOV 27-28 · 2015
trailing return type syntax
Se puede especificar el tipo del valor de retorno de
una función al final de la firma, usando ->
int sum(int a, int b) {...}
auto sum (int a, int b) -> int {...}
MADRID · NOV 27-28 · 2015
decltype
Ahora lhs y rhs estan definidos al usar decltype
template<typename T, typename S>
auto foo(T lhs, S rhs)-> decltype(lhs * rhs) {
auto prod = lhs * rhs;
return prod;
}
MADRID · NOV 27-28 · 2015
Referencias
Usa referencias antes que punteros siempre que sea
posible.
Las referencias siempre apuntan a un objeto siendo
mucho más seguras que un puntero
Muchas de las cosas que hacemos con punteros
pueden ser resueltas con referencias.
MADRID · NOV 27-28 · 2015
Gestión de la memoria
1. La diferencia fundamental entre new y delete por una parte, y malloc() y free()
por otra es que los primeros crean y destruyen objetos, mientras que los
segundos se limitan a reservar y liberar zonas de memoria
2. Al utilizar delete (lo mismo sucede con free()), se libera la zona de memoria a la
que apunta, pero sin borrar el propio puntero. Si se manda liberar lo apuntado por
un puntero nulo no pasa nada especial y el programa no libera memoria. Sin
embargo si se ordena liberar dos veces lo apuntado por un puntero las
consecuencias son imprevisibles y puede que incluso catastróficas, por lo
que es importante evitar este tipo de errores
http://mat21.etsii.upm.es/ayudainf/aprendainf/Cpp/manualcpp.pdf (pags 30,31)
MADRID · NOV 27-28 · 2015
Gestión de la memoria
Si usas new y delete para gestionar la memoria... lo
estás haciendo mal.
Es posible conseguir en C++, liberación automática de
memoria, de forma determinista y sin apenas esfuerzo.
Resource Acquisition Is Initialization
MADRID · NOV 27-28 · 2015
Gestión de la memoria - RAII
std::shared_ptr<T>
Encapsula el puntero a un objeto de
tipo T y un contador de
referencias asociado, compartido
por todos los shared_ptr que
apunten al mismo objeto
MADRID · NOV 27-28 · 2015
Gestión de la memoria - RAII
std::unique_ptr<T>
Objeto que mantiene la propiedad exclusiva de un
puntero a un objeto de tipo T.
Un unique_ptr no puede ser copiado, no pueden haber
dos unique_ptr apuntando al mismo objeto.
MADRID · NOV 27-28 · 2015
RAII
RAII se aplica no solo a memoria si no en general en
cualquier tipo de recurso:
class file
{
public:
file( const char* filename ) : m_file_handle(std::fopen(filename, "w+"))
{ }
~file()
{
std::fclose(m_file_handle) ;
}
private:
std::FILE* m_file_handle ;
file( const file & ) ;
file & operator=( const file & ) ;
} ;
void example_with_RAII()
{
// open file (acquire resource)
file logfile("logfile.txt");
// Use the resource. When exiting by going out
// of scope
// for any reason (including exceptions) file will
// be closed. No action needed to release the
// resource.
}
MADRID · NOV 27-28 · 2015
Expresiones lambda
Permiten definir closures de forma muy sencilla,
manteniendo en todo momento el control de qué
variables se quieren capturar.
[](int i)->int {return i * 2; };
Captura de variables Parámetros
Tipo retorno
Código
MADRID · NOV 27-28 · 2015
Expresiones lambda
Una expresión lambda... ¿Devuelve un puntero a
función?
¡NO! Devuelve un objeto que tiene operator() definido
MADRID · NOV 27-28 · 2015
Tipo de expresión lambda
Una expresión lambda tiene un tipo propio y único
generado por el compilador, pero que es convertible al
tipo function<T> siendo T la firma de la función.
P. ej. El tipo function<R(T,S)> representa una lambda
que tiene dos parámetros de tipo T y S y que devuelve
un valor de tipo T
MADRID · NOV 27-28 · 2015
Expresiones lambda template
Una expresión lambda puede tener parámetros
template
La palabra clave auto indica que el tipo del parámetro
es autodeducido
auto lambda_sum = [](auto x, auto y) {
return x + y;
};
¡Esto es un template no
inferencia de tipos!
MADRID · NOV 27-28 · 2015
¿Hay más?
Por supuesto.... Hay mucho más.
C++11 incluye muchas otras características:
1. Move semantics (r-value references)
2. override/final
3. type traits
4. Funciones deleted y defaulted
5. Variadic templates
6. Más...
MADRID · NOV 27-28 · 2015
¿Donde seguir?
http://www.stroustrup.com/C++11FAQ.html
https://en.wikipedia.org/wiki/C%2B%2B11
https://en.wikipedia.org/wiki/C%2B%2B14
https://isocpp.org/wiki/faq/cpp11-language
https://isocpp.org/wiki/faq/cpp14-language
The C++ standard book:
http://www.amazon.es/The-Programming-Language-
Bjarne-Stroustrup/dp/0321958322/
MADRID · NOV 27-28 · 2015
Gracias!!!!!
Eduard Tomàs
etomas@gmail.com
@eiximenis
http://geeks.ms/blogs/etomas

Más contenido relacionado

La actualidad más candente

Clase 1- Programacion Lineal
Clase 1- Programacion LinealClase 1- Programacion Lineal
Clase 1- Programacion Linealkarlalopezbello
 
Trabajo De Ecuaciones Diferenciales
Trabajo De Ecuaciones DiferencialesTrabajo De Ecuaciones Diferenciales
Trabajo De Ecuaciones DiferencialesMajoJara
 
4º medio-taller-psu-matemática-funciones
4º medio-taller-psu-matemática-funciones4º medio-taller-psu-matemática-funciones
4º medio-taller-psu-matemática-funcionesivan vargas
 
Estructura de datos I Primera Parte
Estructura de datos I Primera ParteEstructura de datos I Primera Parte
Estructura de datos I Primera Partecarpio
 
Guia Programacion 1
Guia Programacion 1Guia Programacion 1
Guia Programacion 1martell024
 
Formato actividades semana 1 (1)
Formato actividades semana 1 (1)Formato actividades semana 1 (1)
Formato actividades semana 1 (1)Luis Hernandez
 
Ejercicio RCL Resuelto con Matlab
Ejercicio RCL Resuelto con MatlabEjercicio RCL Resuelto con Matlab
Ejercicio RCL Resuelto con MatlabAlexandra Rojas
 
C++ unidad1 semana1
C++ unidad1 semana1C++ unidad1 semana1
C++ unidad1 semana1winnijbn
 
Cuestionario de 2(2)
Cuestionario de 2(2)Cuestionario de 2(2)
Cuestionario de 2(2)Efren Pacheco
 
Laboratorio1 -Teoría de los circuitos: Uso de Matlab
Laboratorio1 -Teoría de los circuitos: Uso de MatlabLaboratorio1 -Teoría de los circuitos: Uso de Matlab
Laboratorio1 -Teoría de los circuitos: Uso de MatlabGega Li
 

La actualidad más candente (18)

Clase 1- Programacion Lineal
Clase 1- Programacion LinealClase 1- Programacion Lineal
Clase 1- Programacion Lineal
 
Trabajo De Ecuaciones Diferenciales
Trabajo De Ecuaciones DiferencialesTrabajo De Ecuaciones Diferenciales
Trabajo De Ecuaciones Diferenciales
 
Federico moreira
Federico moreiraFederico moreira
Federico moreira
 
4º medio-taller-psu-matemática-funciones
4º medio-taller-psu-matemática-funciones4º medio-taller-psu-matemática-funciones
4º medio-taller-psu-matemática-funciones
 
Matemática: Funciones.
Matemática: Funciones.Matemática: Funciones.
Matemática: Funciones.
 
Estructura de datos I Primera Parte
Estructura de datos I Primera ParteEstructura de datos I Primera Parte
Estructura de datos I Primera Parte
 
Colaborativo 3 01
Colaborativo 3 01Colaborativo 3 01
Colaborativo 3 01
 
Guia Programacion 1
Guia Programacion 1Guia Programacion 1
Guia Programacion 1
 
Programación 1: funciones en C
Programación 1: funciones en CProgramación 1: funciones en C
Programación 1: funciones en C
 
Formato actividades semana 1 (1)
Formato actividades semana 1 (1)Formato actividades semana 1 (1)
Formato actividades semana 1 (1)
 
Optimización
OptimizaciónOptimización
Optimización
 
Introducción a Processing
Introducción a ProcessingIntroducción a Processing
Introducción a Processing
 
Algebra v
Algebra vAlgebra v
Algebra v
 
Ejercicio RCL Resuelto con Matlab
Ejercicio RCL Resuelto con MatlabEjercicio RCL Resuelto con Matlab
Ejercicio RCL Resuelto con Matlab
 
Programación grafica en lenguaje c
Programación grafica en lenguaje cProgramación grafica en lenguaje c
Programación grafica en lenguaje c
 
C++ unidad1 semana1
C++ unidad1 semana1C++ unidad1 semana1
C++ unidad1 semana1
 
Cuestionario de 2(2)
Cuestionario de 2(2)Cuestionario de 2(2)
Cuestionario de 2(2)
 
Laboratorio1 -Teoría de los circuitos: Uso de Matlab
Laboratorio1 -Teoría de los circuitos: Uso de MatlabLaboratorio1 -Teoría de los circuitos: Uso de Matlab
Laboratorio1 -Teoría de los circuitos: Uso de Matlab
 

Similar a Codemotion 2015 - Bienvenido de nuevo c++

principios de algortimos, secuencuas y base de dats
principios de algortimos, secuencuas y base de datsprincipios de algortimos, secuencuas y base de dats
principios de algortimos, secuencuas y base de datsmiguelgarciasalazar3
 
Sesión 3_Secuencial Principios de Algoritmos.ppt
Sesión 3_Secuencial Principios de Algoritmos.pptSesión 3_Secuencial Principios de Algoritmos.ppt
Sesión 3_Secuencial Principios de Algoritmos.pptyohannygarciasalazar1
 
Introducción a ObjectiveC e IOS
Introducción a ObjectiveC e IOSIntroducción a ObjectiveC e IOS
Introducción a ObjectiveC e IOSEduard Tomàs
 
Java8 : Más allá de las Expresiones Lambdas
Java8 :  Más allá de las Expresiones LambdasJava8 :  Más allá de las Expresiones Lambdas
Java8 : Más allá de las Expresiones LambdasEudris Cabrera
 
Ejemplo de solución de práctica funciones stl
Ejemplo de solución de práctica funciones stlEjemplo de solución de práctica funciones stl
Ejemplo de solución de práctica funciones stlUVM
 
Fundamentos de Programacion
Fundamentos de ProgramacionFundamentos de Programacion
Fundamentos de Programacionneyvajms
 
Matlab
MatlabMatlab
Matlabford81
 
Matlab (1)
Matlab (1)Matlab (1)
Matlab (1)numpad
 
6 libro fundamentos cap__modularidad_ecler mv
6 libro fundamentos cap__modularidad_ecler mv6 libro fundamentos cap__modularidad_ecler mv
6 libro fundamentos cap__modularidad_ecler mvEcler Mamani Vilca
 
5 Mecanismos Reuntilizacion Abstraccion Cont
5 Mecanismos Reuntilizacion Abstraccion Cont5 Mecanismos Reuntilizacion Abstraccion Cont
5 Mecanismos Reuntilizacion Abstraccion ContUVM
 
Taller processing arduino
Taller processing arduinoTaller processing arduino
Taller processing arduinojesusresta
 
Intro classes(1)
Intro classes(1)Intro classes(1)
Intro classes(1)claudiocj7
 
Novedades de C++11
Novedades de C++11Novedades de C++11
Novedades de C++11kdeespana
 
Elementos basicos de programacion
Elementos basicos de programacionElementos basicos de programacion
Elementos basicos de programacionrotflol
 

Similar a Codemotion 2015 - Bienvenido de nuevo c++ (20)

principios de algortimos, secuencuas y base de dats
principios de algortimos, secuencuas y base de datsprincipios de algortimos, secuencuas y base de dats
principios de algortimos, secuencuas y base de dats
 
Sesión 3_Secuencial Principios de Algoritmos.ppt
Sesión 3_Secuencial Principios de Algoritmos.pptSesión 3_Secuencial Principios de Algoritmos.ppt
Sesión 3_Secuencial Principios de Algoritmos.ppt
 
Del infierno al cielo
Del infierno al cieloDel infierno al cielo
Del infierno al cielo
 
Introducción a ObjectiveC e IOS
Introducción a ObjectiveC e IOSIntroducción a ObjectiveC e IOS
Introducción a ObjectiveC e IOS
 
Java8 : Más allá de las Expresiones Lambdas
Java8 :  Más allá de las Expresiones LambdasJava8 :  Más allá de las Expresiones Lambdas
Java8 : Más allá de las Expresiones Lambdas
 
Ejemplo de solución de práctica funciones stl
Ejemplo de solución de práctica funciones stlEjemplo de solución de práctica funciones stl
Ejemplo de solución de práctica funciones stl
 
Fundamentos de Programacion
Fundamentos de ProgramacionFundamentos de Programacion
Fundamentos de Programacion
 
Matlab
MatlabMatlab
Matlab
 
Matlab (1)
Matlab (1)Matlab (1)
Matlab (1)
 
Seminario de matlab
Seminario de matlabSeminario de matlab
Seminario de matlab
 
Introduccion a C++.pdf
Introduccion a C++.pdfIntroduccion a C++.pdf
Introduccion a C++.pdf
 
6 libro fundamentos cap__modularidad_ecler mv
6 libro fundamentos cap__modularidad_ecler mv6 libro fundamentos cap__modularidad_ecler mv
6 libro fundamentos cap__modularidad_ecler mv
 
5 Mecanismos Reuntilizacion Abstraccion Cont
5 Mecanismos Reuntilizacion Abstraccion Cont5 Mecanismos Reuntilizacion Abstraccion Cont
5 Mecanismos Reuntilizacion Abstraccion Cont
 
Taller processing arduino
Taller processing arduinoTaller processing arduino
Taller processing arduino
 
Intro classes(1)
Intro classes(1)Intro classes(1)
Intro classes(1)
 
Charla Mysql
Charla MysqlCharla Mysql
Charla Mysql
 
Clase 02
Clase 02Clase 02
Clase 02
 
Novedades de C++11
Novedades de C++11Novedades de C++11
Novedades de C++11
 
MATLAB 2010
MATLAB 2010MATLAB 2010
MATLAB 2010
 
Elementos basicos de programacion
Elementos basicos de programacionElementos basicos de programacion
Elementos basicos de programacion
 

Más de Eduard Tomàs

Kubernetes: Do's, don'ts and why's
Kubernetes: Do's, don'ts and why'sKubernetes: Do's, don'ts and why's
Kubernetes: Do's, don'ts and why'sEduard Tomàs
 
KCDS 2021- Escalando workloads serverless en Kubernetes con KEDA
KCDS 2021- Escalando workloads serverless en Kubernetes con KEDAKCDS 2021- Escalando workloads serverless en Kubernetes con KEDA
KCDS 2021- Escalando workloads serverless en Kubernetes con KEDAEduard Tomàs
 
Escalando workloads serverless en Kubernetes con Keda
Escalando workloads serverless en Kubernetes con KedaEscalando workloads serverless en Kubernetes con Keda
Escalando workloads serverless en Kubernetes con KedaEduard Tomàs
 
C#9 - Más C# que nunca
C#9 - Más C# que nuncaC#9 - Más C# que nunca
C#9 - Más C# que nuncaEduard Tomàs
 
CollabDays 2020 Barcelona - Serverless Kubernetes with KEDA
CollabDays 2020 Barcelona - Serverless Kubernetes with KEDACollabDays 2020 Barcelona - Serverless Kubernetes with KEDA
CollabDays 2020 Barcelona - Serverless Kubernetes with KEDAEduard Tomàs
 
Keda o como convertir Kubernetess en Serverless
Keda o como convertir Kubernetess en ServerlessKeda o como convertir Kubernetess en Serverless
Keda o como convertir Kubernetess en ServerlessEduard Tomàs
 
.NET Memoria y Rendimiento
.NET Memoria y Rendimiento.NET Memoria y Rendimiento
.NET Memoria y RendimientoEduard Tomàs
 
Containers en .NET (Dot Net 2018 - Spain)
Containers en .NET (Dot Net 2018 - Spain)Containers en .NET (Dot Net 2018 - Spain)
Containers en .NET (Dot Net 2018 - Spain)Eduard Tomàs
 
Esos contenedores, ¡a producción! (Commit Conf 2018)
Esos contenedores, ¡a producción! (Commit Conf 2018)Esos contenedores, ¡a producción! (Commit Conf 2018)
Esos contenedores, ¡a producción! (Commit Conf 2018)Eduard Tomàs
 
El "peor" lenguaje del mundo
El "peor" lenguaje del mundoEl "peor" lenguaje del mundo
El "peor" lenguaje del mundoEduard Tomàs
 
Containerize a netcore application with aks
 Containerize a netcore application with aks Containerize a netcore application with aks
Containerize a netcore application with aksEduard Tomàs
 
Escenarios avanzados en AKS (Global Azure Bootcamp Barcelona 2019)
Escenarios avanzados en AKS (Global Azure Bootcamp Barcelona 2019)Escenarios avanzados en AKS (Global Azure Bootcamp Barcelona 2019)
Escenarios avanzados en AKS (Global Azure Bootcamp Barcelona 2019)Eduard Tomàs
 
Aplicaciones de consola fáciles? Más quisieramos
Aplicaciones de consola fáciles? Más quisieramosAplicaciones de consola fáciles? Más quisieramos
Aplicaciones de consola fáciles? Más quisieramosEduard Tomàs
 
Serverless with Azure Functions and CosmosDb
Serverless with Azure Functions and CosmosDbServerless with Azure Functions and CosmosDb
Serverless with Azure Functions and CosmosDbEduard Tomàs
 
Docker y todo eso... más o menos
Docker y todo eso... más o menosDocker y todo eso... más o menos
Docker y todo eso... más o menosEduard Tomàs
 
Microservices: Yes or not?
Microservices: Yes or not?Microservices: Yes or not?
Microservices: Yes or not?Eduard Tomàs
 
React native - Unleash the power of your device
React native - Unleash the power of your deviceReact native - Unleash the power of your device
React native - Unleash the power of your deviceEduard Tomàs
 
JavaScript in 2016 (Codemotion Rome)
JavaScript in 2016 (Codemotion Rome)JavaScript in 2016 (Codemotion Rome)
JavaScript in 2016 (Codemotion Rome)Eduard Tomàs
 

Más de Eduard Tomàs (20)

Kubernetes: Do's, don'ts and why's
Kubernetes: Do's, don'ts and why'sKubernetes: Do's, don'ts and why's
Kubernetes: Do's, don'ts and why's
 
KCDS 2021- Escalando workloads serverless en Kubernetes con KEDA
KCDS 2021- Escalando workloads serverless en Kubernetes con KEDAKCDS 2021- Escalando workloads serverless en Kubernetes con KEDA
KCDS 2021- Escalando workloads serverless en Kubernetes con KEDA
 
Escalando workloads serverless en Kubernetes con Keda
Escalando workloads serverless en Kubernetes con KedaEscalando workloads serverless en Kubernetes con Keda
Escalando workloads serverless en Kubernetes con Keda
 
C#9 - Más C# que nunca
C#9 - Más C# que nuncaC#9 - Más C# que nunca
C#9 - Más C# que nunca
 
CollabDays 2020 Barcelona - Serverless Kubernetes with KEDA
CollabDays 2020 Barcelona - Serverless Kubernetes with KEDACollabDays 2020 Barcelona - Serverless Kubernetes with KEDA
CollabDays 2020 Barcelona - Serverless Kubernetes with KEDA
 
Keda o como convertir Kubernetess en Serverless
Keda o como convertir Kubernetess en ServerlessKeda o como convertir Kubernetess en Serverless
Keda o como convertir Kubernetess en Serverless
 
.NET Memoria y Rendimiento
.NET Memoria y Rendimiento.NET Memoria y Rendimiento
.NET Memoria y Rendimiento
 
Containers en .NET (Dot Net 2018 - Spain)
Containers en .NET (Dot Net 2018 - Spain)Containers en .NET (Dot Net 2018 - Spain)
Containers en .NET (Dot Net 2018 - Spain)
 
Esos contenedores, ¡a producción! (Commit Conf 2018)
Esos contenedores, ¡a producción! (Commit Conf 2018)Esos contenedores, ¡a producción! (Commit Conf 2018)
Esos contenedores, ¡a producción! (Commit Conf 2018)
 
El "peor" lenguaje del mundo
El "peor" lenguaje del mundoEl "peor" lenguaje del mundo
El "peor" lenguaje del mundo
 
Containerize a netcore application with aks
 Containerize a netcore application with aks Containerize a netcore application with aks
Containerize a netcore application with aks
 
Escenarios avanzados en AKS (Global Azure Bootcamp Barcelona 2019)
Escenarios avanzados en AKS (Global Azure Bootcamp Barcelona 2019)Escenarios avanzados en AKS (Global Azure Bootcamp Barcelona 2019)
Escenarios avanzados en AKS (Global Azure Bootcamp Barcelona 2019)
 
Aplicaciones de consola fáciles? Más quisieramos
Aplicaciones de consola fáciles? Más quisieramosAplicaciones de consola fáciles? Más quisieramos
Aplicaciones de consola fáciles? Más quisieramos
 
Serverless with Azure Functions and CosmosDb
Serverless with Azure Functions and CosmosDbServerless with Azure Functions and CosmosDb
Serverless with Azure Functions and CosmosDb
 
Docker y todo eso... más o menos
Docker y todo eso... más o menosDocker y todo eso... más o menos
Docker y todo eso... más o menos
 
Microservices: Yes or not?
Microservices: Yes or not?Microservices: Yes or not?
Microservices: Yes or not?
 
ASP.NET MVC Core
ASP.NET MVC CoreASP.NET MVC Core
ASP.NET MVC Core
 
Azure functions
Azure functionsAzure functions
Azure functions
 
React native - Unleash the power of your device
React native - Unleash the power of your deviceReact native - Unleash the power of your device
React native - Unleash the power of your device
 
JavaScript in 2016 (Codemotion Rome)
JavaScript in 2016 (Codemotion Rome)JavaScript in 2016 (Codemotion Rome)
JavaScript in 2016 (Codemotion Rome)
 

Último

Introducción a Funciones LENGUAJE DART FLUTTER
Introducción a Funciones LENGUAJE DART FLUTTERIntroducción a Funciones LENGUAJE DART FLUTTER
Introducción a Funciones LENGUAJE DART FLUTTEREMMAFLORESCARMONA
 
Unidad_3_T1_AutomatasFinitos presentacion
Unidad_3_T1_AutomatasFinitos presentacionUnidad_3_T1_AutomatasFinitos presentacion
Unidad_3_T1_AutomatasFinitos presentacionarmando_cardenas
 
BREEAM ES Urbanismo como herramienta para un planeamiento sostenible - Miguel...
BREEAM ES Urbanismo como herramienta para un planeamiento sostenible - Miguel...BREEAM ES Urbanismo como herramienta para un planeamiento sostenible - Miguel...
BREEAM ES Urbanismo como herramienta para un planeamiento sostenible - Miguel...ITeC Instituto Tecnología Construcción
 
Segmentacion Segmantica_Modelos UNET and DEEPLABV3
Segmentacion Segmantica_Modelos UNET and DEEPLABV3Segmentacion Segmantica_Modelos UNET and DEEPLABV3
Segmentacion Segmantica_Modelos UNET and DEEPLABV3AlexysCaytanoMelndez1
 
Manual de Usuario APPs_AppInventor-2023.pdf
Manual de Usuario APPs_AppInventor-2023.pdfManual de Usuario APPs_AppInventor-2023.pdf
Manual de Usuario APPs_AppInventor-2023.pdfmasogeis
 
Caso de éxito de Hervian con el ERP Sage 200
Caso de éxito de Hervian con el ERP Sage 200Caso de éxito de Hervian con el ERP Sage 200
Caso de éxito de Hervian con el ERP Sage 200Opentix
 
PARTES DEL TECLADO Y SUS FUNCIONES - EJEMPLO
PARTES DEL TECLADO Y SUS FUNCIONES - EJEMPLOPARTES DEL TECLADO Y SUS FUNCIONES - EJEMPLO
PARTES DEL TECLADO Y SUS FUNCIONES - EJEMPLOSelenaCoronadoHuaman
 

Último (7)

Introducción a Funciones LENGUAJE DART FLUTTER
Introducción a Funciones LENGUAJE DART FLUTTERIntroducción a Funciones LENGUAJE DART FLUTTER
Introducción a Funciones LENGUAJE DART FLUTTER
 
Unidad_3_T1_AutomatasFinitos presentacion
Unidad_3_T1_AutomatasFinitos presentacionUnidad_3_T1_AutomatasFinitos presentacion
Unidad_3_T1_AutomatasFinitos presentacion
 
BREEAM ES Urbanismo como herramienta para un planeamiento sostenible - Miguel...
BREEAM ES Urbanismo como herramienta para un planeamiento sostenible - Miguel...BREEAM ES Urbanismo como herramienta para un planeamiento sostenible - Miguel...
BREEAM ES Urbanismo como herramienta para un planeamiento sostenible - Miguel...
 
Segmentacion Segmantica_Modelos UNET and DEEPLABV3
Segmentacion Segmantica_Modelos UNET and DEEPLABV3Segmentacion Segmantica_Modelos UNET and DEEPLABV3
Segmentacion Segmantica_Modelos UNET and DEEPLABV3
 
Manual de Usuario APPs_AppInventor-2023.pdf
Manual de Usuario APPs_AppInventor-2023.pdfManual de Usuario APPs_AppInventor-2023.pdf
Manual de Usuario APPs_AppInventor-2023.pdf
 
Caso de éxito de Hervian con el ERP Sage 200
Caso de éxito de Hervian con el ERP Sage 200Caso de éxito de Hervian con el ERP Sage 200
Caso de éxito de Hervian con el ERP Sage 200
 
PARTES DEL TECLADO Y SUS FUNCIONES - EJEMPLO
PARTES DEL TECLADO Y SUS FUNCIONES - EJEMPLOPARTES DEL TECLADO Y SUS FUNCIONES - EJEMPLO
PARTES DEL TECLADO Y SUS FUNCIONES - EJEMPLO
 

Codemotion 2015 - Bienvenido de nuevo c++

  • 1. MADRID · NOV 27-28 · 2015
  • 2. MADRID · NOV 27-28 · 2015 int foo; foo es un entero
  • 3. MADRID · NOV 27-28 · 2015 int* foo; foo es un puntero a un entero
  • 4. MADRID · NOV 27-28 · 2015 char *(*(**foo [][8])())[]; foo es un array de arrays de 8 punteros a función retornando un puntero a un array de punteros a char
  • 5.
  • 6. Bienvenido de nuevo C++ (O por qué es mala idea aprender C antes de C++)MADRID · NOV 27-28 · 2015
  • 7. Eduard Tomàs @eiximenis http://geeks.ms/blogs/etomas etomas@gmail.com Desarrollador en plain concepts http://plainconcepts.com Cervecero aficionado https://untappd.com/user/eiximenis
  • 8. MADRID · NOV 27-28 · 2015 C++ no es un “mejor C” Olvida las “buenas prácticas” de C: no tienen porque ser “buenas prácticas” de C++ No uses const char* para cadenas. Usa std::string Usa la librería estándard de C++, “olvida” la de C (strcpy, printf, ...) No uses arrays directamente. Usa las clases de la librería de C++ (std::vector, std::map,...) en su lugar Usa referencias antes que punteros
  • 9. MADRID · NOV 27-28 · 2015 C++98... C++11... C++14 C++98 es el estándard más usado de C++. Con el que (casi) todos aprendimos, vaya :P El lenguaje ha evolucionado mucho. El estándard C++0x se concebió para estandarizar muchas de esas evoluciones. C++0x terminó siendo C++11 C++14 es una revisión menor de C++11
  • 10. Modern C++ Ámbito de pila antes de ámbito de heap Smart pointers antes que punteros “desnudos” Contenedores estándard antes que propios Algoritmos estándard antes que propios Excepciones para reportar errores Expresiones lambda Range-based loops en lugar de bucles normales ...
  • 11. MADRID · NOV 27-28 · 2015 Classical C++... circle* p = new circle(); shape** shapes = load_shapes_classic(); for (int idx = 0; idx < 10; idx++) { cout << "Shape found " << shapes[idx]->name().c_str() << "n"; } // Need to delete all shapes for (int idx = 0; idx < 10; idx++) { delete shapes[idx]; } delete shapes; delete p;
  • 12. MADRID · NOV 27-28 · 2015 Modern C++ auto p = make_shared<circle>(); auto v = load_shapes_modern(); for_each(v.begin(), v.end(), [&](const shared_ptr<shape>& s) { cout << "Shape found " << s->name().c_str() << "n"; });
  • 13. MADRID · NOV 27-28 · 2015 Inferencia de tipos Palabra clave auto declara el tipo de una variable en función de su expresión auto i = 10; auto v = vector<int>(); ...
  • 14. MADRID · NOV 27-28 · 2015 auto Muy útil en aquellos casos en que el tipo es realmente complicado o complejo de saber auto v = std::vector<int>(); // antes: std::vector<int>::iterator i = v.begin(); // ahora: auto i = v.begin();
  • 15. MADRID · NOV 27-28 · 2015 auto Necesario en aquellos casos en que el tipo es imposible de saber por el desarrollador (pero sí por el compilador en tiempo de compilación): template<typename T, typename S> void foo(T lhs, S rhs) { ????? prod = lhs * rhs; // code... }
  • 16. MADRID · NOV 27-28 · 2015 decltype Similar a auto en su concepción, pero decltype deduce un tipo en base a una expresión pasada a decltype: decltype(10) a; // a es int decltype(2*3.0) b; // b es double Necesario cuando el tipo de retorno de una función no es conocido por el desarrollador (pero sí por el compilador en tiempo de compilación)
  • 17. MADRID · NOV 27-28 · 2015 decltype ¿Cual es el tipo de retorno de la función? Dependerá de los tipos T y S resueltos en compilación. template<typename T, typename S> ???? foo(T lhs, S rhs) { auto prod = lhs * rhs; return prod; }
  • 18. MADRID · NOV 27-28 · 2015 decltype Problema: La idea es correcta pero no compila porque lhs y rhs no están definidos al usar decltype template<typename T, typename S> decltype(lhs * rhs) foo(T lhs, S rhs) { auto prod = lhs * rhs; return prod; }
  • 19. MADRID · NOV 27-28 · 2015 trailing return type syntax Se puede especificar el tipo del valor de retorno de una función al final de la firma, usando -> int sum(int a, int b) {...} auto sum (int a, int b) -> int {...}
  • 20. MADRID · NOV 27-28 · 2015 decltype Ahora lhs y rhs estan definidos al usar decltype template<typename T, typename S> auto foo(T lhs, S rhs)-> decltype(lhs * rhs) { auto prod = lhs * rhs; return prod; }
  • 21. MADRID · NOV 27-28 · 2015 Referencias Usa referencias antes que punteros siempre que sea posible. Las referencias siempre apuntan a un objeto siendo mucho más seguras que un puntero Muchas de las cosas que hacemos con punteros pueden ser resueltas con referencias.
  • 22. MADRID · NOV 27-28 · 2015 Gestión de la memoria 1. La diferencia fundamental entre new y delete por una parte, y malloc() y free() por otra es que los primeros crean y destruyen objetos, mientras que los segundos se limitan a reservar y liberar zonas de memoria 2. Al utilizar delete (lo mismo sucede con free()), se libera la zona de memoria a la que apunta, pero sin borrar el propio puntero. Si se manda liberar lo apuntado por un puntero nulo no pasa nada especial y el programa no libera memoria. Sin embargo si se ordena liberar dos veces lo apuntado por un puntero las consecuencias son imprevisibles y puede que incluso catastróficas, por lo que es importante evitar este tipo de errores http://mat21.etsii.upm.es/ayudainf/aprendainf/Cpp/manualcpp.pdf (pags 30,31)
  • 23. MADRID · NOV 27-28 · 2015 Gestión de la memoria Si usas new y delete para gestionar la memoria... lo estás haciendo mal. Es posible conseguir en C++, liberación automática de memoria, de forma determinista y sin apenas esfuerzo. Resource Acquisition Is Initialization
  • 24. MADRID · NOV 27-28 · 2015 Gestión de la memoria - RAII std::shared_ptr<T> Encapsula el puntero a un objeto de tipo T y un contador de referencias asociado, compartido por todos los shared_ptr que apunten al mismo objeto
  • 25. MADRID · NOV 27-28 · 2015 Gestión de la memoria - RAII std::unique_ptr<T> Objeto que mantiene la propiedad exclusiva de un puntero a un objeto de tipo T. Un unique_ptr no puede ser copiado, no pueden haber dos unique_ptr apuntando al mismo objeto.
  • 26. MADRID · NOV 27-28 · 2015 RAII RAII se aplica no solo a memoria si no en general en cualquier tipo de recurso: class file { public: file( const char* filename ) : m_file_handle(std::fopen(filename, "w+")) { } ~file() { std::fclose(m_file_handle) ; } private: std::FILE* m_file_handle ; file( const file & ) ; file & operator=( const file & ) ; } ; void example_with_RAII() { // open file (acquire resource) file logfile("logfile.txt"); // Use the resource. When exiting by going out // of scope // for any reason (including exceptions) file will // be closed. No action needed to release the // resource. }
  • 27. MADRID · NOV 27-28 · 2015 Expresiones lambda Permiten definir closures de forma muy sencilla, manteniendo en todo momento el control de qué variables se quieren capturar. [](int i)->int {return i * 2; }; Captura de variables Parámetros Tipo retorno Código
  • 28. MADRID · NOV 27-28 · 2015 Expresiones lambda Una expresión lambda... ¿Devuelve un puntero a función? ¡NO! Devuelve un objeto que tiene operator() definido
  • 29. MADRID · NOV 27-28 · 2015 Tipo de expresión lambda Una expresión lambda tiene un tipo propio y único generado por el compilador, pero que es convertible al tipo function<T> siendo T la firma de la función. P. ej. El tipo function<R(T,S)> representa una lambda que tiene dos parámetros de tipo T y S y que devuelve un valor de tipo T
  • 30. MADRID · NOV 27-28 · 2015 Expresiones lambda template Una expresión lambda puede tener parámetros template La palabra clave auto indica que el tipo del parámetro es autodeducido auto lambda_sum = [](auto x, auto y) { return x + y; }; ¡Esto es un template no inferencia de tipos!
  • 31. MADRID · NOV 27-28 · 2015 ¿Hay más? Por supuesto.... Hay mucho más. C++11 incluye muchas otras características: 1. Move semantics (r-value references) 2. override/final 3. type traits 4. Funciones deleted y defaulted 5. Variadic templates 6. Más...
  • 32. MADRID · NOV 27-28 · 2015 ¿Donde seguir? http://www.stroustrup.com/C++11FAQ.html https://en.wikipedia.org/wiki/C%2B%2B11 https://en.wikipedia.org/wiki/C%2B%2B14 https://isocpp.org/wiki/faq/cpp11-language https://isocpp.org/wiki/faq/cpp14-language The C++ standard book: http://www.amazon.es/The-Programming-Language- Bjarne-Stroustrup/dp/0321958322/
  • 33. MADRID · NOV 27-28 · 2015 Gracias!!!!! Eduard Tomàs etomas@gmail.com @eiximenis http://geeks.ms/blogs/etomas