¿Cuáles son las diferencias fundamentales entre C y C ++? [cerrado]

41

Muchos tienden a escribir "C / C ++", como si fueran lo mismo. Aunque comparten muchas similitudes, claramente no son lo mismo.

Pero, ¿cuáles son realmente las diferencias fundamentales entre C y C ++? ¿Es C ++ una versión mejorada de C, o hay características en C que no existen en C ++?

gablin
fuente
2
Pensé que C ++ es un superconjunto de C
usuario
1
C ++ no está mejorado ... es un superconjunto de C ..
Joe DF
2
@JoeDF Fue al principio, pero en realidad es "compatible con C" ahora, lo que no significa lo mismo en absoluto. No codifica en C en C ++ y no todo C estándar es compatible con C ++ estándar.
Klaim
+1 Tienes razón, ahora hay como hermanos o primos. Si sabes a lo que me refiero.
Joe DF

Respuestas:

43

Los siguientes puntos se relacionan con C ++:

  1. sistema de tipo estático (definido por el usuario): permite verificaciones estáticas sobre sus datos y su uso; señala muchos errores fáciles de hacer en C.
  2. multi- "paradigma": permite trabajar como en C, con paradigmas orientados a objetos, con paradigmas genéricos, etc.
  3. Constructor / Destructor: la única forma de decir una vez qué hacer al crear o destruir algo y asegurarse de que el usuario no tendrá que encontrar la función correcta y usarla como en C.
  4. RAII (mal nombrado): no tiene que administrar siempre la memoria. Simplemente mantenga las cosas dentro del alcance y use punteros inteligentes que describan la vida útil de sus objetos. Todavía puede usar punteros crudos.
  5. Plantillas: mejor que macro, un lenguaje real para manipular y generar tipos antes de la compilación final. Solo carece de un sistema de tipos (consulte Conceptos en futuros estándares de C ++).
  6. Sobrecargas del operador: permite describir operaciones de una manera sintáctica simple e incluso definir lenguajes integrados de dominio específicos dentro de su código C ++.
  7. Los nombres de ámbito: espacios de nombres, clases / estructura, funciones, etc. tienen reglas simples para asegurarse de que los nombres no entren en conflicto.
  8. Sistema de excepción: una forma de propagar errores que a menudo es mejor que el código de retorno. De hecho, el código de retorno es bueno para errores lógicos específicos del dominio, porque la aplicación tiene que administrarlo. Se usan excepciones para errores "duros", cosas que hacen que el siguiente código sea incorrecto. Si es posible, permite detectar errores más altos en la pila de llamadas, reaccionar ante tal excepción (iniciando sesión o arreglando el estado) y con RAII, si se usa bien, no hace que todo el programa se equivoque, si se hace bien, nuevamente.
  9. La Biblioteca estándar: C tiene la suya, pero es toda "dinámica". La biblioteca estándar de C ++ está casi (no secuencias de E / S) hecha de plantillas (contenedores y algoritmos) que permiten generar código solo para lo que usa. Mejor: como el compilador tiene que generar código, sabrá mucho sobre el contexto y aplicará felizmente muchas optimizaciones sin tener que requerir que el codificador ofusque su código, gracias a las plantillas y otras cosas.
  10. const-correctness: la mejor manera de asegurarse de no cambiar las variables que no debería. Permite especificar el acceso de solo lectura a las variables. Y solo se verifica en tiempo de compilación para que no haya costo de tiempo de ejecución.
Klaim
fuente
31

C ++ se inventó para gestionar la complejidad que C no podía manejar. Por ejemplo, un problema común con C era que podía "quedarse sin nombres para las variables" (no se debe tomar literalmente, por supuesto) porque no había encapsulación, espacios de nombres, etc.

Además, C no tiene excepciones, por lo tanto, el manejo de errores es muy propenso a errores, ya que depende del usuario de la biblioteca que siempre verifique los valores de retorno de las funciones, mientras que con excepciones, el desarrollador de la biblioteca simplemente lanza una excepción que garantiza que el flujo del programa se detendrá.

C ++ ayuda al tener el constructor init objetos que el compilador llama automáticamente. A diferencia de las estructuras C que deben ser inicializadas por el programador (de ahí otra área propensa a errores).

Por último, hay muchas otras ventajas promocionadas por OOP, como la reutilización de objetos y los conceptos basados ​​en programación genérica, como plantillas y genéricos que le permiten reutilizar el código fuente, etc.

Y muchas otras cosas que tomarían demasiado de mi tiempo para enumerarlas aquí.

Jas
fuente
Me gusta que escribas sobre el constructor de C ++ frente a las estructuras de C, y que sea propenso a errores. Estoy de acuerdo con eso. Pero no me gusta la forma Java de usar esto en JavaBeans, que siempre usa un constructor vacío y luego establece los campos miembros con setters. En mi punto de vista, eso es tan propenso a errores como las estructuras C. Preferiría configurar mis objetos Java solo con el constructor. Vea mi pregunta en StackOverflow sobre esto.
Jonas
Tienes un punto allí, pero el enfoque de mi respuesta aquí fue C vs. C ++.
Jas
1
Oh, vamos, ¿quién te impide usar OOP con C? Puede reutilizar objetos y hacer cualquier cosa, incluso excepciones. Incluso hay un libro al respecto, llamado programación OOP en C.
2
@Vlad, nada de lo que estás hablando era una opción hace 25 años.
Jas
44
PUEDE hacer POO en casi todos los lenguajes de programación que todavía están en uso, pero eso no significa que el lenguaje fue diseñado para ello. Tome Lua por ejemplo. Si bien técnicamente permite la POO, parece que hay alrededor de cincuenta formas diferentes de hacerlo, una causa de mucho dolor de cabeza.
tyjkenn
15

En general, todo lo que existe en C es compatible con C ++. Obviamente lo contrario es absolutamente falso.

Simplemente hablando, C ++ está orientado a objetos (entonces, por ejemplo, tienes clases), C no.

C ++ tiene un tipo booleano que C89 no tiene.

Son idiomas diferentes. Simplemente comparten la mayor parte de la sintaxis.

Federico klez Culloca
fuente
44
C99 tiene un tipo booleano (llamado _Bool, con boolun alias).
Jerry Coffin
1
Esto no es estrictamente cierto. Por ejemplo, C99 tiene el long longtipo de datos que (todavía) no forma parte de ISO C ++.
Chinmay Kanchi
11
Err ... C ++ no solo está orientado a objetos: puede usar paradigmas orientados a objetos con C ++ porque el lenguaje proporciona características para eso, sino que también proporciona características para otros paradigmas. Deberías mencionar que, es realmente importante, cambia todo. Si no fuera así, todos tendríamos que
cambiarnos
44
Hay muchas construcciones en C que no funcionan en C ++.
1
@klez: sí, pero todavía está mal. Si bien ANSI desarrolló originalmente C89 (que no tenía un tipo booleano), el nuevo desarrollo ahora lo realiza ISO, y ANSI acepta el estándar ISO, por lo que el estándar ANSI C actual es idéntico al estándar ISO C actual (que sí tiene un tipo booleano).
Jerry Coffin el
8

C99 tiene algunas características que no existen (al menos exactamente en la misma forma) en C ++ (por ejemplo, miembros de matriz flexible, matrices de longitud variable, etc.)

C99 también agregó mucho a la biblioteca que no está presente en el estándar C ++ 98/03; Sin embargo, la mayor parte de esto se ha agregado a C ++ 11.

En términos de orientación básica, C básicamente admite programación de procedimientos estructurados. C ++ admite eso, así como la programación orientada a objetos, la programación genérica y la metaprogramación (realización de cómputos arbitrarios en tiempo de compilación). Con C ++ 11, agrega algunos bits y piezas que al menos podrían confundirse también con el soporte de programación funcional (por ejemplo, expresiones lambda). C ++ 14 ha agregado algunos más, pero la mayoría de ellos son realmente más convenientes que cualquier tipo de cambio importante en la orientación.

Jerry Coffin
fuente
1

Personalmente, creo que las plantillas son la característica más importante que C ++ agrega a C.

zvrba
fuente
1
Er, ¿qué tal las clases con herencia? Eso es realmente un trabajo duro en C, mientras que muchas plantillas se pueden hacer con preprocesadores Macros.
JBRWilkinson el
44
Las macros de preprocesador no son de tipo seguro; es pura sustitución textual, lo que también dificulta la depuración. Obtener clases básicas y herencia para trabajar no es mucho trabajo en C. + puedes hacer tu propio modelo de metaobjetos en lugar de quedarte atascado con lo que el diseñador de idiomas eligió para ti. Ver, por ejemplo, este artículo: arxiv.org/abs/1003.2547
zvrba el
2
Mi voto sería destructores de la característica más importante que C ++ tiene sobre C (incluso sobre constructores debido a sus increíbles capacidades de limpieza).
Thomas Eding
@zvrba #define GENERATE_INTERFACE(T) T T##_func(T x);; (tipo) sobrecarga / plantillas seguras en C. Estoy de acuerdo con Thomas en que los destructores son una característica mucho más importante que falta en C. Pero los destructores a menudo ocultan código importante. Los espacios de nombres (alcance) son, en mi opinión, los más importantes.
YoYoYonnY