Quelles sont les différences fondamentales entre C et C ++? [fermé]

41

Beaucoup ont tendance à écrire "C / C ++", comme si c'était la même chose. Bien qu'ils partagent de nombreuses similitudes, ils ne sont clairement pas les mêmes.

Mais quelles sont réellement les différences fondamentales entre C et C ++? C ++ est-il une version améliorée de C ou existe-t-il des fonctionnalités qui n'existent pas en C ++?

Gablin
la source
2
Je pensais que C ++ est un super ensemble de C
utilisateur
1
C ++ n'est pas amélioré ... c'est un sur-ensemble de C ..
Joe DF
2
@JoeDF C'était au tout début mais c'est en fait "compatible avec C" maintenant, ce qui ne veut pas dire la même chose du tout. Vous ne codez pas en C en C ++ et tous les standards C ne sont pas compatibles avec le C ++ standard.
Klaim
+1 Tu as raison, il y a maintenant des frères ou des cousins. Si tu vois ce que je veux dire.
Joe DF

Réponses:

43

Les points suivants concernent le C ++:

  1. Système de types statiques (défini par l'utilisateur): permet des vérifications statiques sur vos données et leur utilisation - pointe beaucoup d'erreurs faciles à exécuter en C.
  2. multi-"paradigme": permet de travailler comme en C, avec des paradigmes orientés objet, avec des paradigmes génériques, etc.
  3. Constructeur / Destructeur: le seul moyen de dire une fois ce qu'il faut faire lors de la création ou de la destruction de quelque chose et de s'assurer que l'utilisateur n'aura pas à trouver la bonne fonction et à l'utiliser comme en C.
  4. RAII (mal nommé): vous ne devez pas toujours gérer la mémoire. Gardez simplement les choses à portée et utilisez des pointeurs intelligents décrivant la durée de vie de vos objets. Vous pouvez toujours utiliser des pointeurs bruts.
  5. Modèles: mieux qu'une macro, un vrai langage pour manipuler et générer des types avant la compilation finale. Il ne manque qu'un système de type (voir Concepts dans les futurs standards C ++).
  6. Surcharge d’opérateurs: permet de décrire les opérations d’une manière syntaxique simple et même de définir des langages spécifiques au domaine incorporés dans votre code C ++.
  7. Noms étendus: les espaces de noms, classes / structures, fonctions, etc. ont des règles simples pour éviter les conflits de noms .
  8. Système d'exception: un moyen de propager des erreurs qui est souvent meilleur que le code de retour. En fait, les codes de retour sont utiles pour les erreurs logiques spécifiques à un domaine, car l'application doit les gérer. Les exceptions sont utilisées pour les erreurs "difficiles", ce qui rend le code suivant tout simplement incorrect. Cela permet de capturer les erreurs plus haut dans la pile d'appels si possible, de réagir à une telle exception (en se connectant ou en corrigeant l'état) et avec RAII, s'il est bien utilisé, le programme ne se trompe pas - s'il est bien exécuté à nouveau.
  9. La bibliothèque standard: C a la sienne, mais tout est "dynamique". La bibliothèque standard C ++ est presque (pas des flux IO) composée de modèles (conteneurs et algorithmes) qui permettent de générer du code uniquement pour ce que vous utilisez. Mieux: comme le compilateur doit générer du code, il en saura beaucoup sur le contexte et appliquera heureusement de nombreuses optimisations sans avoir à demander au codeur d’obscurcir son code - grâce à des modèles, etc.
  10. const-correctness: Le meilleur moyen de vous assurer que vous ne modifiez pas les variables que vous ne devriez pas. Permet de spécifier un accès en lecture seule à varaibles. Et comme il n’est vérifié qu’au moment de la compilation, il n’ya pas de coût d’exécution.
Klaim
la source
31

C ++ a été inventé pour gérer une complexité que C ne pouvait pas gérer. Par exemple, un problème courant avec C était que vous pouviez "manquer de noms pour les variables" (à ne pas prendre au pied de la lettre bien sûr) car il n'y avait pas d'encapsulation, d'espaces de noms, etc.

De plus, C n’a pas d’exception, la gestion des erreurs est donc très sujette aux erreurs, car il incombe à l’utilisateur de la bibliothèque de toujours vérifier les valeurs de retour des fonctions, alors qu’à part des exceptions, le développeur de la bibliothèque lève simplement une exception garantissant l’arrêt du flux du programme.

C ++ aide en ayant le constructeur init objets qui est automatiquement appelé par le compilateur. Contrairement aux structures C qui doivent être initialisées par le programmeur (d'où une autre zone sujette aux erreurs).

Enfin, il existe de nombreux avantages présentés par OOP, tels que la réutilisation d’objets, ainsi que les concepts génériques basés sur la programmation, tels que les modèles et les génériques qui vous permettent de réutiliser le code source, etc.

Et beaucoup d'autres choses qui prendraient trop de mon temps à énumérer ici.

Jas
la source
J'aime que vous écriviez à propos du constructeur C ++ vs des structures C, et que cela cause des erreurs. Je suis d'accord avec ça. Mais je n'aime pas la façon dont Java utilise ceci dans JavaBeans, qui utilise toujours un constructeur vide et définit ensuite les champs membres avec des setters. De mon point de vue, c'est aussi sujet aux erreurs que les structures C. Je préférerais définir mes objets Java uniquement avec le constructeur. Voir ma question sur StackOverflow à ce sujet.
Jonas
Vous avez quelque chose à dire là-dessus, mais ma réponse était centrée sur le C vs C ++.
Jas
1
Oh, allez, qui vous empêche d'utiliser la POO avec C? Vous pouvez réutiliser des objets et tout faire, même des exceptions. Il existe même un livre à ce sujet, intitulé OOP programming in C.
2
@Vlad, rien de ce dont vous parlez n'était une option il y a 25 ans.
Jas
4
Vous POUVEZ faire de la POO dans presque tous les langages de programmation encore utilisés, mais cela ne signifie pas que le langage a été conçu pour cela. Prenez Lua par exemple. Bien qu’il permette techniquement la POO, il semble y avoir une cinquantaine de façons différentes de le faire, ce qui cause beaucoup de maux de tête.
mardi
15

En général, tout ce qui existe en C est supporté en C ++. Évidemment, le contraire est absolument faux.

En termes simples, C ++ est orienté objet (ainsi, par exemple, vous avez des classes), C ne l’est pas.

C ++ a un type booléen que C89 n'a pas.

Ce sont des langues différentes. Ils partagent juste la plupart de la syntaxe.

Federico Klez Culloca
la source
4
C99 a un type booléen (nommé _Bool, avec boolcomme alias).
Jerry Coffin
1
Ce n'est pas strictement vrai. Par exemple, C99 a le long longtype de données qui ne fait pas (encore) partie d'ISO C ++.
Chinmay Kanchi
11
Err ... C ++ n'est pas seulement orienté objet: vous pouvez utiliser des paradigmes orientés objet avec C ++ car le langage fournit des fonctionnalités pour cela, mais il fournit également des fonctionnalités pour d'autres paradigmes. Vous devriez mentionner que c'est vraiment important, ça change tout. Si ce n'était pas le cas, nous aurions tous
opté
4
Il existe de nombreuses constructions en C qui ne fonctionnent pas en C ++.
1
@klez: oui - mais c'est toujours faux. Si ANSI avait initialement développé C89 (qui n’avait pas de type booléen), le nouveau développement est maintenant effectué par ISO et ANSI accepte la norme ISO. La norme ANSI C actuelle est donc identique à la norme ISO C actuelle (qui un type booléen).
Jerry Coffin
8

C99 a quelques fonctionnalités qui n'existent pas (du moins sous exactement la même forme) en C ++ (par exemple, membres de tableau flexibles, tableaux de longueur variable, etc.)

C99 a également ajouté beaucoup à la bibliothèque qui n'était pas présente dans la norme C ++ 98/03; la plupart de cela a été ajouté à C ++ 11 cependant.

En termes d'orientation de base, C prend en charge essentiellement une programmation procédurale structurée. C ++ supporte cela ainsi que la programmation orientée objet, la programmation générique et la métaprogrammation (réalisation de calculs arbitraires au moment de la compilation). Avec C ++ 11, il ajoute quelques éléments qui pourraient au moins être confondus avec la prise en charge de la programmation fonctionnelle (par exemple, les expressions lambda). C ++ 14 en a ajouté un peu plus, mais la plupart d’entre eux sont vraiment plus pratiques que tout changement majeur d’orientation.

Jerry Coffin
la source
1

Personnellement, je pense que les modèles sont la fonctionnalité la plus importante que C ++ ajoute à C.

zvrba
la source
1
Euh, qu'en est-il des classes avec l'héritage? C'est un travail vraiment difficile en C, alors que beaucoup de modèles peuvent être réalisés avec des macros de pré-processeur.
JBRWilkinson
4
Les macros de préprocesseur ne sont pas adaptées au type; c'est une substitution textuelle pure, ce qui rend également le débogage plus difficile. Obtenir des classes de base et l'héritage ne nécessite pas beaucoup de travail en langage C. +, vous devez créer votre propre modèle de métaobjet au lieu de vous en tenir à ce que le concepteur de langage a choisi pour vous. Voir, par exemple, cet article: arxiv.org/abs/1003.2547
zvrba
2
Mon vote serait destructeur pour la caractéristique la plus importante que C ++ a sur C (même sur les constructeurs en raison de leurs incroyables capacités de nettoyage).
Thomas Eding
@zvrba #define GENERATE_INTERFACE(T) T T##_func(T x);; (type) safe surcharge / templates en C. Je suis d'accord avec Thomas sur le fait que les destructeurs sont une caractéristique beaucoup plus importante que C manque. Mais les destructeurs cachent souvent un code important. Les espaces de noms (scope) sont à mon avis les plus importants.
Octobre 2016