¿Por qué debería uno elegir C ++ sobre C aparte de la programación orientada a objetos?

C ++ es un lenguaje multiparadigm, lo que significa que admite modelos de programación además de procedimientos y objetos, incluida la programación genérica y la metaprogramación. Por lo tanto, si alguno de los otros paradigmas de C ++ le atrae, esa es una razón para favorecer C ++ sobre C.

C ++ también admite abstracciones de programación, como excepciones, operadores y sobrecarga de operadores, y funciones de lamba que no son particulares de un modelo de programación. Si estas características le atraen, esa es otra razón.

C ++ también proporciona la Biblioteca de plantillas estándar ( STL ), un conjunto de objetos en plantilla que permiten la programación genérica y orientada a objetos a través de clases y algoritmos de contenedor independientes del valor. Por ejemplo, hay colas y conjuntos de hash que pueden contener cualquier tipo y clasificaciones y búsquedas que pueden operar en cualquier contenedor. Si encuentra útil el STL, esa es otra razón más.

Finalmente, la razón más simple para favorecer C ++ sobre C es que es una C mejor que C: seguridad de tipo más estricta, requisitos de alias más estrictos, un modelo estandarizado de roscado y memoria, auto , uso fácil del patrón RAII, espacios de nombres (incluido el espacio de nombres anónimo) y desaprobación de funciones static ), sobrecarga de funciones y string .

No se equivoque, C ++ es un desastre gigante de lenguaje. Dicho esto, a menudo elijo C ++ sobre C con la advertencia de que prohíbo el uso de muchas características del lenguaje C ++. ¿Pero C ++ como una mejor C que C, quizás con el simple uso de objetos? Una victoria

Una pregunta no siempre es si este lenguaje es mejor que eso, pero ¿para qué tipo de aplicaciones es mejor ? Hay muchas áreas en las que C sería una mejor opción y hay muchas en las que C ++ sería una mejor opción.

En general, C tiene un sistema de tipo más simple y un modelo de memoria, que puede implementarse fácilmente en multitud de plataformas. Cuando apuntar a una nueva plataforma es importante para usted, lo más probable es que primero haya un compilador de C, antes de que haya un compilador de C ++, especialmente uno que cumpla con los estándares. Además, el compilador de C no intenta ser demasiado inteligente y no hace ninguna magia detrás de escena que no solicitó, por lo que si es importante que tenga el control de cómo se implementan exactamente las cosas, C es tu amigo. La magia es genial cuando sabes cómo funciona, pero cuando la aplicas sin rodeos sin tener la más mínima idea de lo que hace, y si es la poción adecuada para el trabajo, realmente obtienes de lo que Linus Torvalds se quejaba: http : //article.gmane.org/gmane.c

Desafortunadamente, debido a que C ++ es retrocompatible con C (en la medida de lo posible), muchas personas realmente no saben dónde termina C y comienza C ++. Las personas a menudo afirman que escriben el código K&R C, pero se permitirán usar comentarios de estilo BCPL (por ejemplo, // …, aceptado por el estándar C99 ahora), declarar variables en el medio del bloque, usar const como calificador de tipo, lanzar en algunos argumentos predeterminados sobre los parámetros de función, etc. Si alguna vez ha sido culpable de ellos, comience aquí: http://stroustrup.com/Programmin … Para ver realmente los beneficios de C ++ sobre C por sí mismo, debe intentar comprender qué no está en C y cómo lo compensa en su propio código. Si hay una función de lenguaje C ++ que compensa por usted en una sintaxis mucho más clara, seguridad de tipo más fuerte y mejor rendimiento, entonces C ++ es su amigo. Aquí hay algunos ejemplos:

  • Mientras trabaja en C, ¿se encuentra escribiendo macros que agregan tipos al nombre de funciones y estructuras de datos auxiliares, con el último entrando y saliendo del primero? Lo más probable es que las plantillas de C ++ hagan un trabajo mucho mejor para usted allí porque son de tipo seguro, no tendrán ninguna sobrecarga de rendimiento en comparación con su código y, a menudo, en realidad serán más rápidas que su C hecha a mano: clasificación en C ++ vs. C
  • ¿Incorpora muchos punteros de función en sus estructuras? ¿Los valores de estos punteros realmente difieren por objeto o difieren solo por clase? ¿Los extrae en una tabla compartida y mantiene un puntero dentro del objeto para ahorrar memoria? Bueno, también lo hace el compilador de C ++ en su implementación de funciones virtuales. También puede minimizar el número de tablas compartidas para usted y resulta que hay muchas alternativas a la mejor manera de implementarlas: http: //academic.research.microso

Personalmente, elijo C ++ sobre C o muchos otros lenguajes de programación, porque C ++ me da el poder de abstracción que no está disponible en ningún otro lugar. Lo que es más, me lo da con poca o ninguna sobrecarga de tiempo de ejecución, que es lo que realmente le importa a las personas con mentalidad de rendimiento. Claro, puedes dispararte en el pie mientras lo haces. Pero no todos tienen que hacerlo, mientras que todos pueden cosechar los beneficios una vez que alguien lo haya hecho. La gente ha implementado en C ++ como una biblioteca lo que se considera una prerrogativa de algunos lenguajes dedicados:

  • ¿Has oído hablar de las plantillas? Debido a ellos, Fortran estaba considerando agregar plantillas al lenguaje solo porque C ++ podía lograr en una biblioteca el rendimiento de lo que se consideraba el dominio del compilador Fortran: cálculos algebraicos altamente optimizados.
  • ¿O le gustaría que sus valores se anoten con cantidades físicas que representan y que el compilador verifique que no los mezcle de manera inapropiada? Implementable como una biblioteca en C ++, consulte Comprobación de dimensiones de cantidades físicas y las referencias en ese artículo, así como el Capítulo 32. Boost.Units 1.1.0.
  • ¿Necesita analizar un lenguaje desde su programa C ++? Entonces Spirit 2.5.2 – 1.52.0 es la biblioteca que necesita.
  • ¿O está cansado del patrón de diseño de visitante y le gustaría tener una declaración de cambio de tipo o incluso mejor, una coincidencia de patrones de estilo funcional completa disponible para sus programas de C ++? Bueno, pruebe nuestra Biblioteca Mach7, que es un prototipo completamente funcional y eficiente de una función de lenguaje con la que estamos experimentando.

Todos estos y muchos otros, como se ve por ejemplo en Boost 1.52.0 Library Documentation, son posibles en C ++ como biblioteca, y si ese tipo de poder te atrae, ¡C ++ es de lo que quieres aprender más! Juegue con él y vea qué más puede extraer de él, luego vea qué tipo de características del lenguaje harán que su biblioteca (así como otras) sea aún mejor, exprese su opinión a la Fundación Standard C ++ y con un poco de suerte y el apoyo de la comunidad de C ++ puede encontrar que en la próxima versión del estándar de C ++, su función y su biblioteca estarán disponibles para que todos los demás las usen.

Si te convencí de que C ++ es lo suficientemente diferente de C y quizás quieras aprender un poco más de lo que has escuchado de tu Java, OCaml, C #, Haskell, loving amigos, aquí hay algunos recursos útiles para considerar:

  • Bjarne Stroustrup. “Programación: Principios y práctica usando C ++” – un gran libro de texto sobre C ++ destinado a enseñar el lenguaje a los novatos. Está estructurado para ayudar a los estudiantes a comenzar a usar el idioma y especialmente su biblioteca estándar lo antes posible. Más temas técnicos sobre cómo implementar esas instalaciones estándar están cubiertos hacia el final del libro.
  • Bjarne Stroustrup. “El lenguaje de programación C ++, 4ª edición” – la próxima edición del texto estándar en C ++ por su autor. Esta edición se ha rediseñado significativamente para tener en cuenta y analizar las nuevas características del estándar C ++ 11.
  • Nicolai M. Josuttis. “The C ++ Standard Library: A Tutorial and Reference (2nd Edition)” – gran libro que analiza tanto las nuevas características del lenguaje como la nueva biblioteca estándar del estándar C ++ 11.
  • Página de inicio de Bjarne Stroustrup: tiene excelentes preguntas frecuentes sobre C ++, varias entrevistas con el autor, material de apoyo para sus libros, publicaciones en C ++, etc.
  • Standard C ++ Foundation: una organización sin fines de lucro con la misión de transmitir información actualizada sobre C ++ y poner a disposición bibliotecas estándar y comunitarias para desarrolladores de C ++ moderno. Está fundado y patrocinado por Microsoft, Google, Intel, IBM, HP, ARM, Pearson, Bloomberg, OpenMP, BD Software.
  • Sutter’s Mill – Herb Sutter’s, el famoso evangelista de C ++, blog sobre el lenguaje, su futuro y el estado del arte.
  • Bjarne Stroustrup. “El diseño y la evolución de C ++”: si desea saber qué dio forma a C ++ y qué decisiones determinaron el diseño del lenguaje, esta es una gran retrospectiva sobre por qué las cosas se implementaron de una manera y no de otra, por qué algunas no agregado al lenguaje, etc. El libro cubre el estado de C ++ hasta el estándar C ++ 98, con desarrollos más recientes discutidos en el documento HOPL-III “Evolucionando un lenguaje en y para el mundo real: C ++ 1991-2006” ( http://www.stroustrup.com/hopl-a …)
  • El Beacon de lenguajes de programación: una encuesta de algunas de las aplicaciones más grandes conocidas y los lenguajes de programación en los que se escribieron junto con algunos comentarios sobre por qué se eligió un idioma en particular.

El patrón RAII (ya mencionado) es el claro ganador de todas las razones aquí:
La adquisición de recursos es la inicialización
Básicamente, C ++ le permite definir destructores, que tienen una característica muy importante que no se encuentra en las construcciones de C: el compilador insertará por sí solo llamadas a destructores (de variables locales) siempre que sean necesarias.

¿Por qué es esto tan importante? Porque cada vez que escribe un código en C, debe recordar que debe liberar / cerrar / liberar cualquier objeto no trivial cada vez que desee salir del alcance actual (generalmente con una declaración de devolución). Esto hace que muchos códigos C sean muy engorrosos y propensos a errores (bastante horribles). Si desea abstraer las complejidades, se topa con un problema: debe ser consciente de que las cosas pueden fallar y debe limpiarse después de usted en cada uno de los casos.

¿Cómo se soluciona esto en C ++? Siempre que necesite “limpiar” algo, simplemente defina una clase para encapsular esa cosa (generalmente un recurso). Esto significa que en C ++ puede definir, por ejemplo, una clase de matriz sin tener que preocuparse cada vez por las asignaciones de memoria y la gestión manual de la misma.

Esto reduce el tamaño del código (haciéndolo más legible y simple), permite la encapsulación completa de conceptos (ya sea que necesiten recursos o no, lo que no se puede hacer en C), y permite que el programador pase su tiempo en problemas más complejos.

(Esta respuesta no implica que otras cosas buenas como plantillas, funciones virtuales y excepciones no sean importantes. Simplemente creo que esta es la más importante, y es una razón suficiente por sí misma)

Algunos motivos:

  • los contenedores STL y sus iteradores. Siempre terminará de desarrollar sus propios contenedores en C, por lo que también puede usar los estándares de C ++, ahorrar el esfuerzo y hacer que su código sea más legible para el lector casual;
  • puede usar constructores para inicializar estructuras correcta y automáticamente;
  • RAII. Hace que su código de administración de recursos sea mucho más simple y claro;
  • función de sobrecarga. Es bastante útil para iniciar sesión y descargar sin usar macros.

C ++ es un superconjunto de C. Puede poner el código C a través de un compilador de C ++, sin embargo, ayuda a ajustar su código C al declarar todas las funciones y variables globales de antemano, y limpiar sus estructuras y etiquetas de estructura, entonces puede aprovechar de la mejor comprobación en tiempo de compilación que puede hacer el compilador de C ++.

Una vez que haya hecho que su código C sea compatible con un compilador de C ++, tendrá muchas nuevas funciones de lenguaje disponibles. Si no usa ninguno de ellos, estará produciendo más o menos código C. Puede evitar las funciones adicionales por razones de desconocimiento (lo cual es una excusa poco convincente), o porque cree que son menos eficientes (lo que a menudo no es cierto, dependiendo de las funciones a las que se refiera).

He visto el código C para decodificadores / codificadores JPG y PNG escritos de modo que parezca la salida de un front-end C ++ para un compilador de C. Y sin embargo, no creo que en realidad provenga de un front-end. Creo que fue escrito de esa manera a mano. Pero qué terrible pérdida de tiempo cuando el compilador podría estar ayudando y la cantidad de código a escribir podría reducirse. Para ser generoso, tal vez se hizo con sufragio, sabiendo que los usuarios de dicho código fuente abierto pueden requerir el código C.

He conocido a quienes tienen una objeción ideológica o estética a C ++. Me parece que me han lavado el cerebro desde que nací, pero por favor, tómalo con sinceridad, no estoy tratando de molestar. Lo que quiero decir es que la decisión de no usar C ++ podría no ser completamente racional. Pero las prioridades comerciales pueden poner fin a tal indulgencia.

Como mencionó, los POO son una característica sólida para optar por C ++. Pero también hay muchas otras razones.

Programación genérica a través de plantillas. En lugar de crear diferentes funciones para manejar diferentes tipos de entradas para la misma función, podemos usar plantillas para manejar varios tipos de datos.

El manejo de excepciones nos permite manejar excepciones con facilidad, en lugar del comportamiento predeterminado de terminación. Podemos crear mensajes de error personalizados para cada caso.

STL. Esta es una característica principal que hizo de C ++ lo que es hoy. En lugar de codificar sus propias estructuras de datos o algoritmos, use lo que ya está disponible con STL. Dado que admiten plantillas, podemos usar tipos de datos de nuestra propia elección.

La respuesta es tan simple como esta: C es el lenguaje del microprocesador, por lo tanto, si necesita hacer alguna programación integrada para las instrucciones del microprocesador / microcontrolador que debe seguir para que baile y haga lo que necesita que haga, su única opción es C, eso es todo. Comienza con un IDE e integra bibliotecas de funciones de C y todo se orquesta hasta el código de ensamblaje cuando se compila. Utiliza un programador, llamado Programador en circuito e inyecta su código en su memoria flash y el pequeño procesador ejecuta el código.

C ++ es el lenguaje de la computadora. Si necesita escribir una aplicación que involucre la pantalla, tal vez use la E / S de la computadora y tal vez el USB, ejecute algunos cálculos, recopile y analice y almacene datos, entonces debe usar algo como Microsoft Studio Visual C ++ para obtener trabajo hecho. También podría usar C #, me parece un poco más fácil de usar y entender, pero ese soy yo.

Cuando en Roma haga lo que hacen los romanos. No les hables francés.

Varias características
La palabra reservada “const”, que le permite crear constantes depurables y parámetros de entrada reales, que no pueden modificarse accidentalmente.
Funciones en línea, puedes deshacerte de esas feas funciones macro.
Valores de referencia, en lugar de punteros, se pueden evitar algunas de las excepciones de puntero NULL.

Linus tenía una queja interesante sobre este tema que me vino a la mente cuando vi esta pregunta.

http://article.gmane.org/gmane.c

haz de eso lo que quieras.

En primer lugar, casi todos los programas C válidos son también programas C ++ válidos. Entonces, al elegir C ++, no estás obligado a renunciar a C.

En segundo lugar, cualquier cosa que pueda hacer en C, puede hacerlo mucho más fácilmente en C ++ con algo de sobrecarga (en términos de tamaño y / o rendimiento) que es “mínima” (los diseñadores del lenguaje C ++ aplican esto con bastante rigidez). Por ejemplo, no tiene que preocuparse por la administración de la memoria porque puede escribir programas completos sin usar new y delete. En resumen, puede centrarse más directamente en resolver un problema de programación porque el conjunto de herramientas en forma de biblioteca estándar de C ++, especialmente después de C ++ 11, es bastante completo.

En esos raros casos en los que cada caída de rendimiento / tamaño es crítica, sin duda es mejor cambiar a C o ensamblar, y esta es la práctica normal también.

Bibliotecas de terceros: el código C ++ se puede vincular con bibliotecas C, pero no al revés.

El STL es muy útil.

Porque C ++ es simplemente mejor C.