5 votes

Qu'est-ce que je peux m'attendre comme différence lorsque je passe de C & C# à C++?

Voici une question simple.

J'ai fait beaucoup de travail en utilisant à la fois C et C# (2.0) mais jamais rien en C++. À quoi dois-je m'attendre de différent en apprenant le C++? Y aura-t-il des grosses difficultés ou des obstacles auxquels je devrais faire attention? Est-ce que quelqu'un a de bonnes recommandations de livre/site web pour un cours intensif sur l'apprentissage du C++ pour le programmeur expérimenté?

15voto

jalf Points 142628

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. :)

9voto

Gant Points 9920

Voici quelques-uns de mon point de vue :

  • Les pointeurs jouent un grand rôle en C++. Alors qu'en C#, vous n'avez que des types de référence. Et vous risquez d'avoir mal à la tête à cause des erreurs de pointeur.
  • Vous devez également gérer l'allocation de mémoire manuellement. Et il y a une chance que votre programme connaisse des fuites de mémoire si cela n'est pas fait correctement. En C#, chaque objet est collecté par le garbage, automatiquement.
  • Les déclarations et les définitions des classes sont généralement séparées dans un fichier d'en-tête (.h) et un fichier source (.cpp ou .cc). Cela causera un peu de confusion au début.
  • Vous n'aurez pas autant de support de bibliothèque de classes de base en C++ qu'en C#. Par exemple, vous n'aurez pas de classe HttpRequest intégrée en C++.
  • Par conséquent, vous devrez utiliser beaucoup de bibliothèques externes et savoir comment gérer les fichiers .dll ou .lib.
  • C++ n'a pas d'Interface comme en C#. Vous utiliserez plutôt une classe abstraite (et l'héritage multiple).
  • En C++, la chaîne de caractères est un tableau de caractères ou un pointeur de caractères.
  • Il existe des algorithmes et des structures de données disponibles pour une utilisation dans la Standard Template Library (STL). Mais il faut du temps pour apprendre avant de pouvoir commencer à l'utiliser efficacement :)

Vous pouvez également apprendre C++/CLI pour mélanger votre code .NET et du C++ natif pour tirer le meilleur parti des deux mondes.

4voto

user35978 Points 1187

Je suggère fortement : "Effective C++ et More effective C++". Et si vous y êtes, "Effective STL" pourrait également être utile :)

Ces livres ont été écrits particulièrement pour les programmeurs intelligents qui ont besoin de maîtriser efficacement le C++. Je témoigne que Effective C++ a été celui qui m'a le plus aidé lorsque j'ai débuté en C++ !

Un autre bon livre pour les débutants en C++ (mais je ne pense pas pour les débutants en informatique) est "Accelerated C++". Il met l'accent principalement sur le bon codage, les STL, et la production de code de haut niveau au lieu de se concentrer sur les détails (qui sont couverts davantage à la fin du livre).

Bonne chance :)

3voto

Robert Gould Points 29406

Eh bien, j'utilise le C++ depuis plus de 10 ans maintenant, donc ma réponse serait d'apprendre la gestion stricte de la mémoire, les modèles C++, la STL, puis Boost. Cela devrait vous prendre quelques mois, puis les détails techniques vous prendront disons 5 ans :)

En ce qui concerne les livres, j'aime Exceptional C++ et More Exceptional C++ de Herb Sutter

2voto

biozinc Points 2760

Hmmm... Un dur. Si vous êtes à l'aise avec .NET et les pointeurs, il ne devrait pas y avoir grand chose de nouveau.

Je pense que travailler avec les fichiers d'en-tête C++ sera une expérience. Il y a aussi le STL C++ avec lequel vous devrez vous familiariser.

Vous pourriez aussi avoir à faire face à des critiques de la part de certaines personnes concernant des choses comme l'Héritage Multiple.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X