web-dev-qa-db-fra.com

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

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 vraiment 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 en C qui n'existent pas en C++?

41
gablin

Les points suivants concernent C++:

  1. (défini par l'utilisateur) système de type statique: permet des vérifications statiques de vos données et de leur utilisation - signale de nombreuses erreurs faciles à faire en C.
  2. multi- "paradigm": permet de travailler comme en C, avec des paradigmes orientés objet, avec des paradigmes génériques etc.
  3. Constructor/Destructor: la seule façon de dire une fois quoi faire lors de la création ou de la destruction de quelque chose et être sûr que l'utilisateur n'aura pas à trouver la bonne fonction et à l'utiliser comme en C.
  4. RAII (mal nommé): vous n'avez 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. Templates: mieux que la 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 futures normes C++).
  6. Opérateur surcharges: 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 embarqués dans votre code C++.
  7. Noms étendus: les espaces de noms, classes/struct, fonctions, etc. ont des règles simples pour s'assurer que les noms ne s'affrontent pas.
  8. Système d'exception: un moyen de propager les erreurs qui est souvent meilleur que le code retour. En fait, le code retour est bon pour les erreurs logiques spécifiques au domaine, car l'application doit le gérer. Les exceptions sont utilisées pour les erreurs "dures", des choses qui rendent le code suivant juste incorrect. Il permet de détecter les erreurs plus haut dans la pile d'appels si possible, de réagir à une telle exception (en se connectant ou en fixant l'état) et avec RAII, s'il est bien utilisé, il ne rend pas tout le programme incorrect - s'il est bien fait, encore une fois.
  9. La bibliothèque standard: C a la sienne, mais tout est "dynamique". La bibliothèque standard C++ est presque (pas IO streams) faite 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 savoir beaucoup sur le contexte et appliquer rapidement beaucoup d'optimisations sans avoir à demander au codeur d'obscurcir son code - grâce aux modèles et à d'autres choses.
  10. const-correctness: La meilleure façon de vous assurer que vous ne changez pas les variables que vous ne devriez pas. Permet de spécifier un accès en lecture seule aux variables. Et il n'est vérifié qu'au moment de la compilation, il n'y a donc aucun coût d'exécution.
43
Klaim

C++ a été inventé pour gérer la complexité que C ne pouvait pas gérer. Par exemple, un problème commun avec C était que vous pouviez "manquer de noms pour les variables" (à ne pas prendre à 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'exceptions, donc la gestion des erreurs est très sujette aux erreurs, car cela dépend de l'utilisateur de la bibliothèque de toujours vérifier les valeurs de retour des fonctions, tandis qu'avec les exceptions, le développeur de la bibliothèque lève simplement une exception qui garantit que le flux du programme sera arrêté.

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, la POO offre de nombreux autres avantages, tels que la réutilisation des 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.

31
Jas

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

Pour parler simplement, C++ est orienté objet (donc, par exemple, vous avez des classes), C ne l'est pas.

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

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

15

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

C99 a également ajouté beaucoup à la bibliothèque qui n'est pas présente dans la norme C++ 98/03; la plupart de ces éléments ont cependant été ajoutés à C++ 11.

En termes d'orientation de base, C prend essentiellement en charge la programmation procédurale structurée. C++ prend en charge cela ainsi que la programmation orientée objet, la programmation générique et la métaprogrammation (exécution de calculs arbitraires au moment de la compilation). Avec C++ 11, il ajoute quelques morceaux qui pourraient au moins être confondus avec le support de la programmation fonctionnelle (par exemple, les expressions lambda). C++ 14 en a ajouté quelques autres, mais la plupart d'entre eux sont vraiment plus pratiques que toute sorte de changement d'orientation majeur.

8
Jerry Coffin

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

1
zvrba