Étant donné que C ++ '11 a été approuvé, cela change-t-il comment un débutant C ++ apprend le langage? [fermé]

21

Je voulais apprendre le C ++ depuis un certain temps et j'ai suivi la programmation informatique AP au lycée (à l'époque où c'était C ++ et non Java). J'apprécie le C et je n'ai tout simplement pas trouvé le temps d'apprendre le C ++ ou je retomberai simplement sur C # où je suis beaucoup plus productif.

Ma question est la suivante: étant donné que C ++ '11 a été approuvé (bien que je ne sache pas entièrement implémenté), cela change-t-il la façon dont je devrais aborder l'apprentissage du C ++? Je possède C ++: la référence complète de Herb Schildt datant de 1998. La nouvelle norme approuvée rend-elle l'apprentissage de ces livres moins important que certains des nouveaux didacticiels / livres qui contiennent des éléments de la norme? Y a-t-il un avantage à apprendre des livres plus anciens?

Jetti
la source
9
Oof. Schildt. Je ne peux pas parler de la qualité de ses matériaux C ++, mais ses matériaux C étaient sous-standards depuis longtemps (même la dernière édition de C: TCR a encore quelques erreurs non triviales). Je recommanderais de chercher une œuvre plus récente d'un autre auteur.
John Bode
C ++ 11 n'a pas changé les bases de C ++ qui doivent être apprises pour faire tout ce qui a été introduit dans la dernière révision et qui n'existe pas dans une version précédente de C ++.
Ramhound
11
Ne faites jamais confiance à un livre de Herb Schildt. Vraiment, alors que la majorité des livres C ++ là-bas sont de mauvais livres (et je ne parle pas ici de problèmes stylistiques, mais d'erreurs factuelles flagrantes et de la promotion de styles de programmation bien connus pour conduire à du code bogué), les livres de Schildt ont été extrêmement mauvais, son nom est devenu un peu un mème.
sbi
4
@Ramhound: Je ne suis pas d'accord. Si c'était vrai, nous apprendrions tous d'abord la gestion manuelle des ressources, puis seulement des moyens plus sûrs de créer des ressources dynamiques. Heureusement, cela change (lentement). De nouvelles possibilités, même si elles ne sont "que" dans la bibliothèque, appellent de nouveaux idiomes. Si vous commencez avec une langue, pourquoi apprendre d'abord des idiomes plus anciens, pour ensuite les désapprendre plus tard?
sbi

Réponses:

16

Absolument. Ces jours-ci, trois choses qui sont généralement dans la leçon 2 devraient bouger beaucoup, beaucoup plus tard:

  • chaînes sous forme de tableaux de char *, les méthodes strlen, strxxx, etc.
  • tableaux en général et arithmétique des pointeurs
  • supprimez ce que vous nouvelles, supprimez [] ce que vous nouvelles [] et même les destructeurs

Ces choses qui sont habituellement dans la leçon 99 devraient bouger beaucoup plus tôt

  • modèles que choses à utiliser (écrire, pas tellement)
  • std :: string
  • std :: shared_ptr <>
  • std :: vector <>, itérateurs, autres collections

Chaque pointeur brut devrait être immédiatement donné à un wrapper de pointeur intelligent (je commencerais par partagé et considérerais unique plus tard car il nécessite d'expliquer les références std :: move et rvalue). Faire cela fera que l'apprentissage du C ++ ressemble beaucoup à l'apprentissage de Java ou C #, où vous apprenez la bibliothèque en même temps que le langage. Cela enlèvera également beaucoup de travail de mémoire et laissera les gens moins inquiets à propos des pièges.

Je voudrais également intégrer des lambdas dans l'image la première fois que nous voulions parcourir une collection et faire quelque chose pour chaque élément.

Avertissement: j'écris actuellement un cours C ++ pour Pluralsight et j'utilise cette approche. Le dernier module est «comprendre le code des autres» et c'est là que je mettrai les trucs déroutants comme les chaînes char *, la gestion manuelle de la mémoire, l'arithmétique des pointeurs, etc.

Mise à jour: quelques personnes ont demandé pourquoi l'existence de C ++ 0x inspire l'enseignement de choses qui auraient pu être enseignées avec C ++ 03. Je pense que c'est un certain nombre de choses:

  • les pointeurs vraiment intelligents, qui sont conviviaux pour la collection, éliminent le besoin de choses comme "un tableau de pointeurs employés" qui nous obligeait à toujours recourir à nouveau / supprimer, à l'arithmétique des pointeurs, etc.
  • auto enlève la douleur des déclarations de l'itérateur
  • lambdas font foreaching quelque chose qu'une personne ordinaire ferait
  • même quelque chose d'aussi trivial que d'analyser >>correctement élimine le piège qui serait là lors de la déclaration de certains modèles de modèles
  • etc

À mon avis, il y a des choses que nous aurions pu changer dans la façon dont nous enseignions le C ++ il y a quelque temps, mais certains d'entre nous se sont retenus parce que nous avions encore besoin de la méthode old-school pour un repli ou parce que l'enseigner impliquait juste beaucoup des connaissances arcaniques.

Kate Gregory
la source
3
Pourquoi pensez-vous que la gestion manuelle de la mémoire devrait être enseignée plus tard? Je pense qu'il est important de savoir et cela donne plus d'appréciation lors de l'apprentissage des pointeurs intelligents. J'ai dû apprendre la gestion de la mémoire (et les tableaux de caractères) en C et cela m'a fait apprécier RAII et std :: string beaucoup plus que je ne le ferais si je n'avais pas eu à le faire.
Jetti
1
Vos exemples s'appliquent principalement au C ++ 98 par rapport au C ++ pré-standard, pas au C ++ 03 par rapport à C ++ 11. Je suppose que donné lambda, std::for_each()sera beaucoup plus populaire qu'il ne l'était, autosera très important, et la nouvelle syntaxe de déclaration de fonction (en conjonction avec decltype) deviendra beaucoup utilisée dans le code du modèle. Ce sont des choses qu'aucun livre C ++ actuel n'enseigne. Mais, oui, en général je suis d'accord avec vous ( +1). Quand j'ai commencé à donner des cours C ++, j'ai commencé avec Accelerated C ++ , et même si mon cours a commencé à en dévier de plus en plus, il reste fidèle au principe sous-jacent.
sbi
3
@Jetti: Je fais rarement de la gestion manuelle des ressources, et si je le fais, c'est pour implémenter des classes RAII. Je, cependant, utilise beaucoup de ces classes. Selon cela, l' utilisation des trucs RAII semble plus importante que le traitement des ressources brutes et devrait donc être enseignée plus tôt, avec plus d'accent.
sbi
1
@sbi: Je dois être d'accord avec vous là-dessus - la plupart de ces exemples ressemblent à Modern C ++ 101 de 2006, rien de nouveau à propos de C ++ 11.
DeadMG
2
@Jetti: L'étape la plus importante vers la maîtrise du C ++ est d'apprendre toutes les façons d' éviter la gestion manuelle de la mémoire. C'est absolument quelque chose qui devrait être enseigné "plus tard", une fois que vous avez appris jusqu'où vous pouvez passer par la gestion de mémoire "automatique".
2011
9

À peu près, oui. Le simple fait est qu'en C ++ 98 et 03, de nombreuses bonnes pratiques étaient fondamentalement inutilisables en raison de la mauvaise qualité du support du langage, par exemple pour la programmation fonctionnelle. Maintenant que les lambdas existent et fonctionnent, les gens ont tendance à accepter les interfaces fonctionnelles beaucoup mieux qu'auparavant, et la programmation générique est encore plus forte qu'auparavant.

En 1998, les gens commençaient à peine à découvrir comment écrire du code de haute qualité, sûr et rapide en utilisant C ++, et beaucoup de code était «C était des classes». En C ++ 11, c'est très différent - des idiomes comme copier et échanger et la règle de trois (maintenant cinq) sont bien connus et définis, et beaucoup plus de types de gestion des ressources sont devenus standard, comme shared_ptret unique_ptroù les normes précédentes les laissaient simplement comme des trous béants.

Vous pouvez consulter cette question pour une excellente liste de documents de référence sur C ++.

DeadMG
la source
1
En fait, je mettrais le début de la fin du "C avec les classes" quelques années plus tôt que 1998, mais en général, vous avez certainement raison, et je ne marchanderais pas plus d'une demi-décennie. +1de moi.
sbi
4

Je ne connais pas le livre spécifique que vous mentionnez. Mais en général, vous pouvez dire que toutes les bases de la syntaxe C ++, des types de données et de la POO sont toujours vraies. Il en va de même pour les bibliothèques STL qui sont mentionnées dans la plupart des livres pour débutants.

Bien qu'un livre aussi vieux que 1998 ait manqué quelques mises à jour et développements dans le style de programmation C ++, qui se sont accumulés dans la communauté au fil des ans. Je chercherais des ressources un peu plus à jour. Il existe plus qu'assez de tutoriels et de documents en ligne gratuits qui devraient vous fournir un bon départ. Certains d'entre eux peuvent même mentionner C ++ 0x.

C ++ 0x va certainement changer beaucoup de choses sur la façon dont les programmeurs verront et utiliseront le langage à l'avenir. Mais cela influencerait des projets plus complexes où les nouvelles fonctionnalités commencent à avoir un sens. Pour un débutant, cela n'a pas d'importance et vous pouvez vous concentrer sur la mise à l'aise avec les concepts existants, c'est déjà suffisant pour apprendre. La plupart des livres pour débutants ne vont pas très loin dans les modèles par exemple, donc les nouveaux modèles variadic ne sont pas ce que vous devez savoir maintenant.

Peut-être jetez un œil à une liste de changements . Au moins quelques concepts comme la plage basée sur les boucles apparaîtront très probablement dans les nouveaux tutoriels même pour les débutants. Il vaut donc la peine d'y jeter un œil.

thorsten müller
la source
Merci! Connaissez-vous des ressources décentes en ligne ou des livres?
Jetti
2
Non, le site cplusplus est souvent mentionné comme une ressource qui ne devrait jamais, jamais être référée à quelqu'un que vous souhaiteriez réellement écrire du bon code.
DeadMG
@DeadMG Avez-vous un autre site Web?
TheLQ
@TheLQ: Vous iriez plus loin avec la référence MSDN, ou cprogramming.com.
DeadMG
@Jetti: Je ne connais aucun matériel pour utiliser C ++ 11 pour enseigner le C ++. Tout ce que j'ai vu enseigne C ++ 11 en plus de C ++ 03. Pour en savoir plus sur ce dernier, voir stackoverflow.com/questions/388242/… .
sbi
3

Bien sûr, en ce qui concerne tout ce qui concerne la technologie, être à jour avec les derniers matériaux est toujours une décision intelligente, cependant, les changements introduits dans C ++ 11 sont conçus pour ne pas secouer le bateau. Si vous êtes nouveau en C ++ (ou en programmation en général), ce n'est pas quelque chose qui m'inquiète.

De plus, si vous êtes un programmeur professionnel, vous pouvez parier que vous travaillerez sur le code de quelqu'un d'autre à l'avenir, il est donc toujours utile de comprendre le fonctionnement des choses, même s'il s'agit d'une technique dépréciée dans la pratique.

Leo
la source
Merci pour votre réponse, j'ai pensé que cela m'aiderait au moins à consulter l'ancien code lors de l'utilisation d'une ancienne ressource.
Jetti
Comment lambda, autoet l'exécution d'une fonction asynchrone pourraient-ils faire autre chose que "secouer le bateau"?
sbi
1
Je dirais qu'il y a une distinction entre l'introduction de nouveaux outils et un large changement dans la philosophie de conception (comme nous le voyons avec PHP, par exemple)
leo
1
@leo: Je ne suis pas d'accord. L'introduction de la STL, des pointeurs intelligents et des fonctionnalités de modèles riches a totalement changé la philosophie de conception traditionnelle de C ++. Presque chaque bibliothèque de boost est totalement différente de votre bibliothèque C ++ moyenne des années 90.
sbi