¿Cuáles son las diferencias entre C ++ 03, C ++ 11 y C ++ 14?

C ++ 11

Hay muchas diferencias. Enumerar todas las diferencias en C ++ 11 es probablemente un documento de 30-60 páginas, que es un poco largo para una respuesta de Quora. Algunas de las diferencias son fáciles de entender para un principiante, y otras son bastante esotéricas. Tampoco todos encajan perfectamente en un solo tema general, excepto tal vez que C ++ 11 elimina muchas de las esquinas ásperas de C ++ 03.

Aquí hay algunos puntos destacados:

  • Puede especificar el tipo de una variable a partir del valor que le asigne. Por ejemplo auto i = 3; haré i un número entero. Esto es importante cuando el tipo es complejo; considera for( auto i = vec.begin(); i != vec.end(); ++i ) , que es bastante bueno, y compáralo con for( std::vector< std::set >::const_iterator i = vec.begin(); i != vec.end(); ++i ) , que es el código de C ++ 03 equivalente.
  • Puede especificar si desea anular una función virtual utilizando la palabra clave de override ; también puede especificar que pretende que todas las sustituciones secundarias futuras de una función virtual en particular sean ilegales con la palabra clave final . Es común anular incorrectamente, y esto permite que el compilador le diga si está cometiendo un error.
  • Puede forzar o suprimir explícitamente la generación predeterminada de constructores de copia, constructores predeterminados, constructores de movimiento, destructores y operadores de asignación. La sintaxis para hacer que una clase no pueda copiarse ahora tiene sentido.
  • Ahora puedes crear lambdas , que son algo así como funciones anónimas. Las Lambdas se pueden crear dentro de una función regular, y pueden capturar y usar variables locales del contexto en el que se crean.
  • Hay una nueva forma de bucle para iterar a través de contenedores . Se ve así: for( auto i : container ) . Funcionará tanto con los contenedores incorporados como con los contenedores que fabrique, siempre que sus contenedores cumplan con ciertos requisitos.
  • Hay algunos punteros nuevos gestionados . El auto_ptr , que facilitó la creación de bloqueos, ha sido reemplazado por unique_ptr , que es mucho más seguro. También hay un nuevo shared_ptr para aquellos que desean escribir código similar a Java sin un recolector de basura.
  • Ahora el subprocesamiento está integrado en el lenguaje C ++ . No es necesario agregar una biblioteca externa.
  • Ahora puede mover datos cuando usa un constructor o un operador de asignación, en lugar de copiarlos. Esto es mucho más rápido. El concepto de una referencia de valor se introdujo para hacer esto posible.
  • Puede inicializar un contenedor con una lista en línea , llamada lista de inicialización. Por ejemplo, std::vector v = { 1, 2, 3, 4 };
  • Los constructores pueden llamar a otro constructor en la misma clase. Esto hace que sea fácil evitar el código repetitivo cuando desea tener muchas firmas de constructores.
  • El puntero nulo ahora se llama nullptr . En realidad, es un tipo de puntero, y nunca se confundirá con un entero; NULL tiene problemas con esto.
  • Las plantillas Variadic permiten que las plantillas tengan un número variable de parámetros. Como si las plantillas no estuvieran lo suficientemente locas.

Hay muchas más cosas; esto cubre muchos de los aspectos más destacados, pero también hay un montón de características adicionales … Puede leer la lista de Bjarne Stroustrup en: C ++ 11 Preguntas frecuentes. Wikipedia también tiene una buena lista: C ++ 11.

C ++ 14

Los cambios para C ++ 14, en comparación, son bastante modestos. Se espera la próxima revisión “grande” en 2017. Sin embargo, todavía hay algunos cambios interesantes:

  • Ahora también puedes usar auto para tipos de devolución; Mientras todas sus expresiones de retorno tengan tipos consistentes, funcionará.
  • Puedes usar auto para los parámetros de lambda. Esto es algo así como crear una lambda con plantilla.
  • Se ha agregado un mecanismo para desaprobar el código; puede pegar [[en desuso]] delante del nombre de la clase. Los compiladores pueden hacer con esto lo que quieran.
  • Puedes usar números binarios ahora, si quieres. 0b1001 es otra forma de escribir 9 . Esto es útil si no eres muy bueno en notación hexadecimal.

En su mayoría son unos pocos ajustes menores para generalizar algunas de las nuevas ideas en C ++ 11, y para limpiar algunos puntos difíciles. Esta tampoco es una lista completa, pero cubre algunos aspectos destacados. La mayoría de estos se tomaron de este artículo del Dr. Dobb: El estándar C ++ 14: Lo que usted necesita saber.

Son versiones diferentes del estándar C ++. Solo hay un puñado de diferencias entre 11 y 14 y no me preocuparía demasiado por eso, pero hay MUCHAS diferencias entre 03 y 11.

Como C ++ 11 es todavía relativamente nuevo, la mayoría de los tutoriales de C ++ que encontrará no incluirán esas nuevas características, simplemente porque se escribieron antes de que C ++ 11 se estandarizara. Los que lo hagan probablemente especifiquen que son para C ++ 11/14. En este punto, recomendaría seguir un tutorial del 11/14.