La principale différence à laquelle je peux penser est que C++ est beaucoup plus un langage multi-paradigme que C et C#. En C#, la POO est toujours le paradigme. C'est un langage orienté objet avant tout, et si vous ne faites pas de POO, la communauté C# vous dira que vous vous trompez. (bien que C# ait ajouté un assez bon support pour quelques éléments de la programmation fonctionnelle ces dernières années).
En C++, la POO est, eh bien, elle est supportée et vous pouvez l'utiliser quand vous le voulez, mais tout le remue-ménage se fait autour de la programmation générique. Les modèles C++ permettent une large gamme de bibliothèques intelligentes, réutilisables et génériques, et atteignent de nombreux des mêmes objectifs que la POO traditionnelle, mais sans les grandes hiérarchies d'héritage et avec pratiquement aucun couplage entre les classes. La bibliothèque standard contient de nombreux exemples de cela
En C++, bon nombre des constructions C, bien que toujours légales, sont généralement évitées:
- Pointeurs bruts (généralement remplacés par des pointeurs intelligents tels que
boost::shared_ptr
ou std::auto_ptr
, ou par des références
- Allocations de mémoire dans le code utilisateur (devraient généralement être encapsulées dans un pointeur intelligent, ou dans un objet RAII personnalisé)
- Pointeurs de fonctions (généralement remplacés par des foncteurs, pour une meilleure sécurité de type et des performances)
- goto (Souvent utilisé en C pour sauter à du code de nettoyage. Encore une fois, rendu inutile par le RAII)
- le préprocesseur (pratiquement jamais nécessaire. Préférer les modèles)
Évidemment, il y a des exceptions à chacun de ces points, mais en règle générale, le code C++, contrairement au code C, éliminera pratiquement toute utilisation de ceux-ci.
Et plus qu'en C#, les classes sont des travailleurs acharnés qui font tout le gros du travail. En C#, une classe n'est guère plus qu'un peu d'échafaudage, un conteneur pour y placer toutes vos méthodes. Bien sûr, elle a un constructeur, et elle peut implémenter Dispose(); mais C++ va beaucoup plus loin, et vous avez:
- Le constructeur (tout comme en C#, qui initialise la classe à partir de zéro)
- Le constructeur de copie (initialise une classe comme une copie d'un autre objet)
- L'opérateur d'affectation (parce que les classes sont ce que C# considérerait comme des types de valeur. Ainsi, l'affectation ne se contente pas de changer une référence, mais de copier toutes les données de l'objet, de manière définie par l'utilisateur)
- Le destructeur
Le destructeur est probablement le concept le plus important en C++. Il est essentiel pour le RAII, qui est la gestion de la mémoire ou d'autres ressources, car il est automatiquement appelé lorsque un objet sort de portée. Cela permet à vos classes de garantir de nombreuses choses qu'il est impossible d'atteindre en C ou en C#. Par exemple, boost::thread fournit des verrous localisés qui sont garantis d'être libérés lorsqu'ils sortent de portée, que la fonction renvoie normalement, qu'une exception soit levée, ou autre. Donc en utilisant cette bibliothèque, l'utilisateur n'a pas à se soucier de libérer des verrous ou d'autres ressources. Cela se fait automatiquement, dès que vous en avez terminé avec eux.
En un sens, cela vous donne beaucoup plus de crochets pour personnaliser le comportement de votre classe. Contrairement à en C#, vous contrôlez exactement ce qui se passe quand une simple affectation est exécutée. Vous contrôlez ce qui se passe quand la classe sort de portée, quand elle est initialisée à partir de zéro ou comme une copie d'un autre objet. Cela permet à une classe bien écrite d'être presque impossible à utiliser incorrectement. (Presque)
Outre cela, les modèles et la méta-programmation par modèles sont des concepts auxquels vous allez probablement être confrontés. Ce sont des outils extrêmement puissants, alors assurez-vous d'être en bons termes avec eux. :)