C ++ pour les développeurs C #

24

Je connais assez bien C # (autodidacte, malheureusement) et j'ai besoin de faire de la programmation C ++ pour une application Windows. J'ai pu trouver une tonne d'informations pour les développeurs C ++ apprenant le C # mais je n'ai pas pu trouver grand-chose sur l'apprentissage du C ++ alors que vous connaissez déjà le C #. Quelqu'un at-il rencontré un bon aperçu des bases?

MSDN a une comparaison mais elle n'est pas très approfondie.

Je peux rassembler plusieurs sources mais j'ai pensé qu'il y avait quelque chose - je ne le trouve pas. Merci de votre aide.

Mark Williams
la source
27
Pourquoi "tristement"? Ne te rabaisse pas comme ça. Je ne connais pas de développeur C # qui ne soit pas autodidacte. Beaucoup d'entre eux sont des développeurs incroyables .
Steven Evers
6
@SnOrfus - principalement parce que le monde universitaire l'évite pour des raisons pseudo-politiques irrationnelles.
Rei Miyasaka
5
Mon premier conseil est de ne pas essayer d'apprendre le C ++ dans le contexte de C #. Parce que C # n'est pas C ++ et C ++ n'est pas C #. Cela peut être une déclaration stupide à faire, mais C # rend difficile de mal faire les pointeurs, et il est très facile de les faire mal en C ++, même avec les outils qui le rendent vraiment facile. J'ajouterais qu'il y a beaucoup de choses que les deux langues partagent en commun. C'est comme dire qu'une pomme et une orange sont toutes deux cultivées sur un arbre et ont des graines et donc ce sont des fruits.
Ramhound
2
@ReiMiyasaka, un peu comme les développeurs C # regardent VB .NET.
Kyralessa
1
@ Kyralessa Ce qui est également un peu malheureux. Je pense que ce n'est pas tant un problème politique que de la condescendance envers le groupe démographique VB.NET - car la plupart des premiers utilisateurs de C # ont une formation en C / C ++. Mon école a cependant utilisé VB.NET pour les cours pour débutants. Ils semblent penser que VB.NET est un jouet, et ne devrait donc pas être aussi corrompu dans l'esprit des étudiants que C #.
Rei Miyasaka

Réponses:

10

Ce fil sur C ++ pour les développeurs Java est très similaire et devrait être utile, en particulier le post de Mark Byer:

Lisez ces livres:

La chose la plus importante à garder à l'esprit est probablement de comprendre la différence dans les techniques de gestion de la mémoire entre C # / Java et C ++ .

Un de mes profs était issu de Java et a enseigné un cours d'introduction C ++ en pensant que ce serait du gâteau. Rien de ce qu'il a expliqué n'avait de sens pour personne. Il avait eu des fuites de mémoire partout. Son arithmétique de pointeur était terrible. Il n'est jamais entré dans la partie POO du programme (Dieu merci). Rien de ce qu'il a démontré n'aurait compilé. Il ne comprenait pas qu'il char[]fallait une sentinelle \0. Ne finissez pas comme lui.

Rei Miyasaka
la source
4
Dommage que personne en C ++ n'utilise char[]alors , n'est-ce pas?
DeadMG
5
@DeadMG Je ne vois pas très bien votre point. Le fait qu'il char[]soit rarement utilisé en C ++ ne signifie pas qu'il n'est pas enseigné ou qu'il ne devrait pas l'être. char[]est toujours important d'être conscient parce que C ++ est un surensemble de C, et il est impératif qu'il soit bien compris s'il doit être appris.
Rei Miyasaka
7
Oui, très très, très longtemps après avoir maîtrisé tous les autres aspects de la langue. Je préfère enseigner aux nouveaux étudiants les spécialisations de modèles partiels et SFINAE. En C ++, vous utilisez std::string, et si vous devez interagir avec une API C, c'est à cela que c_str()sert. Il n'y a aucun besoin pour le programmeur de gérer char[]ou de résiliation NULL dans tout cela. La gestion des chaînes de style C est complètement et totalement et totalement déconseillée pour chaque utilisation possible, sauf l'interopérabilité avec l'ancien code C, qui est parfaitement bien géré par c_str().
DeadMG
4
Il n'y a pas de bien enseigner char[], car toutes les utilisations de char[]sont fausses. Votre professeur aurait probablement été très bien s'il s'était contenté de C ++ au lieu de C.
DeadMG
4
Vous allez voir le code C utilisé en C ++ si vous écrivez C ou non vous - même, et par conséquent, si vous apprenez C ++, vous devez apprendre C. Comme je l' ai dit, je ne cautionne, mais le fait de la est que les écoles enseignent généralement C puis amure sur C ++ plus tard, parce que les élèves ont besoin d'apprendre des choses comme la conception OS - qui, à l' exclusion BeOS et certains systèmes d' exploitation de la recherche, tout à fait exigent C. pour cela, vous avez besoin de comprendre les chaînes C. Encore une fois, pour la troisième fois, si je le pouvais, je n'enseignerais pas du tout le C ++ aux étudiants de première année, et pour la dernière fois, c'est complètement autre chose.
Rei Miyasaka
14

Malheureusement, il n'y a pas grand-chose sur le C ++ qui est basique, donc je ne mettrais pas vos espoirs au clair. De plus, vous savez peu de choses sur C # qui est même transférable à distance en C ++, donc je ne m'attendrais pas à ce qu'il existe un matériau spécifique couvrant cet angle. Vous devrez apprendre de zéro.

DeadMG
la source
3
Cela expliquerait pourquoi il n'y a pas grand-chose là-bas. Après avoir lu C ++, il semblerait que vous ayez raison - c'est un monde totalement différent. Merci de votre aide.
Mark Williams
1
+1, il y a peu de choses que vous savez sur C # qui est même transférable à distance en C ++ . J'ai appris ça à la dure.
ApprenticeHacker
En bref, je dirais qu'il y a beaucoup de C ++ qui est basique. Distinguer les pointeurs / références et les modèles C ++ peut vous faire tourner la tête au début, mais en fin de compte, il y a encore des classes coutet des moyens simples pour atteindre des objectifs simples
Kieren Johnstone
1
@KierenJohnstone: Vous voulez probablement dire "des façons lentes et non sûres de faire les choses" comme "la décroissance du tableau vers le pointeur" et de telles choses.
DeadMG
12
Belle réponse complètement inutile.
dbracey
9

Il n'y a pas de solution facile pour cela, C ++ n'est pas particulièrement difficile, mais ce n'est pas facile pour les débutants.

Je recommanderais de lire les bases de la programmation C (pour obtenir une mise à la terre des trucs de bas niveau que vous trouverez), puis d'apprendre la STL, suivi d'articles par des gens comme Scott Meyers. En voici un pour vous aider à démarrer, car il montre comment vous devriez écrire du C ++ moderne, par rapport au C-with-classes.

gbjbaanb
la source
2
+1: J'ajouterais obtenir les livres de Meyer (série C ++ / STL efficace). Je les ai tous et ils sont géniaux.
Steven Evers
12
-1 pour reading up on C programming. Je pense que cela fait plus de mal que de bien et confirme l'idée que le C et le C ++ sont des langages qui doivent être étudiés ensemble.
sebastiangeiger
2
@sebastiangeiger: vous manquez le point que lorsque vous devez travailler avec des applications C ++ réelles, vous devrez le plus souvent traiter avec des constructions de type C. D'où +1, au moins pour éliminer votre downvote.
Doc Brown
5
@DocBrown Peut-être, mais je suis actuellement sur l'un de ces projets hérités C ++ et je peux dire que mes prédécesseurs n'étaient en grande partie que des programmeurs C qui avaient enregistré leurs fichiers source au format * .cpp. J'ai trouvé que j'utilisais beaucoup moinsdelete et les tableaux C et d'autres choses qui sont découragés en C ++ qu'ils ne l'ont fait, ce que j'attribue à NE PAS étudier explicitement C.C est relativement simple, vous pouvez comprendre assez rapidement ce que fait le code.
sebastiangeiger
3
@gbjaanb: Il n'y a rien du tout dans la STL qui nécessite de connaître mallocet free. Un grand développeur C ++ voudra éventuellement les connaître. Commencer par eux est une tout autre chose.
DeadMG
7

Je ne sais pas si vous êtes toujours à la recherche de matériel, j'ai trouvé cet article il y a quelques mois. Ce n'est pas un livre (seulement 53 pages). L'introduction dit tout:

This is a somewhat short guide to the important things to know if you are a C# programmer and find yourself needing or wanting to work in C++

http://geekswithblogs.net/mikebmcl/archive/2012/02/02/c-to-c-ndash-a-somewhat-short-guide.aspx

Et il y a aussi un article de mise à jour:

http://geekswithblogs.net/mikebmcl/archive/2012/02/14/c-to-cndasha-somewhat-short-guide-update-1.aspx

Bon apprentissage :)

Chris
la source
Soyez très prudent lorsque vous utilisez ce document, il montre le C ++ de manière très centrée sur Microsoft (il le dit également). Il ne fait pas de différence entre les fonctionnalités C ++ 03 et C ++ 11 et montre même parfois des extensions non standard comme solution préférée. Vous vous retrouverez avec un code hautement transférable si vous suivez ce guide.
Fabio Fracassi
4
  • Faites attention à la gestion de la mémoire. Obtenez une idée claire du fonctionnement des pointeurs et des références en C ++ contrairement à C #. En outre, RAII, enfin la gestion manuelle de la mémoire et les pointeurs intelligents.
  • Les modèles et les génériques se ressemblent mais sont des bêtes différentes. Apprenez à connaître le fonctionnement des modèles.
  • Il existe des différences syntaxiques minuscules mais accrocheuses. Apprenez-les.
  • Vous vous êtes habitué à STL au lieu de .net BCL. Vous allez peut-être manquer de bons morceaux si vous avez une dépendance à LINQ.
  • Il existe des différences de conception fondamentales entre C ++ et C #. Donc, vous ne pouvez pas simplement porter une idée. Tout ce que vous construisez avec C ++, vous devez le concevoir à partir de zéro.
  • Bonne chance
Gulshan
la source
1

Je pense qu'il est bon que vous ne trouviez pas trop de tutoriels C # vers C ++. Ils peuvent probablement embrouiller votre cerveau. C'est un peu comme essayer d'apprendre à conduire une moto d'abord, puis passer à un vélo (ce n'est pas une anologie tout à fait appropriée, mais vous avez l'idée). Il vaut mieux pour vous prendre un nouveau livre sur C ++. Étant donné que vous connaissez déjà les concepts de POO, vous pouvez ignorer les longues introductions aux concepts de POO (ils sont destinés aux personnes migrant de C vers C ++). Ou allez directement pour un livre de référence destiné aux niveaux débutant à intermédiaire ou intermédiaire.

DPD
la source
1

Je recommanderais d'aller à Rosetta Code et de comparer les deux. Pendant que vous y êtes, gardez à portée de main un lien d'idiomes C ++ et essayez de les repérer. Ensuite, passez du temps sur le domaine pointeur / référence / mémoire / destructeur. Après cela, apprenez-en plus sur le préprocesseur - cela peut vraiment être votre ami quand il s'agit de cacher les moches, ça me manque un peu. Enfin, la STL.

marque
la source
1

Il y a environ un an, j'étais dans le même bateau que vous: c # dev autodidacte qui ressentait le besoin d'apprendre le C ++. Certes, je me suis arrêté et j'ai recommencé plusieurs fois. À ma troisième tentative, j'ai finalement réussi.

Ce qui est impératif à comprendre, c'est qu'en termes de méthodologies C ++ et C #, vous passerez probablement beaucoup de temps à comprendre ce que les méthodes de manipulation de données par le biais de pointeurs et de références signifient réellement , ainsi que quand et comment les utiliser dans les circonstances.

La bonne chose à propos de C ++ est que l'allocation de pile d'objets est assez simple pour la plupart, et vous devez allouer les objets de cette façon si votre programme répond aux exigences spécifiées dans cette méthode. Sinon, vous comptez sur des pointeurs pour la vitesse, l'efficacité et le nettoyage rapide. Je recommande de lire ceci: http://www.parashift.com/c++-faq-lite/ car cela vous donnera beaucoup de connaissances techniques sur le fonctionnement de C ++ sous le capot.

Laisse moi te donner un exemple:

En C ++, il existe cette implémentation de constructeur connue sous le nom de "liste d'initialisation", qui diffère de l'initialisation des membres de classe dans le corps d'un constructeur. Pourquoi? Parce qu'à moins que le type en cours d'initialisation ne soit primitif, le compilateur créera en fait plusieurs copies inutiles de l'objet en cours de création lorsqu'il est alloué dans le corps du ctor. Cela peut potentiellement réduire les performances, selon le compilateur ainsi que les exigences évolutives de l'application.

Vous savez ce qu'est un délégué? Eh bien, en C ++, il est connu comme un pointeur de fonction . Cette langue est assez difficile à maîtriser au début, mais si vous voulez être génial ... c'est définitivement requis.

C # est facile ... très facile.

à propos de blanc
la source
Les délégués C # et les pointeurs de fonction c sont très différents. Un délégué est plus proche d'un foncteur en C ++ que d'un pointeur de fonction.
CodesInChaos
-2

Croyez-moi, choisissez un bon livre sur C ++ (il y en a beaucoup plus, faites juste une recherche) et commencez à apprendre ...

Muhammad Hewedy
la source
1
BTW, apprendre quelques C avant (pointeurs, tableaux, struct) sera bon
Muhammad Hewedy
7
Apprendre le C avant le C ++ vous replongera dans l'âge de pierre. De nos jours, nous utilisons très rarement des tableaux et des pointeurs en C ++. La langue s'est éloignée d'eux depuis longtemps.
fredoverflow
7
@Muhammad: Tout le monde préfère la vitesse, la sécurité et la facilité d'entretien.
DeadMG
3
@DPD: Eh bien, de nombreux programmeurs C ++ professionnels, dont Bjarne Stroustrup (l'inventeur du langage), ne sont pas d'accord avec vous. Son dernier livre enseigne l'utilisation d'objets et de modèles depuis le début, alors que les tableaux et les pointeurs ne sont pas du tout évoqués avant le chapitre 17 (page 500 et quelque chose).
fredoverflow
2
@DeadMG. Peut-être, mais vous ne pouvez pas inverser l'évolution C-> C ++. Si vous détestez la partie C de C ++, optez pour Java ou C #. Personnellement, j'ai trouvé que me concentrer sur les pointeurs et les tableaux en C avant d'aller en C ++ m'a beaucoup aidé dans ma carrière. Bien sûr, vous pouvez coder une application entière sans eux, mais si vous voulez les avantages du polymorphisme, vous devez connaître les pointeurs. Combien de modèles importants du GoF peuvent être mis en œuvre sans pointeurs? Ce n'était pas la même chose pour mes amis qui évitaient les parties "dures" lors de l'étude de C. La plupart d'entre eux avaient du mal à comprendre le polymorphisme.
DPD