2010-09-07 18 views
22

A veces leo discusión sobre por qué C++ es bueno o malo y, a veces uno de los argumentos que la CITES de hoy moderna C++ es muy diferente de la antigua C++. Me pregunto exactamente ¿cuál sería la diferencia? ¿Cuál sería un ejemplo de C++ "moderno" y cuál sería un ejemplo (preferiblemente haciendo lo mismo) de este "viejo" C++?¿Qué es el C++ moderno?

+3

Sin citas o referencias reales, es difícil saber exactamente de qué estás hablando. ¿Puede proporcionar un enlace o una referencia para que sepamos lo que lee? –

Respuesta

24

uso continuado de la biblioteca estándar y STL, excepciones y plantillas - en lugar de C con clases

+1

Agregaría metaprogramación – Anycorn

+0

@Martin Beckett STL es una parte de la biblioteca estándar. –

+1

@ A-ha, STL se usa a menudo como una manera informal de referirse a las partes "nuevas" de la biblioteca estándar. –

8

Una diferencia muy evidente es que en "viejo estilo" C++ verá muchos objetos creados manualmente con new y destruidas con delete. En C++ moderno, un objeto se crea en la pila siempre que sea posible, o al menos envuelto en algún tipo de puntero inteligente.

Otra diferencia es que el estilo antiguo de C++ se centra más en OOP, mientras que el moderno C++ usa una combinación de estilos de programación: procedural, modular, de objeto y genérico. Las funciones gratuitas se consideran buenas en el C++ moderno, mientras que se incluirían en alguna clase del viejo estilo C++.

Otras diferencias obvias incluyen el uso de constructos y bibliotecas que se convirtieron maduro y lo suficientemente estable como para ser utilizado en el código de producción: plantillas, excepciones, espacios de nombres, STL, etc.

+6

+1 No hay un solo 'eliminar' en nuestro producto principal. – Cubbi

+4

@Cubbi: Ah, pero ¿cuántos 'nuevos's? –

+0

@John Dibling: 624 'new's en este momento. – Cubbi

19

++ "Modern" C no tiene miedo de usar cualquiera o todas de las siguientes:

  • RAII
  • contenedores biblioteca estándar y algoritmos
  • plantillas
  • metaprogramación
  • excepciones
  • Boost

"viejo" C++ tiende a evitar estas cosas debido a una supuesta falta de apoyo del compilador o el rendimiento en tiempo de ejecución. En su lugar, se encuentra ...

  • un montón de new y delete
  • listas enlazadas para liar su propio y otras estructuras de datos
  • códigos de retorno como un mecanismo de gestión
  • uno de error los millones de clases de cadenas personalizadas que no son std::string

Al igual que con todos estos argumentos, existen ventajas para ambos enfoques. C++ moderno no es universalmente mejor. Los entornos integrados, por ejemplo, a menudo requieren restricciones adicionales que la mayoría de la gente nunca necesita, por lo que verá un montón de código antiguo allí. Sin embargo, en general, creo que encontrará que la mayoría de las características modernas valen la pena usarlas regularmente. La Ley de Moore y las mejoras en el compilador se han ocupado de la mayoría de las razones para evitar las cosas nuevas.

+1

Yo diría que * lamentablemente * C++ moderno no tiene miedo a las excepciones. No es que no me gusten las excepciones, es solo que las personas abusan de ellas ... –

+0

@Matthieu, lamentablemente hay más * programadores * que no les tienen miedo cuando deberían. ¿No dijo Raymond Chen (de Microsoft) que no es lo suficientemente inteligente como para usarlos? –

+2

Creo que lo hizo para sorprender :) Pero las excepciones introducen saltos en el código que dificultan seguir la ruta de ejecución, especialmente porque son saltos ocultos. Si se reserva a condiciones verdaderamente excepcionales, entonces no importa, pero si cualquier operador invocado puede fallar, entonces se encontrará con un mundo de daños (en cuanto al mantenimiento). He decidido (bastante recientemente) intentar y programar sin excepciones siempre que puedo. Después de todo, es normal que un método 'find' NO encuentre un resultado. –

6

Hay varias cosas en C++ que se consideran modernas.

En primer lugar, creo, es la extraordinaria aparición de las plantillas. No solo el STL en sí, sino también los usos menos "regulares" de las plantillas que han llevado al desarrollo de la meta-programación de plantillas. Tenga en cuenta, por ejemplo, la presencia de enable_if en la próxima versión del estándar.

Este es el rasgo más notable pienso en un movimiento entre C++ programador que tratan de hacer cumplir la corrección de la construcción:

  • prefieren los errores de compilación de tiempo de ejecución de errores> Plantillas/seguridad de tipos en lugar de puntos suspensivos/void*
  • uso Alcance Bound gestión de recursos (también conocido como RAII, pero un poco más explícito)

Esta investigación de alta calidad también ha llevado a un uso generalizado de:

  • la STL (algoritmos y estructuras de datos que se han probado a fondo, a pesar de que el TEL es bastante inseguro por diseño por desgracia)
  • las bibliotecas Boost (revisado por expertos programadores, casi libre de errores, altamente portátil)

la revisión de estas bibliotecas también demostrar que los programadores de C++ ya no tienen un complejo de inferioridad hacia los lenguajes orientados a objetos: ahora liberados de este complejo, no dudamos de mezclar diferentes paradigmas (OO, genérica, de procedimiento) para lograr nuestra Gol.

Con todo, creo que Modern C++ es más una mentalidad. Nosotros (programadores de C++) intentamos liberarnos del temido comportamiento indefinido que nos ha plagado durante tanto tiempo, y también tratamos de liberar a nuestros usuarios (definiendo interfaces que no lo permiten). También aceptamos el hecho de que otros han venido antes, y que reutilizar bibliotecas existentes NO es un signo de debilidad.

+1

lo que es aún más notable es que las plantillas nunca fueron pensadas para la forma en que se usan. No es como si Stroustrup se propusiera crear una sublenguaje turing completa que se ejecute en tiempo de compilación. –

+0

@Kristo: Estoy de acuerdo, se descubrió por accidente que formaban un lenguaje Turing Complete y todavía estoy descubriendo nuevos usos interesantes mensualmente (no solo: p Leo mucho). Lo que es aún más divertido es que introducen modismos de Programación Funcional en C++ debido a la inmutabilidad inherente de los tipos en C++ :) –

Cuestiones relacionadas