C ++ succinctement Introduction

introduction

C ++ Succinctly a été écrit pour aider les développeurs professionnels C # à apprendre la programmation C ++ moderne. Le but de ce livre est d’exploiter votre connaissance C # existante afin d’élargir vos compétences. Que vous ayez besoin d'utiliser C ++ dans un projet à venir ou simplement d'apprendre un nouveau langage (ou de vous en familiariser de nouveau), ce livre vous aidera à apprendre tous les éléments fondamentaux du C ++ afin que vous puissiez comprendre les projets et les exemples écrits en C ++. et commencez à écrire vos propres programmes C ++.

Comme pour tout sujet volumineux, il n’était tout simplement pas possible de tout couvrir (par exemple, les nouvelles fonctionnalités atomiques ajoutées en C ++ 11), et d’autres auraient peut-être décidé de classer les sujets différemment. Je pense en particulier aux pointeurs, un sujet que je traite en profondeur plus loin dans le livre. Ils sont importants, de sorte que certains auraient peut-être choisi de les couvrir plus tôt, mais j'estime que vous n'avez pas besoin de comprendre les indicateurs pour comprendre le contenu qui précède leur couverture; comprendre les sujets précédents vous aidera beaucoup à les comprendre.

J'ai fait de mon mieux pour être aussi précis que possible sans ressembler à une spécification de langue ou à un fichier de documentation. J'espère avoir réussi. J'ai souvent consulté la spécification du langage C ++ 11 lors de l'écriture de ce texte et j'ai également tout lu, des publications StackOverflow aux documents MSDN, aux documents GCC et au-delà. Il y a des domaines où j'ai volontairement simplifié les choses. À mesure que vous approfondissez votre connaissance du C ++, vous parviendrez sans aucun doute à résoudre les problèmes qui nécessiteront une compréhension plus complète afin d'atteindre votre objectif ou d'éliminer un bogue. Si la lecture de ce livre apporte suffisamment de connaissances et une bonne idée de la langue que vous êtes capable de reconnaître, de diagnostiquer et de résoudre ces problèmes, je serai heureux de réussir à atteindre mes objectifs. Bienvenue en C++!


Marques, etc..

En tant qu'avocat à la retraite, je me sens obligé d'inclure cette brève section, qui ne vous intéresse probablement que si vous êtes avocat pour l'une de ces sociétés ou organisations. Le reste de cette préface est une lecture beaucoup plus agréable pour les non-avocats, alors s'il vous plaît ne laissez pas cela vous décourager. Microsoft®, Visual Studio®, Visual C ++®, Visual C #®, Windows®, Windows NT®, Win32®, MSDN®, Silverlight®, DirectX® et IntelliSense® sont des marques déposées de Microsoft Corporation. GNU® est une marque déposée de la Free Software Foundation. ISO® est une marque de service déposée de l'Organisation internationale de normalisation. IEC® est une marque de service déposée de International Engineering Consortium, Inc. Unicode® est une marque de service déposée de Unicode, Inc. (a.k.a. Le Consortium Unicode). Intel® est une marque déposée de Intel Corporation. Les autres marques commerciales et marques de service appartiennent à leurs propriétaires respectifs..


Point d'entrée du programme

En C #, le point d’entrée d’un programme est une méthode statique nommée Principale. Souvent, vous ne le verrez pas réellement puisque différents frameworks fournissent leur propre (par exemple, Silverlight), mais il est là, quelque part, car sans cela, le système d'exploitation ne saurait pas par où commencer l'exécution de votre programme..

Le point d’entrée d’un programme C ++ est le principale une fonction. Une version simple ressemble à ceci:

int main (int argc, char * argv []) // Votre programme commence ici. // Renvoyer 0 signifie succès. retourne 0; 

Les paramètres sont le nombre d'arguments suivi d'un tableau d'arguments de ligne de commande (sous forme de chaînes). Dans la programmation Windows, vous verrez souvent ceci comme le point d’entrée:

int wmain (int argc, wchar_t * argv []) // Votre programme commence ici. // Renvoyer 0 signifie succès. retourne 0; 

Ce wmain le point d’entrée est spécifique à Microsoft. Il est utilisé comme point d'entrée pour les programmes Windows Unicode (par opposition aux programmes plus anciens ASCII / page de code). Les systèmes d'exploitation Microsoft prenant en charge le codage Unicode (à partir de Windows 2000 et Windows NT 4, et même des systèmes Windows 9X lorsque vous installez un module complémentaire spécial) utilisent le codage UTF-16. En tant que tel, vous devriez toujours utiliser Unicode lors de l'écriture de vos programmes, sauf si vous devez absolument prendre en charge des systèmes plus anciens qui ne prennent pas en charge Unicode..

Vous verrez souvent cela aussi comme le point d’entrée des programmes Windows:

#comprendre  int _tmain (int argc, _TCHAR * argv []) // Votre programme commence ici. // Renvoyer 0 signifie succès. retourne 0; 

Le SDK Windows fournit les tchar.h fichier d'en-tête, que vous pouvez (et devriez) utiliser lorsque vous devez créer un projet qui sera utilisé à la fois sur les versions Unicode et non Unicode de Windows. Je ne l'utilise pas dans les échantillons car, dans la mesure du possible, je souhaitais rendre les échantillons portables et conformes aux normes..

Au lieu de cela, j'ai écrit un petit fichier d'en-tête, pchar.h, ce qui simplifie le problème de la portabilité du point d’entrée. Cela ne résout pas la plupart des problèmes de portabilité rencontrés lors de l'utilisation de chaînes. malheureusement, la portabilité des chaînes est un domaine qui n’est tout simplement pas simple en C ++. En effet, mon fichier d'en-tête ici est ne pas un bon exemple de ce qu'il faut faire lorsque vous avez réellement besoin des arguments de ligne de commande. Nous discuterons des chaînes de manière beaucoup plus détaillée plus tard dans le livre. Pour l'instant, voici le fichier d'en-tête:

Échantillon: pchar.h

#pragma une fois #if! défini (_PCHAR_H) #define _PCHAR_H 1 #if défini (WIN32) && défini (UNICODE) #define _pmain wmain #define _pchar wchar_t #else #define _pmain main #define _pchar char #endif #endif

Deuxièmement, voici à quoi ressemble le point d'entrée (j'ai omis l'inclusion du fichier d'en-tête ici):

int _pmain (int / * argc * /, _pchar * / * argv * / []) // Votre programme commence ici. // Renvoyer 0 signifie succès. retourne 0; 

Comme vous pouvez le constater, les noms de paramètre sont commentés (à l’aide du commentaire de style C, c.-à-d.. / *… * /). Ceci est parfaitement légal en C ++ et vous devriez le faire chaque fois que vous avez une fonction qui doit avoir certains paramètres, bien que vous ne souhaitiez peut-être pas utiliser ces paramètres. En commentant les noms de paramètres, vous vous assurez que vous ne les utiliserez pas accidentellement.

Le code en pchar.h nous donne un point d'entrée raisonnablement portable, tandis que le int _pmain (int, _pchar * []) Le point d’entrée lui-même garantit que nous n’utiliserons jamais les arguments de ligne de commande passés. Si vous avez besoin des arguments de ligne de commande, cette solution ne fonctionnera pas. Vous aurez besoin d'une solution plus avancée et plus complexe..


Arguments et paramètres

J'utilise les termes argument et paramètre à différents moments de ce livre. Pour moi, un argument est une valeur qui est transmise à une fonction lorsqu'elle est appelée dans un programme, alors qu'un paramètre fait partie de la spécification d'une fonction qui indique au programmeur que la fonction s'attend à recevoir une valeur d'un certain type. Il indique également au programmeur comment il peut traiter cette valeur. Un paramètre fournit généralement un nom avec lequel cette valeur peut être référencée, bien que C ++ nous permette de ne fournir qu'un type si nous devons avoir un paramètre particulier (par exemple, pour correspondre à une spécification d'interface), mais n'entend pas utiliser réellement sa valeur..

Comme exemple de paramètre et d’argument, en C #, vous pouvez utiliser une méthode de classe telle que void AddTwoNumbers (int a, int b, ref int result) result = a + b; . Dans ce cas, une, b, et résultat sont des paramètres; nous savons que AddTwoNumbers pourrait changer la valeur de l'argument passé pour le résultat paramètre (comme, en effet, il fait). Si vous avez appelé cette méthode, int un = 1, deux = 2, réponse = 0; someClass.AddTwoNumbers (un, deux, réponse réf); puis un, deux, et réponse seraient tous des arguments passés à AddTwoNumbers.


Mise en évidence de la syntaxe

Les exemples de code de ce livre utilisent les couleurs de Visual Studio 2012 Ultimate RC mettant en surbrillance la syntaxe. Cela vous aidera à comprendre le code, mais vous pourrez également lire ceci sur un lecteur de livre électronique monochrome..


Des échantillons

Les exemples de ce livre sont disponibles à l'adresse https://bitbucket.org/syncfusion/cpp_succinctly.

Les exemples de ce livre ont été conçus et développés à l'aide de Visual Studio 2012 Ultimate RC. Le compilateur C ++ fourni avec VS 2012 inclut de nouvelles fonctionnalités de la norme de langage C ++ 11 non incluses dans Visual Studio 2010. À l’automne 2012, Microsoft lancera une version gratuite "Express" de Visual Studio 2012, qui autoriser les développeurs à utiliser des applications bureautiques ciblées C ++ (telles que l'application console utilisée par les exemples). Jusque-là, pour utiliser pleinement les exemples, vous aurez besoin d’une version non Express de Visual Studio 2012..

J'ai testé de nombreux exemples en utilisant Minimalist GNU for Windows (MinGW), il devrait donc y avoir beaucoup de portabilité entre les compilateurs. Le seul exemple que je connaisse qui ne fonctionne pas comme écrit avec le compilateur GCC fourni par MinGW est StorageDurationSample. Il utilise l'extension de langue spécifique à Microsoft _declspec (thread) afin de simuler thread_local espace de rangement. GCC a sa propre extension très similaire, et les autres éditeurs de compilateurs aussi, alors si vous le remplacez par le code approprié pour le compilateur que vous décidez d'utiliser, il devrait alors compiler et exécuter.

Enfin, les exemples sont tous des exemples de console. J'ai choisi des exemples de console afin d'éviter tout le code étranger lié à la création et à l'affichage de fenêtres dans un environnement de fenêtre. Pour voir la sortie d’un échantillon particulier, vous pouvez définir un point d’arrêt sur le revenir déclaration à la fin de la _pmain fonction et ensuite l'exécuter à l'aide du débogueur Visual Studio, ou vous pouvez l'exécuter à l'aide de la Démarrer sans débogage commande dans le Déboguer menu dans Visual Studio (cela utilise généralement le raccourci clavier Ctrl + F5). Vous devez également vous assurer que le projet que vous souhaitez exécuter est défini comme projet de démarrage. Pour ce faire, cliquez avec le bouton droit de la souris sur le nom du projet dans l'Explorateur de solutions, puis cliquez avec le bouton gauche de la souris sur Définir comme projet de démarrage dans le menu contextuel qui apparaît.


C ++ 11

En 2011, une nouvelle version majeure de la norme de langage C ++ a été adoptée par le groupe de travail ISO / CEI chargé de la conception et du développement de C ++ en tant que langage. Comparé à C ++ 98 et C ++ 03, C ++ 11 semble être un langage différent. C ++ 11 étant si nouveau, aucun compilateur ne prend en charge chaque fonctionnalité, et certains prennent en charge moins que d'autres. J'ai ciblé Visual C ++ et les fonctionnalités qu'il implémente dans sa version la plus récente (Visual Studio 2012 RC au moment de l'écriture de cet article), bien que j'aie mentionné quelques fonctionnalités que Visual C ++ ne prend actuellement pas en charge et que nous l'ayons souligné le cas échéant..

Il est peu probable que Visual C ++ change beaucoup entre Visual Studio 2012 RC et Visual Studio 2012 RTM. Il est prévu de réaliser une mise à jour hors bande, qui ajoutera une prise en charge supplémentaire du langage C ++ 11, quelque temps après la publication du RTM. Étant donné que je ne peux pas prédire quelles fonctionnalités seront ajoutées et que je n'ai aucune connaissance de base à ce sujet, je n'ai surtout pas traité de choses qui ne sont pas prises en charge par la télécommande..

Si vous avez une expérience antérieure de C ++ il y a cinq ans, ou peut-être plus longtemps, vous serez probablement très agréablement surpris - ce qui ne veut pas dire qu'il possède tout ce que C # a.

Il y a des fonctionnalités de C # et .NET qui me manquent lorsque je travaille en C ++. Mais il y a aussi des fonctionnalités de C ++ qui me manquent lorsque je travaille en C #. La simplicité de la conversion en C # que le système de types du CLR fournit lorsque je travaille en C ++ me manque. Le groupe d'exceptions plus complet de .NET et le logiciel IntelliSense, qui est souvent meilleur, me manque également. En C ++, je me réfère beaucoup plus à la documentation qu'en C # pour comprendre des éléments tels que les valeurs d'argument que je peux et dois transmettre à une fonction particulière et les valeurs à attendre d'elle..

Lorsque je travaille en C #, il me manque toute l'ampleur des différentes durées de stockage de C ++. En C #, la plupart des choses se terminent sur le segment de mémoire géré par le GC, ce qui simplifie grandement la gestion de la mémoire. Mais parfois, je ne veux pas nécessairement qu'une instance de classe soit sur le tas. En C #, je n'ai d'autre choix que de réécrire la classe sous forme de structure; alors qu'en C ++, je peux facilement choisir entre les deux sans avoir besoin de changer la définition de classe elle-même. Il me manque également des fonctions autonomes (même si elles peuvent être émulées principalement avec des méthodes statiques dans des classes statiques en C #). J'aime aussi le fait que mes programmes C ++ finissent par devenir un code machine fortement optimisé (et donc difficile à comprendre) lorsque je les compile. Je n'ai donc pas vraiment besoin de m'inquiéter d'essayer de brouiller mes programmes si je veux que mon code reste secret ( comme je le fais avec .NET, même s’il existe de très bons outils d’obscurcissement).

Conclusion

Chaque langue cible son propre ensemble de problèmes et a sa propre histoire et ses bizarreries qui lui sont associées. J'espère que vous trouverez le C ++ un langage intéressant et utile à ajouter à votre répertoire de programmation.

Cette leçon représente un chapitre de C ++ Succinctly, un eBook gratuit de l’équipe de Syncfusion..