C++ pour débutants Votre guide complet étape par étape pour tout savoir sur C++ Daniel Harder Introduction C++ est un langage de programmation hautes performances largement utilisé dans diverses applications, telles que les systèmes d'exploitation, les navigateurs Web et les jeux vidéo. Il a été développé en 1979 par Bjarne Stroustrup comme une extension du langage de programmation C, ajoutant des fonctionnalités orientées objet et d'autres améliorations. C++ est un langage compilé à typage statique, ce qui signifie qu'il est plus efficace que les langages à typage dynamique comme Python ou JavaScript. C'est aussi un langage très expressif, permettant aux programmeurs d'écrire du code à la fois efficace et facile à lire. L'une des principales caractéristiques de C++ est sa prise en charge de la programmation orientée objet (POO). Dans la POO, les données et le comportement sont encapsulés dans des "objets", qui peuvent être utilisés pour modéliser des concepts du monde réel et interagir les uns avec les autres via des méthodes. C++ prend également en charge la programmation procédurale, qui est un style de programmation plus traditionnel qui se concentre sur l'écriture de fonctions pour effectuer des tâches spécifiques. C++ est un langage puissant et flexible, mais il peut aussi être complexe et difficile à apprendre pour les débutants. Cela nécessite une bonne compréhension des concepts informatiques et une base solide dans les concepts de programmation tels que les variables, les types de données, les boucles et les structures de contrôle. Cependant, une fois que vous avez une bonne compréhension de ces concepts, C++ peut être un langage très enrichissant à apprendre et à utiliser. Chapitre un concepts de base Système de types C++ En C++, les données sont stockées et manipulées à l'aide de différents types de données. Ces types de données déterminent la taille et la disposition de la mémoire utilisée par les variables, ainsi que l'ensemble des opérations pouvant être effectuées sur celles-ci. C++ possède un système de type riche qui inclut à la fois des types intégrés et des types définis par l'utilisateur. Les types intégrés incluent : Types entiers : ils représentent des nombres entiers et incluent char , short , int , long et long long . Chacun de ces types a une taille différente, l' omble chevalier étant le plus petit et long étant le plus grand. Types à virgule flottante : ils représentent des nombres avec des parties fractionnaires et incluent float , double et long double . Ces types ont également des tailles différentes, le flotteur étant le plus petit et le double long étant le plus grand. Type booléen : cela représente une valeur vrai/faux et est représenté par le type booléen . Types de caractères : ils représentent des caractères individuels et incluent char et wchar_t . char est utilisé pour les caractères ASCII et wchar_t est utilisé pour les caractères larges, qui peuvent représenter des caractères d'une variété d'alphabets différents. Les types définis par l'utilisateur en C++ incluent : Classes : une classe est un type de données défini par l'utilisateur qui vous permet de définir vos propres champs de données et méthodes. Structures : une structure est similaire à une classe, mais les champs de données et les méthodes sont publics par défaut. Énumérations : une énumération est un type défini par l'utilisateur qui se compose d'un ensemble de constantes nommées. Typedef : Le mot-clé typedef vous permet de définir un nouveau nom pour un type de données existant. Cela peut être utilisé pour créer des noms plus lisibles ou expressifs pour les types complexes. C++ prend également en charge la conversion de type, ce qui vous permet de convertir une valeur d'un type de données à un autre. Cela peut être utile lorsque vous travaillez avec différents types de données qui doivent être utilisés ensemble, mais des précautions doivent être prises lors de l'utilisation de la conversion de type, car cela peut entraîner une perte de précision ou d'autres comportements inattendus s'ils ne sont pas utilisés correctement. Portée En C++, la portée d'une variable fait référence à la partie du programme dans laquelle la variable est visible ou accessible. La portée d'une variable est déterminée par l'emplacement de sa déclaration dans le programme. Il existe deux principaux types de portée en C++ : la portée locale et la portée globale. Une variable locale est une variable déclarée dans une fonction ou un bloc de code. Les variables locales ne sont visibles qu'à l'intérieur de la fonction ou du bloc dans lequel elles sont déclarées, et elles ne sont accessibles que du point de leur déclaration à la fin du bloc. Lorsque la fonction ou le bloc se termine, la variable locale est détruite et n'est plus accessible. Une variable globale est une variable déclarée en dehors de toute fonction ou bloc de code. Les variables globales sont visibles dans tout le programme et sont accessibles depuis n'importe quelle fonction ou bloc de code. Cependant, il est généralement considéré comme une bonne pratique de programmation de minimiser l'utilisation de variables globales, car elles peuvent rendre le programme plus difficile à comprendre et à maintenir. C++ prend également en charge les étendues imbriquées, où un bloc de code est défini dans un autre bloc de code. Dans ce cas, les variables déclarées dans le bloc interne ne sont visibles que dans ce bloc, mais elles sont également accessibles depuis le bloc externe. La portée d'une variable est un concept important en C++, car elle détermine la visibilité et l'accessibilité de la variable dans le programme. Comprendre la portée des variables est essentiel pour écrire un code efficace et maintenable. Fichiers d'en-tête En C++, un fichier d'en-tête est un fichier qui contient des déclarations de fonctions, de variables et d'autres constructions pouvant être utilisées dans un programme C++. Les fichiers d'en-tête sont généralement désignés par le suffixe .h et sont inclus dans un fichier source C++ à l'aide de la directive #include . Les fichiers d'en-tête sont utilisés à diverses fins en C++. Ils peuvent être utilisés pour déclarer des fonctions et des variables qui sont définies dans un autre fichier source, leur permettant d'être utilisées dans plusieurs fichiers sans duplication de code. Ils peuvent également être utilisés pour déclarer des fonctions et des variables qui sont implémentées dans une bibliothèque, leur permettant d'être utilisées dans un programme sans avoir besoin de lier la bibliothèque au programme. Les fichiers d'en-tête peuvent également être utilisés pour définir des macros, qui sont de courts morceaux de code qui sont remplacés par le préprocesseur avec leur forme développée correspondante. Les macros sont souvent utilisées pour définir des constantes et d'autres valeurs qui doivent être utilisées à plusieurs endroits dans un programme. L'un des principaux avantages de l'utilisation des fichiers d'en-tête est qu'ils permettent d'organiser et de réutiliser plus facilement le code. En séparant les déclarations des définitions et en les plaçant dans un fichier d'en-tête séparé, il est possible d'utiliser le même code dans plusieurs programmes sans avoir à le copier et le coller. Cela facilite la maintenance et la mise à jour du code, car les modifications ne doivent être apportées qu'à un seul endroit. Quelques exemples de fichiers d'en-tête C++ standard incluent <iostream> , qui fournit des flux d'entrée et de sortie pour lire et écrire des données, et <string> , qui fournit des fonctions et des classes pour travailler avec des chaînes. Il existe de nombreux autres fichiers d'en-tête disponibles dans la bibliothèque standard C++, ainsi que dans des bibliothèques tierces, qui fournissent un large éventail de fonctionnalités pour diverses tâches. Unités de traduction et liaison En C++, une unité de traduction est un fichier source et tous les fichiers d'en-tête qu'il inclut, ainsi que tous les fichiers d'en-tête inclus par ces fichiers d'en-tête, etc. Le processus de transformation d'une unité de traduction en un programme exécutable est appelé compilation. Lors de la compilation, le préprocesseur traite les directives #include dans l'unité de traduction, en insérant le contenu des fichiers d'en-tête inclus dans le fichier source. Le fichier source développé résultant est ensuite transmis au compilateur, qui le traduit en code objet. Le code objet est une représentation lisible par machine du programme qui peut être exécuté par l'ordinateur. Cependant, le code objet n'est pas sous une forme qui peut être directement exécutée par le système d'exploitation. Au lieu de cela, il doit être combiné avec d'autres fichiers de code objet et bibliothèques pour créer un programme exécutable. Ce processus est appelé liaison. Il existe deux types de liaison en C++ : la liaison interne et la liaison externe. La liaison interne fait référence aux symboles (variables et fonctions) qui ne sont visibles que dans une seule unité de traduction. Ces symboles sont généralement utilisés pour les détails de mise en œuvre qui ne sont pas destinés à être accessibles à partir d'autres unités de traduction. La liaison interne est obtenue en déclarant des symboles avec le mot-clé static . La liaison externe fait référence aux symboles qui sont visibles par plusieurs unités de traduction. Ces symboles sont généralement utilisés pour définir des fonctions et des variables destinées à être partagées entre plusieurs unités de traduction. La liaison externe est la valeur par défaut pour les symboles qui ne sont pas déclarés avec le mot-clé static . La liaison est un concept important en C++, car elle détermine la visibilité et l'accessibilité des symboles dans un programme. Comprendre la liaison est essentiel pour écrire un code efficace et maintenable, en particulier lorsque vous travaillez avec de gros programmes composés de plusieurs fichiers sources et bibliothèques. fonction principale et arguments de ligne de commande En C++, la fonction principale est le point d'entrée d'un programme. C'est la fonction qui est appelée par le système d'exploitation au démarrage du programme et qui détermine le flux de contrôle pour le reste du programme. La fonction principale a une syntaxe et un type de retour spécifiques. En C++, il peut être déclaré de l'une des manières suivantes : La première version de main ne prend aucun argument et renvoie une valeur int . La seconde version prend deux arguments : argc et argv . argc est une valeur int qui représente le nombre d'arguments de ligne de commande passés au programme, et argv est un tableau de valeurs char* qui contient les arguments réels. Les arguments de la ligne de commande sont des valeurs transmises au programme lorsqu'il est lancé à partir de la ligne de commande. Ils sont généralement utilisés pour transmettre des options de configuration ou d'autres entrées au programme. Par exemple, considérez le programme suivant qui imprime les arguments de ligne de commande qu'il reçoit : #include <iostream> Pour exécuter ce programme et lui transmettre des arguments de ligne de commande, vous utiliseriez une commande comme celle-ci : Cela imprimerait la sortie suivante : Comme vous pouvez le voir, le premier argument ( argv[0] ) est le nom du programme lui-même, et les arguments restants sont ceux passés sur la ligne de commande. Les arguments de ligne de commande peuvent être utiles pour fournir une entrée à un programme ou pour configurer son comportement. Ils sont une caractéristique commune à de nombreux programmes en ligne de commande et sont faciles à utiliser en C++. Fin du programme En C++, un programme se termine lorsque la fonction appelée. principale revient ou lorsque la fonction exit est La fonction main est le point d'entrée d'un programme C++ et détermine le flux de contrôle pour le reste du programme. Lorsque la fonction principale revient, le programme se termine. La valeur de retour de est l'état de sortie du programme, qui peut être utilisé par le système d'exploitation ou d'autres programmes pour déterminer le résultat du programme. Une valeur de retour de 0 indique généralement que le programme s'est exécuté avec succès, tandis qu'une valeur différente de zéro indique généralement une erreur. main Par exemple, la fonction succès : main suivante renvoie 0 pour indiquer que le programme s'est exécuté avec La fonction exit est une fonction définie dans la bibliothèque cstdlib qui permet à un programme de se terminer immédiatement. Il prend une valeur int comme argument, qui est l'état de sortie du programme. La fonction de sortie peut être appelée de n'importe où dans le programme et entraînera l'arrêt immédiat du programme, même s'il existe d'autres fonctions ou blocs de code qui ne sont pas encore terminés. Par exemple, le code suivant appelle la fonction 1: exit pour terminer le programme avec un état de sortie de Il est généralement considéré comme une bonne pratique de programmation d'utiliser le retour pour mettre fin à la fonction principale et de réserver la fonction de sortie aux situations d'urgence ou aux circonstances exceptionnelles. Comprendre comment un programme se termine est important pour écrire un code efficace et maintenable, car cela vous permet de vous assurer que toutes les tâches de nettoyage nécessaires sont effectuées avant la fermeture du programme. Lvalues et rvalues En C++, une lvalue (abréviation de "left value") est une expression qui fait référence à un emplacement mémoire et peut apparaître sur le côté gauche d'une affectation. Une rvalue (abréviation de "right value") est une expression qui ne fait pas référence à un emplacement mémoire et ne peut pas apparaître sur le côté gauche d'une affectation. Voici quelques exemples de lvalues et rvalues : En C++, les lvalues ont un type spécifique et peuvent être utilisées pour faire référence à des objets stockés en mémoire. Les valeurs R, en revanche, n'ont pas de type spécifique et ne peuvent pas être utilisées pour faire référence à des objets stockés en mémoire. Les valeurs L et rvalues sont un concept important en C++, car elles déterminent l'ensemble des opérations pouvant être effectuées sur les expressions. Par exemple, les lvalues peuvent être affectées à, tandis que les rvalues ne le peuvent pas. Les Lvalues peuvent également être déréférencées, contrairement aux rvalues. Comprendre la différence entre lvalues et rvalues est essentiel pour écrire du code C++ correct et efficace. Objets temporaires En C++, un objet temporaire est un objet créé pour contenir le résultat d'une expression et détruit immédiatement après l'évaluation de l'expression. Les objets temporaires sont également appelés "rvalues", car ils sont généralement créés à partir d'expressions rvalue (expressions qui ne font pas référence à un emplacement mémoire et ne peuvent pas apparaître sur le côté gauche d'une affectation). Les objets temporaires sont créés dans diverses situations en C++. Par exemple, ils peuvent être créés lorsqu'une rvalue est transmise à une fonction ou lorsqu'une rvalue est utilisée comme opérande droit d'une affectation. Voici quelques exemples d'objets temporaires créés en C++ : Point p = Point(1, 2); // un objet temporaire est créé pour contenir le résultat du constructeur Point Les objets temporaires sont souvent utilisés pour éviter les copies inutiles ou pour tirer parti de la sémantique de déplacement, qui permet au contenu d'un objet d'être "déplacé" plutôt que copié. Il est important d'être conscient des objets temporaires en C++, car ils peuvent avoir un comportement différent des objets normaux et peuvent conduire à des résultats inattendus s'ils ne sont pas utilisés correctement. Par exemple, il n'est généralement pas autorisé de lier une référence non const à un objet temporaire, car l'objet temporaire sera détruit dès que la référence sortira de la portée. Comprendre le comportement des objets temporaires est essentiel pour écrire du code C++ correct et efficace. Alignement En C++, l'alignement fait référence à la manière dont les données sont organisées en mémoire. L'alignement peut avoir un impact sur les performances et l'efficacité d'un programme, car il peut affecter la vitesse d'accès aux données et la quantité de mémoire utilisée. C++ fournit un certain nombre de fonctionnalités de langage et de fonctions de bibliothèque pour contrôler l'alignement. Une façon de contrôler l'alignement en C++ consiste à utiliser les mots-clés alignas et alignof . Le mot-clé alignas peut être utilisé pour spécifier l'alignement d'une variable ou d'un type de données, et le mot-clé alignof peut être utilisé pour déterminer l'alignement d'une variable ou d'un type de données. Par exemple, le code suivant définit une variable x avec un alignement de 16 octets : Le mot-clé alignof peut être utilisé pour déterminer l'alignement d'une variable ou d'un type de données, comme illustré dans l'exemple suivant : Une autre façon de contrôler l'alignement en C++ consiste à utiliser les types std::aligned_storage et std::aligned_union à partir de l' en-tête <type_traits> . Ces types fournissent un moyen de stocker des données avec un alignement spécifié de manière portable et efficace. Par exemple, le code suivant définit un avec un alignement de 16 octets : stockage variable qui peut être utilisé pour stocker un objet de type T Comprendre l'alignement est important pour écrire du code C++ efficace et performant, en particulier lorsque vous travaillez avec de grandes structures de données ou lorsque vous interagissez avec du matériel ou des systèmes de bas niveau. Un bon alignement peut améliorer considérablement les performances d'un programme en réduisant le nombre d'accès à la mémoire et Types triviaux, standard et POD En C++, un type est considéré comme trivial s'il s'agit d'un type qui a un constructeur par défaut trivial, un destructeur trivial et aucune fonction virtuelle ou classe de base virtuelle. Un type est considéré comme de mise en page standard s'il s'agit d'un type qui satisfait aux conditions suivantes : C'est un type trivial. Il n'a pas de membres de données non statiques de type classe de mise en page non standard (ou tableau de tels types). Il n'a pas de fonctions virtuelles ni de classes de base virtuelles. Un type est considéré comme un type POD (Plain Old Data) s'il s'agit d'un type qui satisfait les conditions suivantes : C'est un type de mise en page standard. Il n'a pas de membres de données non statiques de type classe non POD (ou tableau de tels types). Il n'a pas d'opérateur d'affectation de copie défini par l'utilisateur ni de destructeur défini par l'utilisateur. Les types triviaux, à disposition standard et POD sont des concepts importants en C++, car ils ont un comportement et des propriétés spécifiques sur lesquels le programmeur peut s'appuyer. Par exemple, les types triviaux peuvent être memset à zéro et copiés à l'aide de memcpy, tandis que les types de mise en page standard peuvent être passés aux fonctions C et peuvent être utilisés pour implémenter des types d'union. Les types POD peuvent être utilisés pour implémenter des structures de style C et peuvent être initialisés avec une liste d'initialisation entre accolades. Comprendre le comportement et les propriétés des types triviaux, de mise en page standard et POD est important pour écrire un code C++ efficace et correct, en particulier lorsque vous travaillez avec du matériel ou des systèmes de bas niveau, ou lors de l'interfaçage avec du code C. qu'est-ce que les types de valeur En C++, un type valeur est un type qui contient une valeur et est généralement stocké en mémoire sur la pile. Les types valeur sont également appelés "types fondamentaux", car ce sont les types les plus basiques fournis par le langage. La bibliothèque C++ standard fournit plusieurs types de valeurs, dont les suivants : bool : un type booléen qui représente vrai ou faux. char : un type de caractère qui représente un seul caractère. int , float short et , long double et long long : types entiers de tailles variables. : types à virgule flottante de précision variable. Les types valeur sont généralement utilisés pour contenir des données simples, telles que des nombres, des caractères et des booléens. Ils sont efficaces à utiliser, car ils ne nécessitent aucune gestion de mémoire supplémentaire et sont stockés directement en mémoire sur la pile. Voici un exemple d'utilisation des types valeur en C++ : Les types valeur sont un concept important en C++, car ils constituent la base de nombreux autres types du langage. Comprendre comment fonctionnent les types de valeur et comment ils peuvent être utilisés est essentiel pour écrire un code C++ efficace et correct. Conversions de type et sécurité de type En C++, les conversions de type sont le processus de conversion d'une valeur d'un type à un autre. Il existe plusieurs façons d'effectuer des conversions de type en C++, notamment la conversion de type explicite, la surcharge de fonctions et les opérateurs de conversion de type. La conversion de type explicite est le processus de conversion explicite d'une valeur d'un type à un autre à l'aide de l' opérateur static_cast . Ceci est généralement utilisé pour convertir une valeur d'un type de base en un type dérivé, ou d'un type dérivé en un type de base. Par exemple, le code suivant utilise une conversion de type explicite pour convertir une valeur valeur int : double en une La surcharge de fonctions est le processus de définition de plusieurs fonctions avec le même nom mais avec des types de paramètres différents. Cela permet à la même fonction d'être utilisée pour effectuer différentes opérations selon le type de ses arguments. Par exemple, le code suivant définit une fonction d'un int , d'un float ou d'un double : abs qui peut être utilisée pour calculer la valeur absolue Conversions standards En C++, une conversion standard est une conversion de type implicite prédéfinie qui est effectuée par le compilateur. Les conversions standard sont un ensemble de règles prédéfinies qui dictent comment des valeurs de différents types peuvent être converties les unes aux autres. Il existe trois types de conversions standard en C++ : 1. Conversion Lvalue-rvalue : cette conversion est appliquée aux lvalues (expressions qui font référence à un emplacement mémoire) pour produire des rvalues (expressions qui ne font pas référence à un emplacement mémoire). Cette conversion est généralement appliquée aux objets pour leur permettre d'être utilisés comme rvalues, par exemple lorsqu'ils sont passés à des fonctions ou utilisés comme opérande droit d'une affectation. 2. Conversion de tableau en pointeur : cette conversion est appliquée aux tableaux pour les convertir en pointeurs vers leur premier élément. Cette conversion est généralement appliquée lorsqu'un tableau est passé à une fonction ou lorsqu'il est utilisé dans une expression. 3. Conversion de fonction en pointeur : cette conversion est appliquée aux noms de fonction pour les convertir en pointeurs vers la fonction. Cette conversion est généralement appliquée lorsqu'un nom de fonction est passé à une fonction ou lorsqu'il est utilisé dans une expression. Les conversions standard sont appliquées automatiquement par le compilateur et le programmeur n'a pas besoin de les spécifier explicitement. Ils constituent une partie importante du système de types C++, car ils permettent d'utiliser indifféremment des valeurs de différents types dans de nombreux contextes. Comprendre le fonctionnement des conversions standard est essentiel pour écrire du code C++ correct et efficace. Chapitre II types intégrés Types intégrés En C++, les types intégrés sont un ensemble de types prédéfinis fournis par le langage et implémentés directement par le compilateur. Les types intégrés sont également appelés "types fondamentaux" ou "types valeur", car ce sont les types les plus basiques fournis par le langage et ils sont généralement stockés en mémoire sur la pile. La bibliothèque standard C++ fournit plusieurs types intégrés, dont les suivants : bool : un type booléen qui représente vrai ou faux. char : un type de caractère qui représente un seul caractère. int , short , long et long long : types entiers de tailles variables. float et void : un type spécial qui représente l'absence d'une valeur. double : types à virgule flottante de précision variable. Les types intégrés sont un concept important en C++, car ils constituent la base de nombreux autres types du langage. Comprendre comment fonctionnent les types intégrés et comment ils peuvent être utilisés est essentiel pour écrire un code C++ efficace et correct. Voici un exemple d'utilisation de types intégrés en C++ : Plages de types de données En C++, la plage d'un type de données est l'ensemble de valeurs qu'il peut représenter. La plage d'un type de données est déterminée par sa taille et la manière dont il est codé. La bibliothèque standard C++ fournit plusieurs types intégrés, chacun avec une plage spécifique de valeurs qu'il peut représenter. Le tableau suivant montre la plage de certains types intégrés courants en C++ : Taper Taille (octets) 1 carboniser 1 wchar_t 2 ou 4 char16_t 2 char32_t 4 court 2 entier 4 long 4 ou 8 longtemps longtemps 8 flotteur 4 double 8 longue double 8 ou 10 ou 16 bourdonner Valeur minimum Valeur maximum faux vrai -128 127 défini par la mise en œuvre défini par la mise en œuvre 0 65535 0 4294967295 -32768 32767 -2147483648 2147483647 défini par la mise en œuvre défini par la mise en œuvre -9223372036854775808 9223372036854775807 1.17549e-38 3.40282e+38 2.22507e-308 1.79769e+308 défini par la mise en œuvre défini par la mise en œuvre Il est important de connaître la plage d'un type de données lorsque vous travaillez avec C++, car l'utilisation d'une valeur en dehors de sa plage peut entraîner un comportement indéfini. Comprendre la plage d'un type de données est également important pour choisir le type approprié pour une tâche donnée, car l'utilisation d'un type avec une plage plus large peut entraîner de meilleures performances ou des résultats plus précis. nullptr En C++, nullptr est un mot-clé spécial qui représente une valeur de pointeur null. Il a été introduit en C++11 comme un moyen plus sûr et plus explicite de représenter un pointeur nul que l'utilisation de la constante entière 0 ou de la macro NULL . a le type std::nullptr_t , qui est un type spécial qui peut être implicitement converti en n'importe quel type de pointeur. Cela permet à nullptr d'être utilisé dans une variété de contextes où un pointeur est attendu, comme lors de l'initialisation d'un pointeur ou lors du passage d'un pointeur à une fonction. nullptr Voici un exemple d'utilisation de nullptr en C++ : L'utilisation de nullptr au lieu de 0 ou NULL présente plusieurs avantages. Il est plus explicite et plus facile à lire, car il indique clairement qu'un pointeur nul est utilisé. Il est également plus sûr, car il empêche les conversions accidentelles entre les pointeurs et les entiers, ce qui peut entraîner un comportement indéfini. est un concept important en C++, en particulier lorsque vous travaillez avec des pointeurs et des valeurs nullables. Comprendre comment utiliser nullptr et comment il diffère de 0 et NULL est essentiel pour écrire du code C++ correct et sûr. nullptr nullptr En C++, nullptr est un mot-clé spécial qui représente une valeur de pointeur null. Il a été introduit en C++11 comme un moyen plus sûr et plus explicite de représenter un pointeur nul que l'utilisation de la constante entière 0 ou de la macro NULL . a le type std::nullptr_t , qui est un type spécial qui peut être implicitement converti en n'importe quel type de pointeur. Cela permet à nullptr d'être utilisé dans une variété de contextes où un pointeur est attendu, comme lors de l'initialisation d'un pointeur ou lors du passage d'un pointeur à une fonction. nullptr Voici un exemple d'utilisation de nullptr en C++ : L'utilisation de nullptr au lieu de 0 ou NULL présente plusieurs avantages. Il est plus explicite et plus facile à lire, car il indique clairement qu'un pointeur nul est utilisé. Il est également plus sûr, car il empêche les conversions accidentelles entre les pointeurs et les entiers, ce qui peut entraîner un comportement indéfini. est un concept important en C++, en particulier lorsque vous travaillez avec des pointeurs et des valeurs nullables. Comprendre comment utiliser nullptr et comment il diffère de 0 et NULL est essentiel pour écrire du code C++ correct et sûr. nullptr bourdonner En C++, bool est un type de données intégré qui représente une valeur booléenne, qui peut être false . Il est utilisé pour représenter la vérité ou la fausseté d'une condition ou d'une expression. true ou Voici un exemple d'utilisation du type de données bool en C++ : #include <iostream> La sortie de ce programme sera : b1 : 1 b2 : 0 En C++, true est généralement représenté par 1 et false est représenté par 0 . Cependant, vous pouvez utiliser les valeurs true et false directement dans votre code pour représenter des valeurs booléennes. Par exemple, le code suivant est également valide : La sortie de ce programme sera : b1 b2 b1 b2 :1 :0 est vrai est faux faux En C++, false est une valeur booléenne qui représente l'opposé de vérité ou la fausseté d'une condition ou d'une expression. true . Il est utilisé pour représenter la En C++, false est généralement représenté par 0 . Cependant, vous pouvez utiliser la valeur directement dans votre code pour représenter une valeur booléenne. Voici un exemple d'utilisation de la valeur false false en C++ : La sortie de ce programme sera : b1 b2 b1 b2 :1 :0 est vrai est faux Dans cet exemple, la variable b2 reçoit la valeur false , qui est représentée par 0 . Lorsque la valeur de est testée dans une instruction if , elle est considérée comme étant false et le code du bloc else est exécuté. b2 vrai En C++, true est une valeur booléenne qui représente l'opposé de vérité ou la fausseté d'une condition ou d'une expression. false . Il est utilisé pour représenter la En C++, true est généralement représenté par 1 . Cependant, vous pouvez utiliser la valeur directement dans votre code pour représenter une valeur booléenne. Voici un exemple d'utilisation de la valeur true en C++ : true La sortie de ce programme sera : b1 b2 b1 b2 :1 :0 est vrai est faux Dans cet exemple, la variable b1 reçoit la valeur true , qui est représentée par 1 . Lorsque la valeur de est testée dans une instruction if , elle est considérée comme true et le code du bloc if est exécuté. b1 __m64 est une définition de type dans le langage de programmation C++ qui représente une valeur entière 64 bits. Il s'agit d'un type de données intégré fourni par le compilateur Intel C++ à utiliser avec les instructions Intel Streaming SIMD Extensions (SSE). __m64 Le type __m64 peut être utilisé pour stocker et manipuler des valeurs entières 64 bits d'une manière optimisée pour une utilisation avec les instructions SSE. Il est destiné à être utilisé dans des applications hautes performances, multimédias et scientifiques où les données doivent être traitées en parallèle. Voici un exemple d'utilisation du type de données __m64 en C++ : La sortie de ce programme sera : m1 : [1, 2] m2 : [3, 3] Notez que le type de données __m64 n'est disponible que lors de l'utilisation du compilateur Intel C++ et lorsque le fichier d'en-tête emmintrin.h est inclus. Ce n'est pas un type de données C++ standard et n'est pas pris en charge par d'autres compilateurs. __m128 est une définition de type dans le langage de programmation C++ qui représente une valeur à virgule flottante de 128 bits. Il s'agit d'un type de données intégré fourni par le compilateur Intel C++ à utiliser avec les instructions Intel Streaming SIMD Extensions (SSE). __m128 Le type __m128 peut être utilisé pour stocker et manipuler des valeurs à virgule flottante 128 bits d'une manière optimisée pour une utilisation avec les instructions SSE. Il est destiné à être utilisé dans les hautes performances, applications multimédias et scientifiques où les données doivent être traitées en parallèle. Voici un exemple d'utilisation du type de données __m128 en C++ : La sortie de ce programme sera : m1 : [1.0, 2.0, 3.0, 4.0] m2 : [5,0, 5,0, 5,0, 5,0] Notez que le type de données __m128 n'est disponible que lors de l'utilisation du compilateur Intel C++ et lorsque le fichier d'en-tête emmintrin.h est inclus. Ce n'est pas un type de données C++ standard et n'est pas pris en charge par d'autres compilateurs. __m128d est une définition de type dans le langage de programmation C++ qui représente une valeur à virgule flottante de 128 bits. Il s'agit d'un type de données intégré fourni par le compilateur Intel C++ à utiliser avec les instructions Intel Streaming SIMD Extensions (SSE). __m128d Le type __m128d peut être utilisé pour stocker et manipuler des valeurs à virgule flottante 128 bits d'une manière optimisée pour une utilisation avec les instructions SSE. Il est destiné à être utilisé dans des applications hautes performances, multimédias et scientifiques où les données doivent être traitées en parallèle. Voici un exemple d'utilisation du type de données __m128d en C++ : La sortie de ce programme sera : m1 : [1.0, 2.0] m2 : [3,0, 3,0] Notez que le type de données __m128d n'est disponible que lors de l'utilisation du compilateur Intel C++ et lorsque le fichier d'en-tête emmintrin.h est inclus. Ce n'est pas un type de données C++ standard et n'est pas pris en charge par d'autres compilateurs. __m128i est une définition de type dans le langage de programmation C++ qui représente une valeur entière de 128 bits. Il s'agit d'un type de données intégré fourni par le compilateur Intel C++ à utiliser avec les instructions Intel Streaming SIMD Extensions (SSE). __m128i Le type __m128i peut être utilisé pour stocker et manipuler des valeurs entières 128 bits d'une manière optimisée pour une utilisation avec les instructions SSE. Il est destiné à être utilisé dans des applications hautes performances, multimédias et scientifiques où les données doivent être traitées en parallèle. Voici un exemple d'utilisation du type de données __m128i en C++ : La sortie de ce programme sera : m1 : [1, 2, 3, 4] m2 : [5, 5, 5, 5] Notez que le type de données __m128i n'est disponible que lors de l'utilisation du compilateur Intel C++ et lorsque le fichier d'en-tête emmintrin.h est inclus. Ce n'est pas un type de données C++ standard et n'est pas pris en charge par d'autres compilateurs. __ptr32, __ptr64 et __ptr64 sont des spécificateurs de type dans le langage de programmation C++ qui sont utilisés pour déclarer des pointeurs avec une taille spécifique. Ils sont fournis par le compilateur Microsoft Visual C++ et sont destinés à être utilisés respectivement dans les applications 32 bits et 64 bits. __ptr32 Le spécificateur __ptr32 déclare un pointeur 32 bits, qui est une adresse mémoire qui occupe 4 octets de mémoire. Ce type de pointeur est utilisé dans les applications 32 bits, qui sont généralement limitées à l'adressage de 4 Go de mémoire. Le spécificateur __ptr64 déclare un pointeur 64 bits, qui est une adresse mémoire qui occupe 8 octets de mémoire. Ce type de pointeur est utilisé dans les applications 64 bits, qui peuvent adresser plus de 4 Go de mémoire. Voici un exemple d'utilisation des spécificateurs de type __ptr32 et __ptr64 en C++ : La sortie de ce programme dépendra de la taille des pointeurs sur votre système. Sur un système 32 bits, la sortie sera : p1 : 0x0012FF74 p2 : 0x0012FF74 Sur un système 64 bits, la sortie sera : p1 : 0x00007FF75F4BFF74 p2 : 0x00007FF75F4BFF74 Notez que les spécificateurs de type __ptr32 et __ptr64 ne sont disponibles que lors de l'utilisation du compilateur Microsoft Visual C++. Ce ne sont pas des spécificateurs de type C++ standard et ils ne sont pas pris en charge par d'autres compilateurs. Chapitre III LIMITES NUMERIQUES Limites numériques En C++, le fichier d'en-tête <limits> définit un ensemble de modèles et de constantes qui fournissent des informations sur la plage et la précision des types de données fondamentaux. Ces modèles et constantes sont connus sous le nom de limites numériques. Les limites numériques peuvent être utilisées pour déterminer les valeurs minimales et maximales pouvant être représentées par un type de données donné, ainsi que la précision du type de données. Ils peuvent être utiles pour s'assurer que les valeurs utilisées dans un programme se situent dans la plage de valeurs pouvant être représentées par le type de données. Voici un exemple d'utilisation des limites numériques en C++ : La sortie de ce programme dépendra de l'implémentation de la bibliothèque standard C++ sur votre système. Cela peut ressembler à ceci : Valeur minimale de int : -2147483648 Valeur maximale de int : 2147483647 Précision du flotteur : 6 chiffres décimaux Le fichier d'en-tête <limits> définit des modèles de limites numériques et des constantes pour tous les types de données fondamentaux, notamment char , short , int , long , long long , float , double et long double . Vous pouvez utiliser ces modèles et constantes pour déterminer la plage et la précision de n'importe lequel de ces types de données. Limites d'entiers En C++, le fichier d'en-tête <limits> définit un ensemble de modèles et de constantes qui fournissent des informations sur la plage et la précision des types de données entiers. Ces modèles et constantes sont connus sous le nom de limites entières. Les limites d'entiers peuvent être utilisées pour déterminer les valeurs minimales et maximales pouvant être représentées par les types de données entiers, tels que char , short , int , long et long long . Ils peuvent être utiles pour s'assurer que les valeurs utilisées dans un programme se situent dans la plage de valeurs pouvant être représentées par le type de données. Voici un exemple d'utilisation des limites d'entiers en C++ : La sortie de ce programme dépendra de l'implémentation de la bibliothèque standard C++ sur votre système. Cela peut ressembler à ceci : Limites flottantes En C++, le fichier d'en-tête <limits> définit un ensemble de modèles et de constantes qui fournissent des informations sur la plage et la précision des types de données à virgule flottante. Ces modèles et constantes sont connus sous le nom de limites en virgule flottante. Les limites en virgule flottante peuvent être utilisées pour déterminer les valeurs minimale et maximale pouvant être représentées par les types de données en virgule flottante, tels que float , double et long double . Ils peuvent également être utilisés pour déterminer la précision de ces types de données, c'est-à-dire le nombre de chiffres décimaux de précision qu'ils peuvent représenter. Voici un exemple d'utilisation des limites en virgule flottante en C++ : le quatrième chapitre Déclarations et définitions En C++, les déclarations et les définitions sont deux concepts différents qui font référence à la manière dont les variables, fonctions et autres entités sont introduites et utilisées dans un programme. Une déclaration est une instruction qui introduit une entité et spécifie son type, son nom et d'autres attributs. Il n'alloue aucune mémoire et n'exécute aucun code. Une déclaration peut être faite à l'aide du mot-clé extern , qui indique que l'entité est définie dans une autre unité de traduction. Une définition est une instruction qui crée une entité en allouant de la mémoire et en exécutant du code. Il doit inclure une déclaration et peut également inclure des détails supplémentaires tels qu'une valeur initiale ou un corps de fonction. Une définition doit être faite dans une seule unité de traduction, mais elle peut être déclarée dans plusieurs unités de traduction à l'aide du mot-clé extern . Voici un exemple de déclaration et de définition en C++ : Dans cet exemple, la variable globale x est déclarée à l'aide du mot clé définie dans une autre unité de traduction. Le local extern , ce qui signifie qu'elle est Classes de stockage En C++, les classes de stockage sont des mots clés qui spécifient la durée de vie et la visibilité des variables et des fonctions. Ils déterminent comment les variables et les fonctions sont stockées en mémoire et comment elles sont accessibles à partir de différentes parties d'un programme. Il existe quatre classes de stockage en C++ : 1. auto : Il s'agit de la classe de stockage par défaut pour les variables locales. Il spécifie que la variable est créée et détruite automatiquement lorsqu'elle sort de la portée. 2. statique 3. registre 4. extern : cette classe de stockage spécifie que la variable ou la fonction a un emplacement mémoire fixe et une durée de vie qui s'étend sur toute la durée du programme. Il est souvent utilisé pour créer des variables qui conservent leur valeur entre les appels de fonction. : Cette classe de stockage spécifie que la variable doit être stockée dans un registre plutôt que dans la mémoire principale. Cela peut améliorer les performances du programme en réduisant le temps d'accès à la variable. Cependant, il n'est pas garanti que la variable soit réellement stockée dans un registre, et le nombre de registres disponibles est souvent limité. : cette classe de stockage spécifie que la variable ou la fonction est définie dans une autre unité de traduction et est déclarée dans l'unité de traduction actuelle. Il est souvent utilisé pour partager des variables et des fonctions entre plusieurs fichiers source. Voici un exemple d'utilisation des classes de stockage en C++ : auto En C++, auto est une classe de stockage qui spécifie qu'une variable est créée et détruite automatiquement lorsqu'elle sort de la portée. C'est la classe de stockage par défaut pour les variables locales, qui sont des variables déclarées dans une fonction ou un bloc. La classe de stockage automatique est utilisée pour créer des variables qui ont une durée de vie limitée et ne sont accessibles que dans le bloc dans lequel elles sont déclarées. Lorsque le bloc se termine, la variable est automatiquement détruite et la mémoire qu'elle occupe est libérée pour d'autres utilisations. Voici un exemple d'utilisation de la classe de stockage automatique en C++ : La sortie de ce programme sera : x : 10 y : 20 Notez que la classe de stockage automatique n'est pas la même que le spécificateur de type automatique , qui est utilisé pour déduire le type d'une variable à partir de son initialiseur. Par exemple: constante En C++, const est un qualificateur de type qui spécifie qu'un objet ne peut pas être modifié. Il peut être appliqué à des variables, des fonctions et d'autres types d'objets pour indiquer que leur valeur ou leur comportement ne peut pas être modifié. Le qualificatif const peut être utilisé pour empêcher les modifications involontaires des variables et pour s'assurer que les fonctions ne modifient pas leurs arguments ou leur état global. Il peut également être utilisé pour améliorer la lisibilité et la maintenabilité d'un programme en rendant explicite le comportement prévu des variables et des fonctions. Voici un exemple d'utilisation du qualificatif const en C++ : Le qualificatif const peut également être appliqué aux pointeurs et aux références pour indiquer que l'objet pointé ou référencé ne peut pas être modifié. Par exemple: constexpr En C++, constexpr est un mot clé qui spécifie qu'une fonction ou une variable est une constante de compilation. Cela indique que la valeur de la fonction ou de la variable peut être déterminée au moment de la compilation, plutôt qu'au moment de l'exécution. Le mot-clé constexpr peut être utilisé pour améliorer les performances d'un programme en permettant au compilateur d'effectuer un pliage constant et d'autres techniques d'optimisation sur des expressions qui utilisent des constantes de compilation. Il peut également être utilisé pour s'assurer que la valeur d'une constante est connue au moment de la compilation, ce qui est requis dans certains contextes, comme lors de l'initialisation de tableaux avec des expressions constantes. Voici un exemple d'utilisation du mot-clé constexpr en C++ : La sortie de ce programme sera : x : 10 y : 20 carré externe En C++, extern est une classe de stockage qui spécifie qu'une variable ou une fonction est définie dans une autre unité de traduction et est déclarée dans l'unité de traduction actuelle. Il est souvent utilisé pour partager des variables et des fonctions entre plusieurs fichiers source. La classe de stockage externe est utilisée pour déclarer des variables et des fonctions qui sont définies dans une autre unité de traduction. Il n'alloue aucune mémoire et n'exécute aucun code. Au lieu de cela, il indique au compilateur que la variable ou la fonction est définie ailleurs et est accessible à partir de l'unité de traduction actuelle. Voici un exemple d'utilisation de la classe de stockage externe en C++ : Dans cet exemple, la variable globale x et la fonction sum() sont déclarées dans le fichier d'en-tête declarations.h à l'aide de la classe de stockage externe . Ils sont définis dans le fichier source definitions.cpp , qui inclut le fichier d'en-tête. Le fichier source principal main.cpp comprend également le fichier d'en-tête, qui lui permet d'accéder à la variable et à la fonction. Notez que la classe de stockage extern n'est pas la même que le mot-clé extern , qui est utilisé pour indiquer qu'une variable ou une fonction est définie Initialiseurs En C++, un initialiseur est une valeur ou une expression utilisée pour initialiser une variable lorsqu'elle est déclarée. Il spécifie la valeur à laquelle la variable doit être initialisée lors de sa création. Les initialiseurs peuvent être utilisés pour donner à une variable une valeur spécifique au moment où elle est déclarée, plutôt que de lui affecter une valeur plus tard. Cela peut être utile pour définir la valeur initiale d'une variable sur une constante ou pour fournir une valeur par défaut pour un argument de fonction. Il existe plusieurs façons de spécifier un initialiseur en C++ : 1. Utilisation d'une expression d'affectation : c'est la manière la plus courante d'initialiser une variable. Il utilise l'opérateur d'affectation = pour spécifier la valeur initiale de la variable. Par exemple: int x = 10 ; y double = 3,14 ; car c = 'A'; 2. Utilisation d'une liste d'initialisation : cette méthode est utilisée pour initialiser des variables qui ont un type de données composé, telles que des tableaux et des structures. Il utilise une liste de valeurs entre accolades pour spécifier les valeurs initiales des variables. Par exemple: int a[3] = {1, 2, 3} ; struct Point { int x, y; } p = {1, 2} ; 3. Utilisation d'un constructeur : cette méthode est utilisée pour initialiser des variables qui ont un type défini par l'utilisateur, telles que des classes et des énumérations. Il utilise une fonction constructeur pour créer et initialiser un objet du type souhaité. Par exemple: Voici un exemple d'utilisation des initialiseurs dans Alias et typedefs En C++, un alias est un nouveau nom introduit pour un type ou un objet existant. Il vous permet d'utiliser un nom différent pour faire référence au même type ou objet, ce qui peut améliorer la lisibilité et la maintenabilité d'un programme. Il existe deux manières de créer un alias en C++ : 1. Utilisation du mot-clé using : cette méthode vous permet de créer un alias pour n'importe quel type ou objet, y compris les types intégrés, les types définis par l'utilisateur et les modèles. Il utilise la syntaxe suivante : en utilisant alias_name = type_name ; Par exemple: en utilisant Int = int ; en utilisant Str = std::string; 2. Utilisation de typedef : cette méthode vous permet de créer un alias pour n'importe quel type, y compris les types intégrés, les types définis par l'utilisateur et les modèles. Il utilise la syntaxe suivante : typedef nom_type nom_alias ; Par exemple: typedef int Entier ; typedef std::string Str; Voici un exemple d'utilisation des alias et des typedefs en C++ : #include <iostream> #include <chaîne> // Crée un alias en utilisant le mot-clé 'using' en utilisant Int = int ; // Crée un alias en utilisant 'typedef' typedef std::string Str; int main() { // Déclare et définit les variables en utilisant les alias Int x = 10 ; Str s = "Bonjour" ; std::cout << "x: " << x << std::endl; std::cout << "s: " << s << std::endl; renvoie 0 ; } La sortie de ce programme sera : x : 10 s : bonjour Notez que le mot-clé typedef était largement utilisé en C++ avant l'introduction du mot-clé using , mais le mot-clé using est maintenant considéré comme le moyen préféré pour créer des alias en C++. Il est plus flexible et permet un code plus concis et expressif. à l'aide de la déclaration En C++, une déclaration using est une instruction qui introduit un nom d'un espace de noms dans la portée actuelle. Il vous permet d'utiliser le nom sans spécifier l'espace de noms dans lequel il est défini. Une déclaration using est souvent utilisée pour éviter de taper le nom complet de l'espace de noms chaque fois que vous souhaitez utiliser un nom de l'espace de noms. Il peut également être utilisé pour amener plusieurs noms du même espace de noms ou d'espaces de noms différents dans la même portée, ce qui peut améliorer la lisibilité et la maintenabilité d'un programme. Voici un exemple d'utilisation d'une déclaration using en C++ : La sortie de ce programme sera : x : 10 foo ::y: 20 Vous pouvez également utiliser une déclaration using pour amener plusieurs noms du même espace de noms ou d'espaces de noms différents dans la même portée, comme ceci : volatil En C++, volatile est un qualificateur de type qui spécifie qu'une variable peut être modifiée par un processus externe ou par du matériel. Il indique que la valeur de la variable peut changer de manière inattendue, même si elle ne semble pas avoir été modifiée dans le programme. Le qualificatif volatile est utilisé pour empêcher le compilateur d'effectuer certaines optimisations sur une variable, comme la mise en cache de sa valeur dans un registre ou l'optimisation de son accès. Il est souvent utilisé pour les variables partagées avec le matériel ou avec d'autres processus, tels que les registres d'E/S mappés en mémoire ou les variables globales accessibles par plusieurs threads. Voici un exemple d'utilisation du qualificatif volatile en C++ : La sortie de ce programme sera : x : 10 x : 20 Notez que le qualificateur volatile n'est pas le même que le mot-clé volatile , qui est utilisé pour indiquer qu'une variable ou une fonction peut être modifiée par un processus externe ou par du matériel. Le qualificatif volatile est utilisé pour indiquer qu'une variable peut être modifiée par un processus externe ou par du matériel, alors que le mot-clé volatile est utilisé pour déclarer une variable ou une fonction decltype En C++, decltype est un mot clé qui vous permet de déterminer le type d'une expression. Il est souvent utilisé pour déduire le type d'une variable ou d'une fonction à partir de son initialiseur ou de son type de retour. Le mot-clé decltype est utilisé pour spécifier le type d'une variable ou d'une fonction en évaluant une expression ou un type-id. Il est souvent utilisé en conjonction avec le mot-clé auto pour déduire le type d'une variable à partir de son initialiseur. Voici un exemple d'utilisation du mot clé decltype en C++ : La sortie de ce programme sera : Type de a : entier Type de b : double Vous pouvez également utiliser le mot-clé decltype pour déterminer le type de retour d'une fonction en spécifiant le nom de la fonction en tant qu'expression. Par exemple: Les attributs En C++, les attributs sont des métadonnées supplémentaires qui peuvent être associées à une fonction, une variable, un type ou une autre construction de langage. Ils vous permettent de fournir des informations supplémentaires ou de spécifier certains comportements pour la conception, tels que son alignement, sa visibilité ou sa plate-forme cible. Les attributs sont spécifiés à l'aide de la syntaxe [[attribute]] , qui est suivie du nom de l'attribut et de tout argument supplémentaire. Ils peuvent être appliqués aux déclarations et définitions de fonctions, variables, types et autres constructions. C++ a un certain nombre d'attributs prédéfinis qui sont spécifiés dans le fichier d'en-tête Voici quelques exemples d'attributs prédéfinis : <attributes> . : Indique qu'une fonction ne retourne pas à son appelant. [[noreturn]] : indique qu'une fonction peut porter une dépendance entre l'un de ses arguments et sa valeur de retour. [[carries_dependency]] [[obsolète]] : indique qu'une fonction ou un type est obsolète et ne doit pas être utilisé. [[nodiscard]] : Indique que la valeur de retour d'une fonction ne doit pas être ignorée. Voici un exemple d'utilisation des attributs en C++ : Dans cet exemple, la fonction exit() est déclarée avec l' attribut [[noreturn]] , qui indique qu'elle Chapitre V Opérateurs intégrés, priorité et association En C++, les opérateurs sont des symboles spéciaux qui effectuent des opérations spécifiques sur un, deux ou trois opérandes et produisent un résultat. Les opérateurs peuvent être classés comme unaires, binaires ou ternaires en fonction du nombre d'opérandes dont ils ont besoin. C++ possède un ensemble d'opérateurs intégrés prédéfinis par le langage et utilisables dans n'importe quel programme. Ces opérateurs peuvent être regroupés dans les catégories suivantes : 1. Opérateurs arithmétiques : ces opérateurs effectuent des calculs arithmétiques sur des opérandes, tels que l'addition, la soustraction, la multiplication et la division. 2. Opérateurs de comparaison : ces opérateurs comparent deux opérandes et renvoient une valeur booléenne indiquant si la comparaison est vraie ou fausse. 3. Opérateurs logiques : ces opérateurs effectuent des opérations logiques sur les opérandes, telles que AND, OR et NOT. 4. Opérateurs au niveau du bit : ces opérateurs effectuent des opérations au niveau du bit sur les opérandes, telles que AND, OR, XOR et NOT. 5. Opérateurs d'affectation : ces opérateurs attribuent une valeur à une variable. 6. Opérateurs d'incrémentation et de décrémentation : ces opérateurs augmentent ou diminuent la valeur d'une variable de 1. 7. Opérateur conditionnel : cet opérateur sélectionne l'un des deux opérandes en fonction d'une condition booléenne. Les opérateurs ont une priorité, qui détermine l'ordre dans lequel ils sont évalués dans une expression. Les opérateurs de priorité supérieure sont évalués avant les opérateurs de priorité inférieure. Les opérateurs ont également une associativité, qui détermine l'ordre dans lequel ils sont évalués lorsqu'ils ont la même priorité. Les opérateurs avec une associativité de gauche à droite sont évalués de gauche à droite, tandis que les opérateurs avec une associativité de droite à gauche sont évalués de droite à gauche. opérateur alignof En C++, l' opérateur alignof est un mot clé qui détermine l'exigence d'alignement d'un type ou d'une expression. Il renvoie l'alignement minimum requis pour un objet du type spécifié, en octets. L' opérateur alignof est utilisé pour déterminer l'exigence d'alignement d'un type ou d'une expression afin d'allouer de la mémoire pour un objet de ce type. Il est souvent utilisé en conjonction avec le spécificateur alignas pour spécifier l'alignement d'une variable ou d'un type. Voici un exemple d'utilisation de l' opérateur alignof en C++ : La sortie de ce programme sera : alignof(S) : 4 octets alignof(int): 4 octets Notez que l' opérateur alignof n'est pas le même que le spécificateur alignas , qui est utilisé pour spécifier l'alignement d'une variable ou d'un type. L' opérateur d'alignement d'un type ou d'une expression alignof est utilisé pour déterminer l'exigence Opérateur __uuidof En C++, l' opérateur __uuidof est un opérateur spécifique à Microsoft qui renvoie l'identificateur universel unique (UUID) d'un type. Il est utilisé pour identifier un type, une interface ou un composant dans un programme COM (Component Object Model). L' opérateur __uuidof est utilisé pour récupérer l'UUID d'un type ou d'une interface afin de créer une instance de l'objet ou d'interroger les informations de type de l'objet. Il est souvent utilisé conjointement avec la fonction CoCreateInstance pour créer une instance d'un objet COM. Voici un exemple d'utilisation de l' opérateur __uuidof en C++ : Dans cet exemple, l' opérateur __uuidof est utilisé pour récupérer l'UUID de l' interface IUnknown , qui est une interface fondamentale dans la programmation COM. L'UUID est ensuite passé à la fonction CoCreateInstance pour créer une instance de l' interface IUnknown . Notez que l' opérateur __uuidof est un opérateur spécifique à Microsoft et ne fait pas partie du langage C++ standard. Il n'est disponible que sur les plates-formes prenant en charge la programmation COM. Opérateurs additifs : + et En C++, les opérateurs + et - sont des opérateurs additifs qui effectuent respectivement une addition et une soustraction. Ils peuvent être utilisés pour ajouter ou soustraire deux opérandes de types identiques ou compatibles, et produire un résultat du même type que les opérandes. L' opérateur + est un opérateur binaire qui additionne deux opérandes et renvoie leur somme. Il peut être utilisé avec des opérandes de tout type arithmétique, y compris des nombres entiers, des nombres à virgule flottante et des nombres complexes. L' opérateur - est également un opérateur binaire qui soustrait un opérande à un autre et renvoie la différence. Il peut être utilisé avec des opérandes de tout type arithmétique, y compris des nombres entiers, des nombres à virgule flottante et des nombres complexes. Voici un exemple d'utilisation des opérateurs + et - en C++ : La sortie de ce programme sera : x + y = 30 x - y = -10 Notez que les opérateurs + et - peuvent également être utilisés comme opérateurs unaires, auquel cas ils opèrent sur un seul opérande. L' opérateur + renvoie l'opérande inchangé, tandis que l' opérateur renvoie le négatif Adresse de l'opérateur : & En C++, l' opérateur & est l'opérateur d'adresse de, qui renvoie l'adresse mémoire d'une variable ou d'un objet. C'est un opérateur unaire qui prend un seul opérande et renvoie un pointeur sur l'opérande. L' opérateur & permet d'obtenir l'adresse mémoire d'une variable ou d'un objet afin d'y accéder directement ou de le passer en argument à une fonction. Il est souvent utilisé en conjonction avec des variables de pointeur pour manipuler la valeur de l'objet pointé. Voici un exemple d'utilisation de l' opérateur & en C++ : La sortie de ce programme sera : x : 10 &x : 0x7ffdc91a6884 px : 0x7ffdc91a6884 Dans cet exemple, l' opérateur & est utilisé pour obtenir l'adresse mémoire de la variable x , qui est stockée dans le pointeur px . La valeur de x est alors accessible directement par le pointeur à l'aide de l' opérateur comme ceci : *px = 20 ; std::cout << "x: " << x << std::endl; *, La sortie de ce code sera : x : 20 Notez que l' opérateur & a une priorité plus élevée que l' opérateur * , il est donc évalué avant l' opérateur * . Par exemple, l'expression *&x est équivalente à x , alors que l'expression &*x est équivalente à x si x est un pointeur, Opérateurs d'affectation En C++, les opérateurs d'affectation sont utilisés pour affecter une valeur à une variable. L'opérateur d'affectation le plus basique est l' opérateur = , qui affecte la valeur de l'opérande de droite à l'opérande de gauche. C++ possède également un certain nombre d'opérateurs d'affectation composés, qui effectuent une opération sur l'opérande de gauche et affectent le résultat à l'opérande de gauche. Ces opérateurs comprennent : : Ajouter l'opérande de droite à l'opérande de gauche et affecter le résultat à l'opérande de gauche. += : Soustrayez l'opérande de droite de l'opérande de gauche et affectez le résultat à l'opérande de gauche. -= : Multipliez l'opérande de gauche par l'opérande de droite et affectez le résultat à l'opérande de gauche. *= : divise l'opérande de gauche par l'opérande de droite et affecte le résultat à l'opérande de gauche. /= : Calcule le reste de l'opérande de gauche divisé par l'opérande de droite et affecte le résultat à l'opérande de gauche. %= Voici un exemple d'utilisation des opérateurs d'affectation en C++ : Opérateur ET au niveau du bit : & En C++, l' opérateur & est l'opérateur ET au niveau du bit, qui effectue une opération ET au niveau du bit sur deux opérandes et renvoie le résultat. C'est un opérateur binaire qui prend deux opérandes de type intégral et renvoie un résultat du même type que les opérandes. L'opérateur ET au niveau du bit compare chaque bit du premier opérande au bit correspondant du deuxième opérande, et si les deux bits sont 1, le bit de résultat correspondant est défini sur 1. Sinon, le bit de résultat est défini sur 0. Voici un exemple d'utilisation de l'opérateur ET au niveau du bit en C++ : La sortie de ce programme sera : x&y=0 Dans cet exemple, l'opérateur AND au niveau du bit est utilisé pour effectuer une opération AND au niveau du bit sur les variables x et y . Le résultat est stocké dans la variable z , qui a une valeur de 0 en décimal. Notez que l'opérateur ET au niveau du bit a une priorité plus élevée que l' opérateur = , il est donc évalué avant l'affectation. Par exemple, l'expression x = y & z est équivalente à x = (y & z) , alors que l'expression x &= y est équivalente à x = x & y . Opérateur OU exclusif au niveau du bit : ^ En C++, l' opérateur ^ est l'opérateur OR exclusif au niveau du bit (XOR), qui effectue une opération XOR au niveau du bit sur deux opérandes et renvoie le résultat. C'est un opérateur binaire qui prend deux opérandes de type intégral et renvoie un résultat du même type que les opérandes. L'opérateur XOR au niveau du bit compare chaque bit du premier opérande au bit correspondant du deuxième opérande, et si l'un des bits est 1 et l'autre est 0, le bit de résultat correspondant est défini sur 1. Sinon, le bit de résultat est défini à 0. Voici un exemple d'utilisation de l'opérateur XOR au niveau du bit en C++ : La sortie de ce programme sera : x ^ y = 15 Dans cet exemple, l'opérateur XOR au niveau du bit est utilisé pour effectuer une opération XOR au niveau du bit sur les variables x et y . Le résultat est stocké dans la variable z , qui a une valeur de 15 en décimal. Notez que l'opérateur XOR au niveau du bit a une priorité plus élevée que l' opérateur = , il est donc évalué avant l'affectation. Par exemple, l'expression x = y ^ z est équivalente à x = (y ^ z) , alors que l'expression x ^= y est équivalente à x = x ^ y . Opérateur OU inclusif au niveau du bit : | En C++, le | L'opérateur est l'opérateur OU inclusif au niveau du bit (OU), qui effectue une opération OU au niveau du bit sur deux opérandes et renvoie le résultat. C'est un opérateur binaire qui prend deux opérandes de type intégral et renvoie un résultat du même type que les opérandes. L'opérateur OU au niveau du bit compare chaque bit du premier opérande au bit correspondant du deuxième opérande, et si l'un des bits est 1, le bit de résultat correspondant est défini sur 1. Sinon, le bit de résultat est défini sur 0. Voici un exemple d'utilisation de l'opérateur OR au niveau du bit en C++ : La sortie de ce programme sera : x | y = 15 Dans cet exemple, l'opérateur OU au niveau du bit est utilisé pour effectuer une opération OU au niveau du bit sur les variables x et y . Le résultat est stocké dans la variable z , qui a une valeur de 15 en décimal. Notez que l'opérateur OU au niveau du bit a une priorité plus élevée que l' opérateur = , il est donc évalué avant l'affectation. Par exemple, l'expression x = y | z est équivalent à x = (y | z) , alors que l'expression x |= y est équivalente à x = x | y . Opérateur Cast : () En C++, l' opérateur () est l'opérateur de cast, qui est utilisé pour convertir explicitement une valeur d'un type à un autre. C'est un opérateur unaire qui prend un seul opérande et un type comme opérandes, et renvoie une valeur du type spécifié. L'opérateur cast est utilisé pour convertir une valeur d'un type à un autre lorsqu'une conversion implicite n'est pas possible ou souhaitée. Il est souvent utilisé pour convertir des valeurs entre des types de base, tels que des entiers et des nombres à virgule flottante, ou pour convertir des pointeurs entre différents types. Voici un exemple d'utilisation de l'opérateur cast en C++ : La sortie de ce programme sera : y=3 Dans cet exemple, l'opérateur cast est utilisé pour convertir la variable x , qui a un type de double , en int et stocker le résultat dans la variable y . La valeur de x est tronquée en entier lorsqu'elle est convertie en . Notez que l'opérateur cast a une priorité plus élevée que l' opérateur = , il est donc évalué avant l'affectation. Par exemple, l'expression x = (int)y est équivalente à x = (int)(y) , tandis que l'expression int(y) est également équivalente à x = (int)(y) . int x= C++ fournit également un certain nombre d'opérateurs de conversion de type sécurisé, tels que dynamic_cast , static_cast , const_cast et reinterpret_cast , qui effectuent des types de conversions plus spécialisés. Ces opérateurs sont souvent utilisés conjointement avec l'héritage et le polymorphisme pour effectuer des conversions entre types apparentés. Opérateur de virgule : , En C++, l' opérateur , est l'opérateur virgule, qui sépare deux ou plusieurs opérandes et les évalue de gauche à droite. C'est un opérateur binaire qui prend deux opérandes ou plus et renvoie la valeur de l'opérande de droite. L'opérateur virgule est souvent utilisé pour inclure plusieurs expressions dans une seule instruction, où chaque expression est séparée par une virgule. Seule la valeur de l'opérande de droite est utilisée dans le résultat final, tandis que les valeurs des autres opérandes sont ignorées. Voici un exemple d'utilisation de l'opérateur virgule en C++ : La sortie de ce programme sera : z = 32 Dans cet exemple, l'opérateur virgule est utilisé pour évaluer les expressions x++ et y++ , qui incrémentent les valeurs de x et y , respectivement. La valeur de x + y est ensuite calculée et affectée à la variable z . Notez que l'opérateur virgule a une priorité inférieure à la plupart des autres opérateurs, il est donc généralement évalué après les autres opérateurs. Par exemple, l'expression x = y, z est équivalente à z , alors que l'expression x = y + z est équivalente à x = (y + z) . (x = y), Opérateur conditionnel : ? : En C++, le ? : L'opérateur est l'opérateur conditionnel, également appelé opérateur ternaire, qui est utilisé pour évaluer une expression conditionnelle. C'est un opérateur ternaire qui prend trois opérandes et renvoie une valeur basée sur le résultat de l'expression conditionnelle. L'opérateur conditionnel est souvent utilisé comme forme abrégée d'une instruction if , où le premier opérande est une condition booléenne, le deuxième opérande est la valeur à renvoyer si la condition est vraie et le troisième opérande est la valeur à renvoyer si la condition est fausse. Voici un exemple d'utilisation de l'opérateur conditionnel en C++ : La sortie de ce programme sera : z = 10 Dans cet exemple, l'opérateur conditionnel est utilisé pour évaluer la condition x < y . Si la condition est vraie, la valeur de x est renvoyée ; sinon, la valeur de y est renvoyée. Le résultat est stocké dans la variable z . Notez que l'opérateur conditionnel a une priorité inférieure à l'opérateur d'affectation, il est donc généralement évalué après l'affectation. Par exemple, l'expression x = y ? z : w est équivalent à x = (y ? z : w) , alors que l'expression x ? y = z : w = t est équivalent à (x ? (y = z) : (w = t)) . opérateur de suppression En C++, l' opérateur delete est utilisé pour libérer de la mémoire précédemment allouée par l' opérateur new . C'est un opérateur unaire qui prend un pointeur comme opérande et libère la mémoire pointée par le pointeur. L' opérateur de suppression est utilisé pour libérer la mémoire occupée par un objet ou un tableau créé à l'aide de l' opérateur new . Il est important d'utiliser l' opérateur de suppression pour libérer de la mémoire lorsqu'elle n'est plus nécessaire, afin d'éviter les fuites de mémoire et d'autres problèmes liés à la mémoire. Voici un exemple d'utilisation de l' opérateur delete en C++ : Dans cet exemple, le nouvel opérateur est utilisé pour allouer dynamiquement de la mémoire pour un objet int et affecter l'adresse de l'objet au pointeur p . La valeur de l'objet est alors initialisée à 10. L' opérateur de suppression est alors utilisé pour désallouer la mémoire pointée par p . Notez que l' opérateur de suppression ne doit être utilisé que pour libérer de la mémoire précédemment allouée à l'aide de l' opérateur new . Il ne doit pas être utilisé pour libérer de la mémoire qui a été allouée sur la pile ou en utilisant d'autres techniques de gestion de la mémoire, telles que malloc() et free() . Opérateurs d'égalité : == et != En C++, les opérateurs == et != sont respectivement les opérateurs d'égalité et d'inégalité, qui sont utilisés pour comparer deux valeurs d'égalité ou d'inégalité. Ce sont des opérateurs binaires qui prennent deux opérandes et renvoient une valeur booléenne indiquant si les opérandes sont égaux ou inégaux. L'opérateur d'égalité == compare les valeurs de ses opérandes et renvoie vrai s'ils sont égaux et faux s'ils ne sont pas égaux. L'opérateur d'inégalité != compare les valeurs de ses opérandes et renvoie vrai s'ils ne sont pas égaux, et faux s'ils sont égaux. Voici un exemple d'utilisation des opérateurs d'égalité et d'inégalité en C++ : La sortie de ce programme sera : x x x x == y : 0 != y : 1 == z : 1 != z : 0 Dans cet exemple, les opérateurs d'égalité et d'inégalité sont utilisés pour comparer les valeurs des variables x , y et z . Les résultats des comparaisons sont imprimés sur la console. Notez que les opérateurs d'égalité et d'inégalité ont une priorité inférieure à la plupart des autres opérateurs, ils sont donc généralement évalués après les autres opérateurs. Par exemple, l'expression y == z est équivalente à x = (y == z) , alors que l'expression x == y = z est équivalente à (x == (y = z)) . x= Opérateur de conversion de type explicite : () En C++, l' opérateur () est l'opérateur de conversion de type explicite, qui est utilisé pour convertir explicitement une valeur d'un type à un autre. C'est un opérateur unaire qui prend un seul opérande et un type comme opérandes, et renvoie une valeur du type spécifié. L'opérateur de conversion de type explicite est utilisé pour convertir une valeur d'un type à un autre lorsqu'une conversion implicite n'est pas possible ou souhaitée. Il est souvent utilisé pour convertir des valeurs entre des types de base, tels que des entiers et des nombres à virgule flottante, ou pour convertir des pointeurs entre différents types. Voici un exemple d'utilisation de l'opérateur de conversion de type explicite en C++ : La sortie de ce programme sera : y=3 Dans cet exemple, l'opérateur de conversion de type explicite est utilisé pour convertir la variable x , qui a un type de double , en int et stocker le résultat dans la variable y . La valeur de x est tronquée en entier lorsqu'elle est convertie en int . Notez que l'opérateur de conversion de type explicite a une priorité plus élevée que l' opérateur = , il est donc évalué avant l'affectation. Par exemple, l'expression x = int(y) est équivalente à x = (int)(y) , tandis que l'expression x = y + int(z) est équivalente à x = (y + (int)(z)) . C++ fournit également un certain nombre d'opérateurs de conversion de type sécurisé, tels que dynamic_cast , static_cast , const_cast et reinterpret_cast , qui effectuent des types de conversions plus spécialisés. Ces opérateurs sont souvent utilisés conjointement avec l'héritage et le polymorphisme pour effectuer des conversions entre types apparentés. Opérateur d'appel de fonction : () En C++, l' opérateur () est l'opérateur d'appel de fonction, qui est utilisé pour appeler une fonction et exécuter son code. C'est un opérateur unaire qui prend un nom de fonction et une liste d'arguments comme opérandes et renvoie une valeur du type de retour de la fonction. L'opérateur d'appel de fonction est utilisé pour invoquer une fonction et lui transmettre des arguments. Les arguments sont spécifiés entre parenthèses et sont séparés par des virgules. L'opérateur d'appel de fonction peut également être utilisé pour invoquer une fonction via un pointeur de fonction ou une fonction membre d'une classe. Voici un exemple d'utilisation de l'opérateur d'appel de fonction en C++ : La sortie de ce programme sera : z = 30 Dans cet exemple, la fonction add() est définie pour prendre deux arguments int et renvoyer leur somme. L'opérateur d'appel de fonction est ensuite utilisé pour invoquer la fonction add() et transmettre les valeurs de x et y comme arguments. Le résultat de l'appel de la fonction est stocké dans la variable z. Notez que l'opérateur d'appel de fonction a une priorité plus élevée que l'opérateur d'affectation, il est donc évalué avant l'affectation. Par exemple, l'expression x = add(y, z) est équivalente à x = (add(y, z)) , alors que l'expression x = y + add(z, w) est équivalente à x = (y + (add (z, w))) . Opérateur d'indirection : * En C++, l' opérateur * est l'opérateur d'indirection, également appelé opérateur de déréférencement, qui est utilisé pour accéder à la valeur stockée à une adresse mémoire. C'est un opérateur unaire qui prend un pointeur comme opérande et renvoie la valeur pointée par le pointeur. L'opérateur d'indirection est souvent utilisé en conjonction avec des pointeurs pour accéder à la valeur stockée à l'adresse mémoire pointée par le pointeur. Il est également utilisé pour déclarer des pointeurs, où il est placé devant le nom de la variable pour indiquer que la variable est un pointeur. Voici un exemple d'utilisation de l'opérateur d'indirection en C++ : La sortie de ce programme sera : x = 10 *p = 10 Dans cet exemple, le pointeur p est déclaré et initialisé à l'adresse de la variable x . L'opérateur d'indirection est alors utilisé pour accéder à la valeur stockée à l'adresse mémoire pointée par p , qui est la valeur de la variable x . Notez que l'opérateur d'indirection a une priorité plus élevée que l'opérateur d'affectation, il est donc évalué avant l'affectation. Par exemple, l'expression x = *p est équivalente à x = (*p) , tandis que l'expression x = *p + y est équivalente à x = (*p) + y . Opérateurs de décalage à gauche et à droite (>> et <<) En C++, les opérateurs << et >> sont respectivement les opérateurs de décalage vers la gauche et vers la droite, qui sont utilisés pour effectuer un décalage de bits sur des valeurs entières. Ce sont des opérateurs binaires qui prennent deux opérandes, une valeur entière et un nombre de décalages, et renvoient une valeur correspondant à la valeur d'origine décalée vers la gauche ou vers la droite du nombre de bits spécifié. L'opérateur de décalage à gauche << décale les bits de son premier opérande vers la gauche du nombre de positions spécifié dans le deuxième opérande. L'opérateur de décalage vers la droite >> décale les bits de son premier opérande vers la droite du nombre de positions spécifié dans le deuxième opérande. Voici un exemple d'utilisation des opérateurs de décalage vers la gauche et vers la droite en C++ : La sortie de ce programme sera : x << y = 80 x >> y = 1 Dans cet exemple, l'opérateur de décalage à gauche << est utilisé pour décaler les bits de la variable x vers la gauche de 3 positions, et l'opérateur de décalage à droite >> est utilisé pour décaler les bits de la variable x vers la droite de 3 positions . Les résultats des opérations de décalage sont imprimés sur la console. Notez que les opérateurs de décalage vers la gauche et vers la droite ont une priorité plus élevée que les opérateurs d'addition et de soustraction, ils sont donc généralement évalués avant ces opérateurs. Par exemple, l'expression x << y + z est équivalente à x << (y + z) , alors que l'expression x + y << z est équivalente à (x + y) << z . Opérateur ET logique : && En C++, l' opérateur && est l'opérateur ET logique, qui est utilisé pour effectuer une opération ET logique sur deux valeurs booléennes. C'est un opérateur binaire qui prend deux opérandes booléens et renvoie une valeur booléenne indiquant le résultat de l'opération logique ET. L'opérateur ET logique && effectue une évaluation en court-circuit de ses opérandes, ce qui signifie qu'il n'évalue le deuxième opérande que si le premier opérande est vrai . Si le premier opérande est faux , le deuxième opérande n'est pas évalué et le résultat de l' opérateur && est faux . Cela peut être utile pour optimiser le code et éviter les calculs inutiles. Voici un exemple d'utilisation de l'opérateur logique AND en C++ : La sortie de ce programme sera : x && y : 0 x && z : 1 y && z : 0 Dans cet exemple, l'opérateur logique ET && est utilisé pour effectuer des opérations logiques ET sur les variables x , y et z . Les résultats des opérations && sont imprimés sur la console. Notez que l'opérateur logique ET a une priorité plus élevée que l'opérateur logique OU || , il est donc généralement évalué avant le || opérateur. Par exemple, l'expression x && y || z est équivalent à (x && y) || z , alors que l'expression x || y && z est équivalent à `x || (y && z) Opérateur de négation logique : ! En C++, le ! L'opérateur est l'opérateur de négation logique, qui est utilisé pour nier une valeur booléenne. C'est un opérateur unaire qui prend un opérande booléen et renvoie la valeur négative. L'opérateur de négation logique l'opérande est vrai , le ! renvoie ! nie la valeur de son opérande en inversant sa valeur de vérité. Si , et si l'opérande est false , le ! l'opérateur renvoie vrai . false Voici un exemple d'utilisation de l'opérateur de négation logique en C++ : La sortie de ce programme sera : !x : 0 !y : 1 Dans cet exemple, l'opérateur de négation logique ! est utilisé pour inverser les valeurs des variables y . Les résultats du ! les opérations sont imprimées sur la console. x et Notez que l'opérateur de négation logique a une priorité plus élevée que les opérateurs logiques ET et OU && et || , il est donc généralement évalué avant ces opérateurs. Par exemple, l'expression !x && y est équivalente à (!x) && y , alors que l'expression x || !y est équivalent à x || (!y) . Opérateur logique OU : || En C++, le || L'opérateur est l'opérateur logique OU, qui est utilisé pour effectuer une opération logique OU sur deux valeurs booléennes. C'est un opérateur binaire qui prend deux opérandes booléens et renvoie une valeur booléenne indiquant le résultat de l'opération logique OU. L'opérateur logique OU || effectue une évaluation en court-circuit de ses opérandes, ce qui signifie qu'il n'évalue le deuxième opérande que si le premier opérande est faux . Si le premier opérande est true , le deuxième opérande n'est pas évalué et le résultat du || l'opérateur est vrai . Cela peut être utile pour optimiser le code et éviter les calculs inutiles. Voici un exemple d'utilisation de l'opérateur logique OR en C++ : La sortie de ce programme sera : x || y : 1 x || z : 1 y || z : 1 Dans cet exemple, l'opérateur logique OR || est utilisé pour effectuer des opérations OU logiques sur les variables x , y et z. Les résultats du || les opérations sont imprimées sur la console. Notez que l'opérateur logique OU a une priorité inférieure à l'opérateur logique ET && , il est donc généralement évalué après l' opérateur && . Par exemple, l'expression x || y && z est équivalent à x || (y && z) , alors que l'expression x && y || z est équivalent à (x && y) || z . Opérateurs d'accès membres : . et -> En C++, le . et -> les opérateurs sont les opérateurs d'accès aux membres, qui sont utilisés pour accéder aux membres de données et aux fonctions membres d'une classe ou d'un struct. Ce sont des opérateurs binaires qui prennent un objet ou un pointeur vers un objet comme opérande gauche et le nom d'un membre de données ou d'une fonction membre comme opérande droit. Le . L'opérateur est utilisé pour accéder aux membres de données et aux fonctions membres d'un objet, tandis que l' opérateur -> est utilisé pour accéder aux membres de données et aux fonctions membres d'un pointeur vers un objet. L' opérateur -> équivaut à utiliser l' opérateur * pour déréférencer le pointeur et le . opérateur pour accéder au membre de données ou à la fonction membre. Voici un exemple d'utilisation des opérateurs d'accès aux membres en C++ : La sortie de ce programme sera : (30, 40) (70, 80) Dans cet exemple, la classe Point est définie avec deux données membres x et y , et deux fonctions membres set() et print() . La fonction main() crée un objet Point p et un pointeur vers un objet Point q . Les opérateurs d'accès membres membres des objets p et q . . et -> sont utilisés pour accéder aux données membres et aux fonctions Notez que les opérateurs d'accès aux membres ont une priorité plus élevée que l'opérateur d'affectation = , ils sont donc généralement évalués avant l'affectation. Par exemple, l'expression px = y est équivalente à (px) = y , alors que l'expression x = py est équivalente à x = (py) . Opérateurs multiplicatifs et opérateur de module En C++, les opérateurs * , / et % sont respectivement les opérateurs multiplicatifs et l'opérateur de module, qui sont utilisés pour effectuer des opérations de multiplication, de division et de module sur des valeurs entières et à virgule flottante. Ce sont des opérateurs binaires qui prennent deux opérandes et renvoient une valeur qui est le résultat de l'opération de multiplication, de division ou de module. L' opérateur * est l'opérateur de multiplication, qui multiplie ses opérandes et renvoie le produit. L' opérateur / est l'opérateur de division, qui divise son premier opérande par son deuxième opérande et renvoie le quotient. L' opérateur % est l'opérateur de module, qui renvoie le reste de la division de son premier opérande par son deuxième opérande. Voici un exemple d'utilisation des opérateurs multiplicatifs et de l'opérateur de module en C++ : La sortie de ce programme sera : x * y = 30 x/y=3 x%y=1 x * z = 55 x / z = 1,81818 z / x = 0,55 Dans cet exemple, les opérateurs multiplicatifs * , / et % sont utilisés pour effectuer des opérations de multiplication, de division et de module sur les variables x , y et z . Les résultats des opérations sont imprimés sur la console. Notez que les opérateurs multiplicatifs et l'opérateur de module ont une priorité plus élevée que les opérateurs additifs + et - , ils sont donc généralement évalués avant ces opérateurs. Par exemple, l'expression x * y + z est équivalente à (x * y) + z , tandis que l'expression x + y * z est équivalente à x + (y * z) . nouvel opérateur En C++, le nouvel opérateur est utilisé pour allouer dynamiquement de la mémoire à partir du tas pour un objet ou un tableau d'objets. Il s'agit d'un opérateur unaire qui prend un type et une expression d'initialisation facultative comme opérande et renvoie un pointeur vers la mémoire nouvellement allouée. L' opérateur new est souvent utilisé pour créer des objets qui ont une durée de vie plus longue que les variables locales, ou pour créer des objets qui sont plus grands que la mémoire de pile disponible. Il est généralement associé à l' opérateur de suppression pour libérer la mémoire lorsqu'elle n'est plus nécessaire. Voici un exemple d'utilisation de l' opérateur new en C++ : La sortie de ce programme sera : p: (10, 20) q[0] : (1, 2) q[4] : (9, 10) Dans cet exemple, le nouvel opérateur est utilisé pour allouer dynamiquement de la mémoire pour un seul objet Point et un tableau d' objets Point . L' opérateur de suppression est utilisé pour libérer la mémoire lorsqu'elle n'est plus nécessaire. Les opérateurs d'accès aux membres -> et [] sont utilisés pour accéder aux données membres des objets. Notez que le nouvel opérateur lève une exception std::bad_alloc s'il ne parvient pas à allouer la mémoire demandée, il est donc généralement utilisé dans un bloc try-catch pour gérer l'exception. Il est également recommandé d'utiliser les opérateurs new et delete de manière cohérente, car leur mélange avec les fonctions malloc() et free() de la bibliothèque standard C peut entraîner un comportement indéfini. Opérateur complément à un : ~ En C++, l' opérateur ~ est l'opérateur de complément à un, qui est utilisé pour effectuer une opération NOT au niveau du bit sur une valeur entière. C'est un opérateur unaire qui prend un opérande entier et renvoie une valeur entière qui est le résultat de l'opération NOT au niveau du bit. L'opérateur de complément à un ~ annule la valeur de son opérande en retournant tous ses bits. Si l'opérande est un entier de n bits, l' opérateur ~ renvoie un entier de n bits dont tous les bits sont inversés. Par exemple, le complément à un de 0000 1100 (12 en décimal) est 1111 0011 (243 en décimal). Voici un exemple d'utilisation de l'opérateur complément à un en C++ : La sortie de ce programme sera : x : 12 y : -13 Dans cet exemple, l'opérateur de complément à un ~ est utilisé pour annuler la valeur de la variable Le résultat de l' opération ~ est stocké dans la variable y et imprimé sur la console. x. Notez que l'opérateur de complément à un a une priorité plus élevée que les opérateurs AND, OR et XOR au niveau du bit & , | , et ^ , il est donc généralement évalué avant ces opérateurs. Par exemple, l'expression ~x & y est équivalente à (~x) & y , alors que l'expression x | ~y est équivalent à x | (~y) . Opérateurs pointeur vers membre : .* et ->* En C++, l' opérateur .* et l'opérateur struct via un pointeur vers l'objet. ->* sont utilisés pour accéder à un membre d'une classe ou d'un L' opérateur .* est utilisé lorsque l'objet lui-même est un pointeur, tandis que l' opérateur ->* est utilisé lorsque l'objet est un objet réel et que vous souhaitez accéder à un membre via un pointeur vers l'objet. Voici un exemple d'utilisation de ces opérateurs : Le résultat de ce programme serait : sx = 10 sy = 3,14 (p->*px) = 10 (p->*py) = 3,14 (s.*px) = 10 (s.*py) = 3,14 Dans cet exemple, nous avons une structure S avec deux membres : x et y . Nous créons un objet s de type S et un pointeur p vers s . Nous définissons également deux pointeurs vers les membres de S , px et py , qui pointent respectivement vers les membres x et y . Nous pouvons accéder aux membres x et y de s directement en utilisant l'opérateur point . , et nous pouvons y accéder via le pointeur p en utilisant l' opérateur ->* . Nous pouvons également accéder aux membres x et y de s via le pointeur vers l'objet lui-même en utilisant l' opérateur . * . Opérateurs d'incrémentation et de décrémentation suffixés : ++ et -En C++, l'opérateur d'incrémentation postfixé ( ++ ) et l'opérateur de décrémentation postfixé ( -- ) sont utilisés pour incrémenter ou décrémenter la valeur d'une variable de 1. Ces opérateurs sont appelés "postfixés" car ils viennent après l'opérande (la variable dont la valeur est incrémentée ou décrémentée). Voici un exemple d'utilisation de ces opérateurs : Le résultat de ce programme serait : x = 10 y = 10 x++ = 10 y-- = 10 x = 11 y=9 Dans cet exemple, nous avons deux variables x et y , toutes deux initialisées à 10. Nous utilisons l'opérateur d'incrémentation postfixé x++ pour incrémenter la valeur de x de 1, et nous utilisons l'opérateur de décrémentation postfixé y-- pour décrémenter la valeur de y de 1. Les opérateurs suffixés d'incrémentation et de décrémentation renvoient la valeur de l'opérande avant qu'il ne soit incrémenté ou décrémenté. C'est pourquoi la sortie de x++ et y-- est 10, même si les valeurs de x et y sont respectivement incrémentées et décrémentées. Il est important de noter que les opérateurs d'incrémentation et de décrémentation suffixés ont une priorité inférieure à la plupart des autres opérateurs, ils sont donc souvent utilisés en combinaison avec d'autres opérateurs. Par exemple: Dans cet exemple, la valeur de c est calculée comme 10 + 20 = 30 , et la valeur de a est incrémentée à 11 une fois le calcul terminé. De même, la valeur de d est calculée comme 11 - 20 = -1 , et la valeur de a est décrémentée à 10 une fois le calcul terminé. Opérateurs d'incrémentation et de décrémentation préfixés : ++ et -En C++, l'opérateur d'incrémentation de préfixe ( ++ ) et l'opérateur de décrémentation de préfixe ( -- ) sont utilisés pour incrémenter ou décrémenter la valeur d'une variable de 1. Ces opérateurs sont appelés "préfixe" car ils viennent avant l'opérande (la variable dont la valeur est incrémentée ou décrémentée). Voici un exemple d'utilisation de ces opérateurs : Le résultat de ce programme serait : x = 10 y = 10 ++x = 11 --y = 9 x = 11 y=9 Dans cet exemple, nous avons deux variables x et y , toutes deux initialisées à 10. Nous utilisons l'opérateur d'incrémentation de préfixe ++x pour incrémenter la valeur de x de 1, et nous utilisons l'opérateur de décrémentation de préfixe --y pour décrémenter la valeur de y par 1. Les opérateurs d'incrémentation et de décrémentation de préfixe renvoient la valeur de l'opérande après l'avoir incrémenté ou décrémenté. C'est pourquoi la sortie de ++x et --y est 11 et 9, respectivement, même si les valeurs de x et y sont incrémentées et décrémentées avant que la sortie ne soit produite. Il est important de noter que les opérateurs d'incrémentation et de décrémentation préfixés ont une priorité plus élevée que la plupart des autres opérateurs, ils sont donc souvent utilisés en combinaison avec d'autres opérateurs. Par exemple: Dans cet exemple, la valeur de 20 = 31 . De même, la valeur de 10 - 20 = -10 . a a est incrémentée à 11 avant que la valeur de est décrémentée à 10 avant que la valeur de c d soit calculée comme 11 + ne soit calculée comme Opérateurs relationnels : <, >, <= et >= En C++, les opérateurs relationnels < , > , <= et >= sont utilisés pour comparer les valeurs de deux opérandes. Ces opérateurs renvoient une valeur booléenne indiquant si la comparaison est vraie ou fausse. Voici un exemple d'utilisation de ces opérateurs : Le résultat de ce programme serait : (x (x (x (x (x (x < y) = 1 > y) = 0 <= y) = 1 >= y) = 0 == z) = 1 != z) = 0 Dans cet exemple, nous avons trois variables : x , y et z . Nous utilisons les opérateurs relationnels pour comparer les valeurs de x et y , ainsi que les valeurs de x et z . L'opérateur relationnel < renvoie true si la valeur de l'opérande gauche est inférieure à la valeur de l'opérande droit, et false sinon. L'opérateur relationnel > renvoie true si la valeur de l'opérande gauche est supérieure à la valeur de l'opérande droit, et false sinon. L'opérateur relationnel <= renvoie true si la valeur de l'opérande de gauche est inférieure ou égale à la valeur de l'opérande de droite, et false sinon. L'opérateur relationnel >= renvoie true si la valeur de l'opérande gauche est supérieure ou égale à la valeur de l'opérande droit, et false sinon. L'opérateur relationnel == renvoie true si la valeur de l'opérande gauche est égale à la valeur de l'opérande droit, et false sinon. L'opérateur relationnel != renvoie true si la valeur de l'opérande de gauche n'est pas égale à la valeur de l'opérande de droite, et false sinon. Il est important de noter que les opérateurs relationnels ont une priorité inférieure à la plupart des autres opérateurs, ils sont donc souvent utilisés en combinaison avec d'autres opérateurs. Par exemple: int a = 10 ; entier b = 20 ; si (a < b && b > a) { std::cout << "a est inférieur à b et b est supérieur à a" << std::endl; } si (une == b || une != b) { std::cout << "a est soit égal à b soit différent de b" << std::endl; } Dans cet exemple, la première instruction if sera vraie car les deux conditions Opérateur de résolution de portée : :: En C++, l'opérateur de résolution de portée ( :: ) est utilisé pour spécifier la portée dans laquelle un nom est défini. Il est utilisé pour qualifier le nom d'une classe, d'une fonction ou d'une variable, et est souvent utilisé pour accéder à un nom défini dans une portée différente. Voici un exemple d'utilisation de l'opérateur de résolution de portée : Le résultat de ce programme serait : x = 20 ::x = 10 Dans cet exemple, nous avons une variable globale x et une variable locale x dans la fonction main . La variable locale x est définie dans la portée de la fonction principale , tandis que la variable globale x est définie en dehors de toute fonction et se trouve donc dans la portée globale. Nous utilisons l'opérateur de résolution de portée :: pour spécifier la portée globale lors de l'accès à la variable globale x . Sans l'opérateur de résolution de portée, la variable locale x serait accessible à la place. L'opérateur de résolution de portée peut également être utilisé pour accéder à un nom défini dans un espace de noms différent : Le résultat de ce programme serait : x = 20 NS1 ::x = 10 NS2 ::x = 20 Dans cet exemple, nous avons deux espaces de noms, NS1 et NS2 , chacun avec une variable x . La variable x dans NS2 est définie dans le périmètre de la fonction principale , tandis que la variable x dans NS1 est définie en dehors de toute fonction et est donc dans le périmètre global. Nous utilisons l'opérateur de résolution de portée :: pour spécifier l'espace de noms lors de l'accès aux variables x dans NS1 et NS2 . Sans l'opérateur de résolution de portée, la variable locale x dans NS2 serait accessible à la place. taille de l'opérateur En C++, l' opérateur sizeof est utilisé pour déterminer la taille, en octets, d'un type de données ou d'une expression. Il est souvent utilisé pour allouer dynamiquement de la mémoire ou pour déterminer la taille d'un tableau. Voici un exemple d'utilisation de l' opérateur sizeof : #include <iostream> #include <tableau> int main() { std::cout << "sizeof(int) = " << sizeof(int) << " octets" << std::endl; std::cout << "sizeof(double) = " << sizeof(double) << " octets" << std::endl; std::array<int, 10> arr ; std::cout << "sizeof(arr) = " << sizeof(arr) << " bytes" << std::endl; int* p = nouveau int[10] ; std::cout << "sizeof(p) = " << sizeof(p) << " octets" << std::endl; supprimer [] p ; renvoie 0 ; } La sortie de ce programme dépendra de la machine et du compilateur utilisés, mais cela pourrait ressembler à ceci : sizeof(entier) = 4 octets sizeof(double) = 8 octets sizeof(arr) = 40 octets sizeof(p) = 8 octets Dans cet exemple, nous utilisons l' opérateur sizeof pour déterminer la taille de divers types de données et expressions. Nous l'utilisons pour déterminer la taille d'un int et d'un double , ainsi que la taille d'un std::array d' int s et d'un tableau d' int s alloué dynamiquement . Il est important de noter que l' opérateur sizeof n'évalue pas l'expression à laquelle il est appliqué. Il détermine simplement la taille du type de données ou de l'expression, quelle que soit sa valeur. Par exemple: int x = 10 ; std::cout << "sizeof(x + 20) = " << sizeof(x + 20) << " bytes" << std::endl; Le résultat de ce programme serait : sizeof(x + 20) = 4 octets Dans cet exemple, l'expression qui est de 4 octets. x + 20 n'est pas évaluée. L' opérateur sizeof détermine simplement la taille d'un int , Opérateur d'indice : En C++, l'opérateur d'indice ( [] ) est utilisé pour accéder à un élément d'un tableau ou d'une classe de conteneur. Il est utilisé pour spécifier l'index de l'élément auquel on accède. Voici un exemple de la façon dont l'opérateur d'indice peut être utilisé avec un tableau : Le résultat de ce programme serait : tab[0] tab[1] tab[2] tab[9] = = = = 1 2 3 10 Dans cet exemple, nous avons un tableau de int s appelé arr , avec 10 éléments. Nous utilisons l'opérateur d'indice [] pour accéder aux éléments du tableau, en spécifiant l'index de l'élément auquel nous voulons accéder. Le premier élément du tableau a un index de 0, le deuxième élément a un index de 1, et ainsi de suite. L'opérateur d'indice peut également être utilisé avec des classes de conteneur qui fournissent des surcharges d'opérateur d'indice, telles que std::vector et std::map . Par exemple: Le résultat de ce programme serait : vec[0] = 1 vec[1] = 2 m["un"] = 1 m["deux"] = 2 Dans cet exemple, nous avons un std::vector d' int s appelé vec et un std::map d' int s appelé m . Nous utilisons l'opérateur d'indice [] pour accéder aux éléments du vecteur et de la carte , en spécifiant l'index de l'élément auquel nous voulons accéder. Les indices d'un vecteur sont des valeurs entières commençant à 0, tandis que les indices d'une carte sont des clés du type approprié (dans ce cas, std::string ). Il est important de noter que l'opérateur d'indice peut être utilisé à la fois pour lire et écrire dans les éléments d'un tableau ou d'un conteneur. Par exemple: arr[0] opérateur typeid dans En C++, l' opérateur typeid est utilisé pour déterminer le type d'une expression lors de l'exécution. Il renvoie un objet std :: type_info qui décrit le type de l'expression. Voici un exemple d'utilisation de l' opérateur typeid : La sortie de ce programme dépendra de l'implémentation, mais cela pourrait ressembler à ceci : typeid(x).nom() = je typeid(y).nom() = d typeid(z).name() = NSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE Dans cet exemple, nous avons trois variables : x de type int , y de type double et z de type std::string . Nous utilisons l' opérateur typeid pour déterminer le type de chaque variable au moment de l'exécution, et nous utilisons la fonction membre name de l'objet std::type_info qui est renvoyé pour obtenir le nom du type. Il est important de noter que l' opérateur typeid ne peut être utilisé qu'avec des expressions qui ont un type défini. Il ne peut pas être utilisé avec des expressions qui ont un type indéfini ou incomplet, telles que des variables non initialisées ou des variables avec des types de classe incomplets. Par exemple: entier x ; std::cout << "typeid(x).name() = " << typeid(x).name() << std::endl; // erreur : x a un type indéfini Dans cet exemple, la variable x a un type indéfini car elle n'est pas initialisée. Tenter d'utiliser l' opérateur typeid sur x entraînerait une erreur de compilation. Opérateurs unaires plus et négation : + et En C++, les opérateurs unaires plus et négation ( + et - ) sont utilisés pour effectuer des opérations arithmétiques sur un seul opérande. L'opérateur unaire plus renvoie la valeur de l'opérande, tandis que l'opérateur de négation unaire renvoie la négation de la valeur de l'opérande. Voici un exemple d'utilisation de ces opérateurs : Le résultat de ce programme serait : +x = 10 -x = -10 +y = -20 -y = 20 Dans cet exemple, nous avons deux variables : -20. x et y . x a une valeur de 10, tandis que y a une valeur de Nous utilisons l'opérateur unaire plus + pour renvoyer la valeur de x , qui est 10. Nous utilisons l'opérateur de négation unaire - pour renvoyer la négation de la valeur de x , qui est -10. Nous utilisons l'opérateur unaire plus + pour renvoyer la valeur de y , qui est -20. Nous utilisons l'opérateur de négation unaire - pour renvoyer la négation de la valeur de y , qui est 20. Il est important de noter que l'opérateur unaire plus n'effectue aucune opération arithmétique, il renvoie simplement la valeur de l'opérande. Il est souvent utilisé pour indiquer explicitement qu'une valeur est positive, en particulier lorsque la valeur est entourée d'autres opérateurs arithmétiques. Par exemple: int a = 10 ; entier b = 20 ; entier c = -30 ; std::cout << a + b - c << std :: endl; // sortie : 40 std::cout <<a + +b - c << std::endl; // sortie : 50 Dans le premier exemple, l'expression 40. a+b-c est évaluée comme 10 + 20 - (-30) , ce qui donne une valeur de Dans le deuxième exemple, l'expression a + +b - c est évaluée comme 10 + (+20) - (-30) , ce qui donne une valeur de 50. L'opérateur unaire plus est utilisé pour indiquer explicitement que la valeur de b est positif, même s'il s'agit déjà d'une valeur positive. Expressions En C++, une expression est une combinaison d'un ou plusieurs opérandes et opérateurs qui peuvent être évalués en une seule valeur. Les expressions peuvent être simples, comme une valeur constante ou une variable, ou elles peuvent être complexes, impliquant plusieurs opérations et appels de fonction. Voici quelques exemples d'expressions en C++ : 1 + 2 // expression simple, vaut 3 x + y // expression simple, évalue à la somme de x et y f(x) // expression d'appel de fonction, évalue la valeur de retour de la fonction f x + y * z // expression complexe, correspond à la somme de x et au produit de y et z Les expressions peuvent être utilisées dans divers contextes en C++, notamment comme partie droite d'une instruction d'affectation, comme argument d'une fonction ou comme partie d'une expression plus large. Par exemple: int x = 1 + 2 ; // instruction d'affectation, x reçoit la valeur 3 int y = f(x + 3); // appel de fonction, y reçoit la valeur de retour de f(x + 3) if (x > 0 && y < 10) // instruction conditionnelle, teste si x est supérieur à 0 et y est inférieur à 10 std::cout << "x est positif et y est inférieur à 10" << std::endl; Il est important de noter que les expressions peuvent avoir des effets secondaires, comme la modification de la valeur d'une variable ou l'exécution d'une autre action. Par exemple: entier x = 1 ; entier y = x++ ; // y reçoit la valeur de x avant que x ne soit incrémenté std::cout << "x = " << x << " y = " << y << std::endl; // sortie : x = 2 y = 1 Dans cet exemple, l'expression x++ incrémente la valeur de x après avoir été utilisée pour affecter une valeur à y . La sortie du programme est x = 2 y = 1 , indiquant que x a été incrémenté après avoir été utilisé pour attribuer une valeur à y . Chapitre six Types d'expressions En C++, il existe plusieurs types d'expressions, chacune avec sa propre syntaxe et ses propres règles d'évaluation. Certains types d'expressions courants incluent : Expressions arithmétiques : ces expressions impliquent des opérations arithmétiques, telles que l'addition, la soustraction, la multiplication et la division. Ils peuvent inclure des constantes, des variables et d'autres expressions arithmétiques comme opérandes. Par exemple : 1 + 2 , x + y , x * y / z . Expressions relationnelles : ces expressions impliquent des opérateurs de comparaison, tels que < , > , <= et >= , et donnent une valeur booléenne indiquant si la comparaison est vraie ou fausse. Ils peuvent inclure des constantes, des variables et d'autres expressions arithmétiques comme opérandes. Par exemple : x < y , a <= b , c > d . Expressions logiques : ces expressions impliquent des opérateurs logiques, tels que && (et), || (ou), et ! (non) et évalue à une valeur booléenne indiquant si l'opération logique est vraie ou fausse. Ils peuvent inclure des constantes, des variables et d'autres expressions logiques comme opérandes. Par exemple : x && y , un || b , !c . Expressions d'affectation : ces expressions impliquent l'opérateur d'affectation = et sont utilisées pour affecter une valeur à une variable. Ils peuvent inclure des constantes, des variables, Expressions primaires En C++, une expression primaire est une expression simple qui peut être autonome et ne nécessite aucun opérateur supplémentaire pour être évaluée. Les expressions principales incluent les littéraux, les variables, les appels de fonction et les expressions d'accès aux objets ou aux membres. Voici quelques exemples d'expressions primaires en C++ : Littéraux : les constantes telles que les littéraux entiers ( 42 ), les littéraux à virgule flottante ( 3.14 ), les littéraux caractères ( 'a' ) et les littéraux chaîne ( "hello" ) sont toutes des expressions primaires. Variables : les variables telles que x , y et z sont des expressions principales. Appels de fonction : les appels de fonction tels que f(x, y, z) sont des expressions principales. Expressions d'accès à un objet ou à un membre : les expressions qui accèdent à un objet ou à un membre d'un objet, telles que obj.x , ptr->y et arr[i] , sont des expressions principales. Les expressions primaires sont souvent utilisées comme opérandes dans des expressions plus grandes, mais elles peuvent également être utilisées seules. Par exemple: int x = 10 ; y double = 3,14 ; std::string z = "bonjour" ; std::cout std::cout std::cout std::cout << << << << x << std::endl; // expression primaire : variable x y << std::endl; // expression primaire : variable y z << std::endl; // expression primaire : variable z f(x, y) << std::endl; // expression primaire : appel de fonction f(x, y) Dans cet exemple, nous avons trois variables : x de type int , y de type double et z de type std::string . Nous utilisons chacune de ces variables comme expression principale dans une instruction std::cout distincte . Nous utilisons également un appel de fonction f(x, y) comme expression principale. Il est important de noter que les expressions principales n'incluent pas les expressions qui nécessitent l'évaluation d'opérateurs supplémentaires, telles que les expressions arithmétiques ou les expressions logiques. Par exemple, x + y et x && y ne sont pas des expressions primaires. Modèles de points de suspension et variadiques En C++, des points de suspension ( ... ) sont utilisés pour indiquer une fonction variadique, qui est une fonction qui peut prendre un nombre variable d'arguments. Des points de suspension sont utilisés dans la liste des paramètres de la fonction pour indiquer le nombre variable d'arguments. Voici un exemple de fonction variadique en C++ : Dans cet exemple, nous avons une fonction appelée print_all qui prend un nombre variable d'arguments. Le premier argument est un const char* appelé fmt , qui spécifie le format des arguments restants. Les points de suspension ( ... ) dans la liste des paramètres indiquent qu'il peut y avoir n'importe quel nombre d'arguments supplémentaires. Dans la fonction, nous utilisons les macros va_list , va_start , va_arg et va_end pour accéder aux arguments de la variable. Le type va_list est utilisé pour contenir la liste des arguments, et la macro va_start est utilisée pour initialiser va_list avec le premier argument après fmt . La macro va_arg est utilisée pour récupérer le prochain argument de la liste, et la macro va_end est utilisée pour nettoyer la va_list lorsque nous en avons fini. Dans cet exemple, nous utilisons une boucle pour parcourir les caractères de la chaîne fmt . Si nous rencontrons un caractère % , nous incrémentons le pointeur sur la chaîne fmt et vérifions le caractère suivant pour déterminer le type de l'argument suivant. Si le caractère suivant est d , nous imprimons l'argument suivant sous la forme d'un int , si c'est s , nous imprimons l'argument suivant sous la forme d'un const char* , et si c'est f , nous imprimons l'argument suivant sous la forme d'un double . Le résultat de ce programme serait : 10 bonjour 3.14 Expressions postfixées En informatique, une expression postfixée est une expression dans laquelle chaque opérateur suit ses opérandes. Cela contraste avec une expression infixe, dans laquelle les opérateurs sont placés entre leurs opérandes. Par exemple, l'expression infixe "2 + 3 * 4" serait écrite comme "2 3 4 * +" en notation postfixée. Expressions avec opérateurs unaires Les opérateurs unaires sont des opérateurs qui agissent sur un seul opérande. En C++, il existe plusieurs opérateurs unaires, notamment : ++ (opérateur d'incrémentation) -- (opérateur de décrémentation) + (plus unaire) - (moins unaire) ! (NON logique) ~ * & (NON au niveau du bit) (opérateur de déréférencement) (opérateur de référence) Voici un exemple d'utilisation de l'opérateur d'incrémentation unaire ( L'opérateur de décrémentation unaire ( -- ++ ) en C++ : ) fonctionne de manière similaire. Vous pouvez utiliser les opérateurs unaires plus et moins pour modifier le signe d'une valeur : L'opérateur logique NOT ( ! ) peut être utilisé pour inverser la valeur de vérité d'une expression booléenne : L'opérateur NOT au niveau du bit ( ~ L'opérateur de déréférencement ( ) permet d'accéder à la valeur stockée à une adresse mémoire : L'opérateur de référence ( & * ) peut être utilisé pour inverser les bits d'une valeur entière : ) permet d'obtenir l'adresse mémoire d'une variable : Expressions avec opérateurs binaires Les opérateurs binaires sont des opérateurs qui agissent sur deux opérandes. En C++, il existe plusieurs opérateurs binaires, notamment : (ajout) + - (soustraction) * (multiplication) / (division) % (module) = (devoir) (affectation supplémentaire) += -= (affectation de soustraction) *= (affectation de multiplication) /= (affectation de division) %= (affectation de module) == (égal à) (différent de) != > (supérieur à) < (moins de) >= (supérieur ou égal à) <= (inférieur ou égal à) && (ET logique) || & | ^ (OU logique) (ET au niveau du bit) (OU au niveau du bit) (XOR au niveau du bit) << (décalage à gauche) >> (décalage à droite) Voici un exemple d'utilisation de certains de ces opérateurs en C++ : Expressions constantes En C++, une expression constante est une expression qui peut être évaluée au moment de la compilation, plutôt qu'au moment de l'exécution. Les expressions constantes sont généralement utilisées pour initialiser des variables avec des valeurs fixes ou pour spécifier des tailles de tableau. Il existe plusieurs façons de créer des expressions constantes en C++ : 1. Utilisation de constantes : toute valeur littérale (telle que constante. 42 , 3.14 ou 2. Utilisation de variables const : Une variable déclarée avec le mot-clé constante. Par exemple: const int x = 42 ; const double pi = 3,14 ; const char c = 'A'; 'A' ) est une expression const est une expression 3. Utilisation des variables constexpr : Une variable déclarée avec le mot-clé expression constante. Par exemple: constexpr est une constexpr int x = 42; constexpr double pi = 3,14 ; constexpr char c = 'A'; 4. Utilisation d'énumérations : les constantes d'énumération sont traitées comme des constantes en C++. Par exemple: enum Couleurs { Rouge, Vert, Bleu } ; constexpr Couleurs favoriteColor = Vert; 5. Utilisation des fonctions constexpr : Une fonction déclarée avec le mot-clé constexpr et répondant à certains critères (comme le fait d'avoir une seule instruction de retour) peut être utilisée dans des expressions constantes. Par exemple: constexpr entier carré(int x) { retourner x * x ; } constexpr int x = carré(5); // x vaut 25 Voici un exemple d'utilisation d'une expression constante pour initialiser un tableau en C++ : Sémantique des expressions En C++, la sémantique d'une expression fait référence à la signification et au comportement de l'expression lorsqu'elle est évaluée. Les règles d'évaluation des expressions en C++ sont déterminées par les règles de priorité et d'associativité des opérateurs, ainsi que par les types et les valeurs des opérandes. Voici quelques règles générales pour évaluer les expressions en C++ : 1. Les parenthèses peuvent être utilisées pour remplacer les règles de priorité et d'associativité par défaut. Les expressions entre parenthèses sont toujours évaluées en premier. 2. Les opérateurs unaires sont évalués avant les opérateurs binaires. Par exemple, dans l'expression !x + y , l'opérateur logique NOT ( ! ) est appliqué à x avant que l'opérateur d'addition ( + ) ne soit appliqué à x et y . 3. Les opérateurs binaires sont évalués par ordre de priorité, du plus élevé au plus bas. Par exemple, dans l'expression x + y * z , l'opérateur de multiplication ( * ) a une priorité plus élevée que l'opérateur d'addition ( + ), donc y et z sont multipliés en premier. 4. Les opérateurs ayant la même priorité sont évalués de gauche à droite (pour les opérateurs associatifs à gauche) ou de droite à gauche (pour les opérateurs associatifs à droite). Par exemple, dans l'expression x = y = z , l'opérateur d'affectation ( = ) est associatif à droite, donc z est d'abord affecté à y , puis le résultat de cette affectation est affecté à x . Voici un exemple de la façon dont ces règles peuvent être appliquées dans une expression C++ : Dans cet exemple, l'opérateur d'addition ( + ) a une priorité inférieure à l'opérateur de multiplication ( * ), de sorte que les expressions entre parenthèses sont évaluées en premier. L'opérateur d'addition ( + ) est associatif à gauche, donc x et y sont ajoutés en premier, puis z et 1 sont ajoutés. Le résultat de ces additions est ensuite multiplié pour produire le résultat final. qu'est-ce que le casting En C++, la conversion est le processus de conversion d'une valeur d'un type en une valeur d'un autre type. Il existe plusieurs façons d'effectuer un casting en C++ : 1. statique : l' opérateur static_cast est utilisé pour effectuer une conversion de type sûre et explicite. Il peut être utilisé pour convertir une valeur d'un type à un autre, tant que le type cible est explicitement spécifié. Par exemple: double x = 3,14 ; int y = static_cast<int>(x); // y vaut 3 2. dynamique : l' opérateur dynamic_cast est utilisé pour effectuer une conversion de type lors de l'exécution. Il est utilisé pour convertir un pointeur ou une référence d'un type de classe de base en un type de classe dérivé. Par exemple: classe Base { } ; classe Dérivée : public Base { }; Base *b = nouvelle Base(); Dérivé *d = dynamic_cast<Derived*>(b); // d est nullptr 3. Reinterpret cast : L' opérateur reinterpret_cast est utilisé pour interpréter les bits d'une valeur comme une valeur d'un type différent. Il est utilisé pour convertir un pointeur en un type entier, ou vice versa. Par exemple: int x = 42 ; char *ptr = reinterpret_cast<char*>(&x); // ptr pointe sur le premier octet de x 4. const : l' opérateur const_cast est utilisé pour supprimer le qualificatif const d'une valeur. Il est utilisé pour modifier une valeur const ou pour passer une valeur const à une fonction qui attend un paramètre non const . Par exemple: const int x = 42 ; int *ptr = const_cast<int*>(&x); // ptr pointe vers x, mais x peut être modifié via ptr Il est important de noter que la conversion peut parfois entraîner une perte d'informations ou un comportement indéfini si le type cible n'est pas capable de représenter la valeur en cours de conversion. Par conséquent, il est important d'utiliser le casting avec prudence et uniquement lorsque cela est nécessaire. septième chapitre Opérateurs de fonderie En C++, la conversion fait référence au processus de conversion d'une valeur d'un type de données en un autre type de données. Cela peut être fait en utilisant une variété d'opérateurs de coulée, y compris : 1. static_cast : cet opérateur est utilisé pour effectuer une conversion de type sûre et explicite. Il peut être utilisé pour convertir des valeurs entre des types compatibles, comme la conversion d'un int en un float . 2. dynamic_cast 3. const_cast 4. reinterpret_cast : Cet opérateur est utilisé pour effectuer une conversion sécurisée et downcast d'une classe de base vers une classe dérivée. Il est utilisé lorsque le type de l'objet en cours de conversion n'est pas connu au moment de la compilation et est généralement utilisé en conjonction avec le polymorphisme. : Cet opérateur est utilisé pour supprimer l' attribut const ou volatile d'une variable. Il peut être utilisé pour supprimer le qualificatif const ou volatile d'un pointeur ou d'une référence, ce qui permet de modifier la valeur. : cet opérateur est utilisé pour effectuer une conversion de type de bas niveau définie par l'implémentation. Il peut être utilisé pour convertir une valeur d'un type en une valeur d'un type différent, que les deux types soient liés ou non. Cet opérateur est généralement utilisé pour convertir des pointeurs vers et depuis des types entiers, ou pour convertir un type de pointeur en un autre. Il est important de noter que ces opérateurs de diffusion peuvent souvent entraîner un comportement indéfini s'ils sont utilisés de manière incorrecte, ils doivent donc être utilisés avec prudence. opérateur dynamic_cast L' opérateur dynamic_cast en C++ est utilisé pour effectuer une conversion sécurisée et downcast d'une classe de base vers une classe dérivée. Il est généralement utilisé en conjonction avec le polymorphisme, où un pointeur ou une référence à une classe de base est utilisé pour faire référence à des objets de classes dérivées. La syntaxe d'utilisation de dynamic_cast est la suivante : type_dérivé *ptr = dynamic_cast<type_dérivé*>(base_ptr); Où type_dérivé est le type de la classe dérivée et base_ptr est un pointeur vers la classe de base. Si la conversion réussit, dynamic_cast renverra un pointeur vers la classe dérivée. Si la conversion n'est pas possible (par exemple, si base_ptr ne pointe pas réellement vers un objet de la classe dérivée), dynamic_cast renverra un pointeur nul. Voici un exemple d'utilisation de dynamic_cast pour downcaster un pointeur vers une classe de base : Dans cet exemple, l' opérateur dynamic_cast est utilisé pour convertir un pointeur vers un objet Shape en un pointeur vers un objet Circle . Si l' objet Shape est en fait un Circle , la conversion réussira et la méthode Draw sera appelée sur l' objet Circle . Si l' objet Shape n'est pas un Circle , l' opérateur dynamic_cast renverra un pointeur null et la méthode Draw ne sera pas appelée. exception bad_cast L' exception bad_cast est un type d'exception qui est levée par l' opérateur dynamic_cast en C++ lorsqu'il ne parvient pas à effectuer une conversion downcast d'une classe de base vers une classe dérivée. L' exception bad_cast est définie dans l'en- tête stdexcept et est dérivée de la classe interceptée à l'aide d'un bloc try - catch , comme toute autre exception : exception . Elle peut être Dans cet exemple, l' opérateur dynamic_cast ne parviendra pas à convertir l' objet Shape en un objet Circle et lèvera une exception bad_cast . L'exception sera capturée dans le bloc catch et le message d'erreur sera imprimé sur la console. Il est important de noter que l' exception bad_cast ne sera lancée que si l' opérateur dynamic_cast ne parvient pas à effectuer la conversion. Si la conversion réussit, l' exception bad_cast ne sera pas levée. opérateur static_cast L' opérateur static_cast en C++ est utilisé pour effectuer une conversion de type sûre et explicite. Il peut être utilisé pour convertir des valeurs entre des types compatibles, comme convertir un int en float , ou pour convertir un pointeur vers une classe de base en un pointeur vers une classe dérivée. La syntaxe d'utilisation de static_cast est la suivante : destination_type value = static_cast<destination_type>(expression); Où type_destination est le type vers lequel la valeur de convertir. Voici un exemple d'utilisation de static_cast expression pour convertir un sera convertie et int en float expression est la valeur à : Dans cet exemple, la valeur de x est convertie d'un entier à un flottant à l'aide de l' opérateur résultat est stocké dans la variable flottante y . La sortie de ce programme sera "y = 5.0". static_cast et le Il est important de noter que static_cast n'effectue aucune vérification d'exécution pour s'assurer que la conversion est valide. Il est de la responsabilité du programmeur de s'assurer que la conversion est sûre et n'entraînera pas un comportement indéfini. opérateur const_cast L' opérateur const_cast en C++ est utilisé pour supprimer l' attribut const ou volatile d'une variable. Il peut être utilisé pour supprimer le qualificatif const ou volatile d'un pointeur ou d'une référence, ce qui permet de modifier la valeur. La syntaxe d'utilisation de const_cast est la suivante : destination_type value = const_cast<destination_type>(expression); Où type_destination est le type vers lequel la valeur de convertir. Voici un exemple d'utilisation de const_cast expression sera convertie et pour supprimer l' attribut expression const d'un const int est la valeur à : Dans cet exemple, l' opérateur const_cast est utilisé pour supprimer l' attribut const d'un pointeur vers x . Cela permet de modifier la valeur de x via le pointeur y . La sortie de ce programme sera "x = 10", même si est déclaré comme un const int . Il est important de noter que l'utilisation de const_cast pour modifier une variable entraîner un comportement indéfini si la variable est réellement destinée à être doit être utilisé avec prudence. const const ou ou volatile volatile x peut . const_cast opérateur reinterpret_cast L' opérateur reinterpret_cast en C++ est utilisé pour effectuer une conversion de type de bas niveau définie par l'implémentation. Il peut être utilisé pour convertir une valeur d'un type en une valeur d'un type différent, que les deux types soient liés ou non. Cet opérateur est généralement utilisé pour convertir des pointeurs vers et depuis des types entiers, ou pour convertir un type de pointeur en un autre. La syntaxe d'utilisation de reinterpret_cast est la suivante : destination_type value = reinterpret_cast<destination_type>(expression); Où type_destination est le type vers lequel la valeur de convertir. Voici un exemple d'utilisation de Dans cet exemple, l' opérateur reinterpret_cast reinterpret_cast expression sera convertie et pour convertir un pointeur en int expression est la valeur à : est utilisé pour convertir un pointeur en int . La sortie de ce programme sera l'adresse de x sous forme de valeur entière. Il est important de noter que reinterpret_cast n'effectue aucune vérification de type ou conversion de la valeur en cours de conversion. Il traite simplement la valeur comme une séquence de bits et réinterprète ces bits comme une valeur du type de destination. Cela peut entraîner un comportement indéfini si les types convertis ne sont pas compatibles. reinterpret_cast doit être utilisé avec prudence. Chapitre VIII Informations sur le type d'exécution (RTTI) Les informations de type à l'exécution (RTTI) sont une fonctionnalité du langage de programmation C++ qui permet aux programmeurs de déterminer le type d'un objet au moment de l'exécution. RTTI est implémenté à l'aide d'un ensemble de fonctions spéciales et d'expressions typeid, et est généralement utilisé en conjonction avec le polymorphisme pour déterminer le type réel d'un objet lorsqu'un pointeur ou une référence à une classe de base est utilisé pour faire référence à des objets de classes dérivées. Pour utiliser RTTI, vous devez d'abord l'activer en incluant l' en-tête avec l' indicateur -frtti . <typeinfo> et en compilant votre code Voici un exemple d'utilisation de RTTI pour déterminer le type d'un objet : #include <iostream> #include <typeinfo> classe Forme { Publique: ~ Forme virtuelle () {} }; class Circle : forme publique { Publique: void Draw() { std::cout << "Tracer un cercle" << std::endl; } }; int main() { Forme *forme = nouveau Cercle ; std::cout << "Type de forme : " << typeid(*shape).name() << std::endl; renvoie 0 ; } Dans cet exemple, l' opérateur typeid est utilisé pour déterminer le type de l'objet pointé par shape . La sortie de ce programme sera "Type de forme : classe Cercle", indiquant que l'objet est en fait un objet Cercle , même s'il est référencé à l'aide d'un pointeur vers un objet Forme . Il est important de noter que RTTI peut avoir un impact sur les performances de votre code, car il nécessite des vérifications d'exécution supplémentaires pour déterminer le type d'un objet. Il doit être utilisé avec parcimonie et uniquement lorsque cela est nécessaire. exception bad_typeid L' exception bad_typeid est un type d'exception qui est levée par l' opérateur utilisé sur un objet avec un type supprimé ou incomplet. typeid en C++ lorsqu'il est L' exception bad_typeid est définie dans l'en- tête stdexcept et est dérivée de la classe interceptée à l'aide d'un bloc try - catch , comme toute autre exception : exception . Elle peut être #include <iostream> #include <stdexcept> int main() { essayer { Forme *forme = nullptr ; std::cout << "Type de forme : " << typeid(*shape).name() << std::endl; } catch (std::bad_typeid& e) { std::cout << "Erreur : " << e.what() << std::endl; } renvoie 0 ; } Dans cet exemple, l' opérateur typeid est utilisé sur un pointeur null, qui a un type supprimé. Cela entraînera la levée de l'exception bad_typeid , qui sera interceptée dans le bloc catch et le message d'erreur sera imprimé sur la console. Il est important de noter que l' exception bad_typeid ne sera levée que si l' opérateur typeid est utilisé sur un objet avec un type supprimé ou incomplet. Si l'objet a un type complet et valide, l' exception bad_typeid ne sera pas levée. classe type_info La classe type_info en C++ est une classe qui représente des informations sur un type au moment de l'exécution. Il est utilisé en conjonction avec l' opérateur typeid pour récupérer des informations de type sur un objet. La classe type_info est définie dans l'en- tête <typeinfo> et fournit plusieurs fonctions membres pour accéder aux informations de type : name() : renvoie un tableau de caractères terminé par un caractère nul contenant le nom du type. hash_code() : renvoie un code de hachage unique pour le type. : renvoie true si le type représenté par cet objet type_info est lexicographiquement inférieur au type représenté par le rhs objet type_info . before(const type_info& rhs) : renvoie même que le type représenté par le operator==(const type_info& rhs) : renvoie différent du type représenté par le operator!=(const type_info& rhs) Voici un exemple d'utilisation de la classe true rhs true rhs type_info si le type représenté par cet objet objet type_info . si le type représenté par cet objet objet type_info . type_info type_info est le est pour comparer les types de deux objets : #include <iostream> #include <typeinfo> classe Forme { Publique: ~ Forme virtuelle () {} }; class Circle : forme publique { Publique: void Draw() { std::cout << "Tracer un cercle" << std::endl; } }; int main() { Forme *forme1 = nouvelle forme ; Forme *forme2 = nouveau cercle ; si (typeid(*forme1) == typeid(*forme2)) { std::cout << "shape1 et shape2 sont du même type" << std::endl; } autre { std::cout << "shape1 et shape2 sont de types différents" << std::endl; } renvoie 0 ; } Dans cet exemple, l' opérateur typeid est utilisé pour récupérer les objets type_info pour les objets pointés par shape1 et shape2 . La fonction membre operator== de la classe type_info est ensuite utilisée pour comparer les deux types. La sortie de ce programme sera « shape1 et shape2 sont de types différents », indiquant que les deux objets sont de types différents. Déclarations En C++, une instruction est un morceau de code qui exécute une action ou modifie l'état d'un programme. Il existe plusieurs types d'instructions en C++, notamment : 1. Instructions d'expression : une instruction d'expression est une instruction composée d'une seule expression suivie d'un point-virgule. Les instructions d'expression sont utilisées pour évaluer une expression et ignorer le résultat. 2. Instructions de déclaration : une instruction de déclaration introduit un nouveau nom dans le programme et spécifie le type et la valeur initiale de l'entité nommée. Les instructions de déclaration sont utilisées pour définir des variables, des fonctions et d'autres entités nommées. 3. Instructions de sélection : les instructions de sélection sont utilisées pour exécuter différents blocs de code en fonction de la valeur d'une condition. Les deux types d'instructions de sélection en C++ sont if et switch . 4. Instructions d'itération : les instructions d'itération, également appelées boucles, sont utilisées pour exécuter plusieurs fois un bloc de code. Les trois types d'instructions d'itération en C++ sont for , while et do-while . 5. Instructions de saut : les instructions de saut sont utilisées pour transférer le contrôle à une autre partie du programme. Les trois types d'instructions de saut en C++ sont break , continue et goto . Les instructions sont une partie importante de C++ et sont utilisées pour contrôler le flux d'exécution et effectuer des actions dans un programme. Présentation des instructions C++ En C++, les instructions sont utilisées pour effectuer des actions ou modifier l'état d'un programme. Il existe plusieurs types d'instructions en C++, notamment : 1. Instructions d'expression : les instructions d'expression sont utilisées pour évaluer une expression et ignorer le résultat. Ils sont généralement utilisés pour appeler des fonctions, effectuer des affectations et incrémenter ou décrémenter des variables. 2. Instructions de déclaration : les instructions de déclaration sont utilisées pour introduire de nouveaux noms dans le programme et spécifier le type et la valeur initiale de l'entité nommée. Les instructions de déclaration peuvent être utilisées pour définir des variables, des fonctions et d'autres entités nommées. 3. Instructions de sélection : les instructions de sélection sont utilisées pour exécuter différents blocs de code en fonction de la valeur d'une condition. L' instruction if est utilisée pour exécuter un bloc de code si une condition est vraie, et l' instruction switch est utilisée pour exécuter un bloc de code basé sur la valeur d'une variable. 4. Instructions d'itération : les instructions d'itération, également appelées boucles, sont utilisées pour exécuter plusieurs fois un bloc de code. La boucle for est utilisée pour exécuter un bloc de code un certain nombre de fois, la boucle while est utilisée pour exécuter un bloc de code alors qu'une condition est vraie, et la boucle do- while est utilisée pour exécuter un bloc de code au moins une fois avant d'évaluer une condition. 5. Instructions de saut : les instructions de saut sont utilisées pour transférer le contrôle à une autre partie du programme. L' instruction break est utilisée pour quitter une boucle ou une instruction switch, l' instruction continue est utilisée pour ignorer le reste de l'itération en cours d'une boucle et l' instruction goto est utilisée pour transférer le contrôle à une instruction étiquetée. Les instructions sont une partie importante de C++ et sont utilisées pour contrôler le flux d'exécution et effectuer des actions dans un Déclarations étiquetées En C++, les instructions étiquetées sont utilisées pour créer un emplacement nommé dans un bloc de code. Les instructions étiquetées sont généralement utilisées conjointement avec l' instruction goto pour transférer le contrôle à un emplacement spécifique dans un programme. Pour créer une instruction étiquetée, vous pouvez utiliser n'importe quel identifiant valide suivi de deux points : étiquette : déclaration Voici un exemple d'utilisation d'une instruction étiquetée en C++ : Dans cet exemple, l'instruction étiquetée start : crée un emplacement nommé dans le bloc de code. L' instruction goto start est ensuite utilisée pour transférer le contrôle à l' étiquette de démarrage et exécuter l'instruction suivant l'étiquette. Cela entraînera l'exécution du bloc de code 10 fois, la valeur de x augmentant de 1 à chaque fois. La sortie de ce programme sera les nombres 0 à 9, chacun sur une ligne distincte. Il est important de noter que l' instruction goto est généralement considérée comme un mécanisme de flux de contrôle moins souhaitable et doit être utilisée avec prudence. Cela peut rendre le code difficile à lire et à comprendre, et peut conduire à un code non structuré et difficile à maintenir. Il existe généralement des alternatives plus lisibles et maintenables à l'utilisation des instructions goto dans la plupart des situations. Déclaration d'expression En C++, une instruction d'expression est une instruction composée d'une seule expression suivie d'un point-virgule. Les instructions d'expression sont utilisées pour évaluer une expression et ignorer le résultat. Voici un exemple d'instruction d'expression en C++ : Dans cet exemple, l'expression x++ est une instruction d'expression qui incrémente la valeur de x de 1. Le résultat de l'expression est ignoré et la valeur de x est modifiée. La sortie de ce programme sera "x = 6". Les instructions d'expression sont couramment utilisées pour effectuer des affectations, incrémenter ou décrémenter des variables et appeler des fonctions. Ils sont une partie importante de C++ et sont utilisés pour modifier l'état d'un programme. Instruction nulle En C++, une instruction nulle est une instruction composée d'un seul point-virgule. Les instructions nulles sont utilisées pour créer un espace réservé dans un programme où une instruction est attendue, mais aucune action n'est requise. Voici un exemple d'instruction null en C++ : Dans cet exemple, l'instruction null ; est utilisé comme corps d'une boucle for . Cela crée une boucle qui s'exécutera 10 fois, mais aucune action ne sera entreprise à chaque itération. Les instructions nulles sont généralement utilisées comme espaces réservés dans les situations où une instruction est requise, mais aucune action ne doit être entreprise. Ils sont un outil utile pour créer du code plus facile à lire et à comprendre. Instructions composées (Blocs) En C++, une instruction composée, également appelée bloc, est un groupe d'instructions exécutées ensemble comme une unité. Les instructions composées sont généralement utilisées pour regrouper des instructions et créer une nouvelle portée pour les variables. Les instructions composées sont entourées d'accolades {} et peuvent contenir n'importe quel nombre d'instructions. Voici un exemple d'instruction composée en C++ : Dans cet exemple, l'instruction composée { int y = 10; std::cout << "x + y = " << x + y << std::endl; } crée une nouvelle portée pour la variable y , qui n'est accessible que dans l'instruction composée. La sortie de ce programme sera "x + y = 15". Les instructions composées sont une partie importante de C++ et sont utilisées pour regrouper des instructions et créer de nouvelles portées pour les variables. Ils sont couramment utilisés en conjonction avec des instructions de sélection et d'itération pour créer des blocs de code qui sont exécutés ensemble. Chapitre neuf Énoncés de sélection En C++, les instructions de sélection sont utilisées pour exécuter différents blocs de code en fonction de la valeur d'une condition. Il existe deux types d'instructions de sélection en C++ : l' instruction if et l' instruction switch . L' instruction if est utilisée pour exécuter un bloc de code si une condition est vraie. La syntaxe de l' instruction if est la suivante : si (état) { // code à exécuter si la condition est vraie } autre { // code à exécuter si la condition est fausse } Voici un exemple d'utilisation de l' instruction if en C++ : Dans cet exemple, l' instruction if est utilisée pour exécuter différents blocs de code en fonction de la valeur de x . Si x est supérieur à 0, le premier bloc de code sera exécuté et le message "x est positif" sera affiché sur la console. Si x n'est pas supérieur à 0, le deuxième bloc de code sera exécuté et le message "x n'est pas positif" sera affiché sur la console. L' instruction switch est un autre type d'instruction de sélection en C++ qui est utilisée pour exécuter un bloc de code basé sur la valeur d'une variable. La syntaxe de l' instruction switch est la suivante : changer (expression) { valeur de cas1 : // code à être instruction if-else En C++, l' instruction if-else est une instruction de sélection utilisée pour exécuter différents blocs de code en fonction de la valeur d'une condition. L' instruction if-else se compose d'une clause if et d'une clause else , et la syntaxe est la suivante : si (état) { // code à exécuter si la condition est vraie } autre { // code à exécuter si la condition est fausse } La clause if est utilisée pour spécifier une condition, et le code entre les accolades suivant la clause if est exécuté si la condition est vraie. La clause else est utilisée pour spécifier un autre bloc de code à exécuter si la condition est fausse. Voici un exemple d'utilisation de l' instruction if-else en C++ : Dans cet exemple, la clause if spécifie la condition x > 0 , et le code entre les accolades suivant la clause est exécuté si cette condition est vraie. La clause else spécifie un autre bloc de code à exécuter si la condition est fausse. Si x est supérieur à 0, le message "x est positif" sera imprimé sur la console. Si x n'est pas supérieur à 0, le message "x n'est pas positif" sera imprimé sur la console. if Le "si Instruction __if_exists En C++, l' instruction __if_exists est une directive de préprocesseur utilisée pour inclure un bloc de code si un symbole spécifié existe. L' instruction __if_exists est généralement utilisée pour inclure du code spécifique à un compilateur ou une plate-forme particulier, et la syntaxe est la suivante : #if __has_include(<symbol>) #include <symbole> #fin si Voici un exemple d'utilisation de l' instruction __if_exists en C++ : #include <iostream> #if __has_include(<windows.h>) #include <windows.h> #fin si int main() { std::cout << "Bonjour, monde !" << std ::endl; renvoie 0 ; } Dans cet exemple, l' instruction __if_exists est utilisée pour inclure le fichier d'en-tête windows.h s'il existe. Si le fichier d'en-tête n'est pas disponible, le bloc de code dans les directives #if et #endif sera ignoré et le fichier d'en-tête windows.h ne sera pas inclus. L' instruction __if_exists est un outil utile pour inclure du code spécifique à un compilateur ou à une plateforme particulière, et est souvent utilisée pour créer du code portable sur différents systèmes. Instruction __if_not_exists En C++, l' instruction __if_not_exists est une directive de préprocesseur utilisée pour inclure un bloc de code si un symbole spécifié n'existe pas. L' instruction __if_not_exists est généralement utilisée pour inclure du code spécifique à un compilateur ou une plate-forme particulier, et la syntaxe est la suivante : #if !__has_include(<symbole>) #include <symbole> #fin si Voici un exemple d'utilisation de l' instruction __if_not_exists en C++ : #include <iostream> #if !__has_include(<windows.h>) #include "windows.h" #fin si int main() { std::cout << "Bonjour, monde !" << std ::endl; renvoie 0 ; } Dans cet exemple, l' instruction __if_not_exists est utilisée pour inclure le fichier d'en-tête windows.h s'il n'existe pas. Si le fichier d'en-tête est disponible, le bloc de code dans les directives #if et #endif sera ignoré et le fichier d'en-tête windows.h ne sera pas inclus. L' instruction __if_not_exists est un outil utile pour inclure du code spécifique à un compilateur ou à une plate-forme particulière, et est souvent utilisée pour créer du code portable sur différents systèmes. déclaration de commutateur En C++, l' instruction switch est une instruction de sélection utilisée pour exécuter un bloc de code en fonction de la valeur d'une variable. L' instruction switch se compose d'une clause switch , d'une série de clauses case et d'une clause default facultative . La syntaxe de l' instruction switch est la suivante : changer (expression) { valeur de cas1 : // code à exécuter si expression == valeur1 Pause; valeur de cas2 : // code à exécuter si expression == valeur2 Pause; ... défaut: // code à exécuter si l'expression ne correspond à aucune des valeurs de cas } Voici un exemple d'utilisation de l' instruction switch en C++ : #include <iostream> int main() { int x = 3 ; interrupteur (x) { cas 1: std :: cout << "x vaut 1" << std :: endl; Pause; cas 2 : std :: cout << "x vaut 2" << std :: endl; Pause; cas 3 : std :: cout << "x vaut 3" << std :: endl; Pause; défaut: std :: cout << "x n'est pas 1, 2 ou 3" << std :: endl; } renvoie 0 ; } Dans cet exemple, l' instruction switch est utilisée pour exécuter différents blocs de code en fonction de la valeur de x . Si x vaut 1, le message "x vaut 1" sera imprimé sur la console. Si x vaut 2, le message "x vaut 2" sera imprimé sur la console. Si x vaut 3, le message "x vaut 3" sera imprimé sur la console. Si x n'est aucune de ces valeurs, le message "x n'est pas 1, 2 ou 3" sera affiché sur la console. L' instruction switch est un outil utile pour exécuter du code basé sur la valeur d'une variable et peut être plus efficace que l'utilisation de plusieurs instructions if-else dans certaines situations. Il est important d'inclure l' instruction break à la fin de chaque clause case pour empêcher le code de passer au cas suivant. La clause par défaut est facultative, mais est généralement incluse pour spécifier un bloc de code à exécuter si l'expression ne correspond à aucune des valeurs de cas. Instructions d'itération En C++, les instructions d'itération, également appelées boucles, sont utilisées pour exécuter plusieurs fois un bloc de code. Il existe trois types d'instructions d'itération en C++ : la boucle for , la boucle while et la boucle do- while. La boucle for est for est la suivante : utilisée pour exécuter un bloc de code un certain nombre de fois. La syntaxe de la boucle for (initialisation ; condition ; incrémentation) { // code à exécuter } La clause d' initialisation est utilisée pour initialiser une variable de boucle, la clause de condition est utilisée pour spécifier une condition qui est vérifiée avant chaque itération de la boucle, et la clause d' incrémentation est utilisée pour modifier la variable de boucle à la fin de chaque itération. Voici un exemple d'utilisation de la boucle for en C++ : Dans cet exemple, la boucle for est utilisée pour exécuter le bloc de code 10 fois. La variable de boucle i est initialisée à 0, et la condition i < 10 est vérifiée avant chaque itération de la boucle. Si la condition est vraie, le bloc de code est exécuté et la variable de boucle est incrémentée de 1. Cela entraînera l'exécution de la boucle 10 fois, la valeur de i augmentant de tandis que la déclaration En C++, la boucle while est un type d'instruction d'itération utilisée pour exécuter un bloc de code de façon répétée alors qu'une condition est vraie. La syntaxe de la boucle while est la suivante : tandis que (état) { // code à exécuter } La clause condition est utilisée pour spécifier une condition qui est vérifiée avant chaque itération de la boucle. Si la condition est vraie, le bloc de code est exécuté. Si la condition est fausse, la boucle est terminée et le contrôle est transféré à l'instruction suivante suivant la boucle. Voici un exemple d'utilisation de la boucle while en C++ : Dans cet exemple, la boucle while est utilisée pour exécuter le bloc de code 10 fois. La condition x < 10 est vérifiée avant chaque itération de la boucle. Si la condition est vraie, le bloc de code est exécuté et la valeur de x est incrémentée de 1. Cela entraînera l'exécution de la boucle 10 fois, la valeur de x augmentant de 1 à chaque fois. La sortie de ce programme sera les nombres 0 à 9, chacun sur une ligne distincte. La boucle while est un outil utile pour exécuter un bloc de code de manière répétée alors qu'une condition est vraie. Il est important d'inclure une instruction dans la boucle qui finira par entraîner la condition à devenir instruction do-while En C++, la boucle do- while est un type d'instruction d'itération utilisée pour exécuter un bloc de code de manière répétée alors qu'une condition est vraie. La syntaxe de la boucle do- while est la suivante : faire { // code à exécuter } tant que (condition); Le bloc de code est exécuté une fois avant que la condition ne soit vérifiée. Si la condition est vraie, le bloc de code est exécuté à nouveau. Si la condition est fausse, la boucle est terminée et le contrôle est transféré à l'instruction suivante suivant la boucle. Voici un exemple d'utilisation de la boucle do- while en C++ : Dans cet exemple, la boucle do- while est utilisée pour exécuter le bloc de code 10 fois. Le bloc de code est exécuté une fois avant que la condition x < 10 ne soit vérifiée. Si la condition est vraie, le bloc de code est exécuté à nouveau et la valeur de x est incrémentée de 1. Cela entraînera l'exécution de la boucle 10 fois, la valeur de x augmentant de 1 à chaque fois. La sortie de ce programme sera les nombres 0 à 9, chacun sur une ligne distincte. La boucle do- while pour la déclaration En C++, la boucle for est un type d'instruction d'itération utilisée pour exécuter un bloc de code un certain nombre de fois. La syntaxe de la boucle for est la suivante : for (initialisation ; condition ; incrémentation) { // code à exécuter } La clause d' initialisation est utilisée pour initialiser une variable de boucle, la clause de condition est utilisée pour spécifier une condition qui est vérifiée avant chaque itération de la boucle, et la clause d' incrémentation est utilisée pour modifier la variable de boucle à la fin de chaque itération. Voici un exemple d'utilisation de la boucle for en C++ : Dans cet exemple, la boucle for est utilisée pour exécuter le bloc de code 10 fois. La variable de boucle i est initialisée à 0, et la condition i < 10 est vérifiée avant chaque itération de la boucle. Si la condition est vraie, le bloc de code est exécuté et la variable de boucle est incrémentée de 1. Cela entraînera l'exécution de la boucle 10 fois, la valeur de i augmentant de 1 à chaque fois. La sortie de ce programme sera les nombres 0 à 9, chacun sur une ligne distincte. La boucle for est un outil utile pour exécuter un bloc de code un certain nombre de fois et est souvent utilisée lorsque le nombre d'itérations est connu à l'avance. Il est important d'inclure une instruction dans la boucle qui finira par rendre la condition fausse, sinon la boucle deviendra une boucle infinie. Instruction for basée sur la plage En C++, la boucle for basée sur la plage est un type d'instruction d'itération utilisée pour itérer sur les éléments d'une plage. La syntaxe de la boucle for basée sur la plage est la suivante : for (range_declaration : range_expression) { // code à exécuter } La range_declaration est une variable déclarée pour chaque élément de la plage, et la expression qui spécifie la plage sur laquelle itérer. Voici un exemple d'utilisation de la boucle range_expression est une for basée sur la plage en C++ : Dans cet exemple, la boucle for basée sur la plage est utilisée pour parcourir les éléments du vecteur de nombres . Le numéro de variable de boucle est déclaré pour chaque élément de la plage, et les numéros d'expression de plage spécifient la plage sur laquelle itérer. Cela entraînera l'exécution de la boucle 5 fois, la valeur de number étant définie tour à tour sur chaque élément du vecteur de nombres . La sortie de ce programme sera les nombres 1 à 5, chacun sur une ligne distincte. basée sur la plage est un outil utile pour itérer sur les éléments d'une plage et est souvent utilisée pour simplifier le code qui utilise des boucles for traditionnelles. Il est important de s'assurer que l'expression de plage spécifie une plage qui n'est pas modifiée pendant la boucle, car cela peut entraîner un comportement indéfini. for Chapitre dix instructions de saut En C++, les instructions de saut sont utilisées pour transférer le contrôle à un autre point du programme. Il existe quatre types d'instructions de saut en C++ : l' instruction break , l' instruction continue , l' instruction goto et l' instruction return . L' instruction break est utilisée pour terminer une boucle ou une instruction switch et transférer le contrôle à l'instruction suivante suivant la boucle ou l'interrupteur. La syntaxe de l' instruction break est la suivante : Pause; Voici un exemple d'utilisation de l' instruction break en C++ : Dans cet exemple, l' instruction break est utilisée pour terminer la boucle for lorsque la valeur de i est 5. La boucle s'exécutera 5 fois, la valeur de i augmentant de 1 à chaque fois. Lorsque la valeur de i devient 5, l' instruction break sera exécutée et la boucle sera terminée. La sortie de ce programme sera les nombres 0 à 4, chacun sur une ligne séparée. L' instruction continue est utilisée pour ignorer le reste de l'itération en cours d'une boucle et transférer le contrôle à l'itération suivante. La syntaxe de l' instruction continue est la suivante : Continuez; Voici un exemple d'utilisation de l' instruction continue en C++ : Dans cet exemple, l' instruction continue est utilisée pour ignorer le reste de l'itération actuelle de la boucle for si la valeur de i est paire. La boucle s'exécutera 10 fois, la valeur de i augmentant de 1 à chaque fois. Si la valeur de i est paire, l' instruction continue sera exécutée et le reste de l'itération en cours sera ignoré. La sortie de ce programme sera les nombres impairs de 1 à 9, chacun sur une ligne distincte. L' instruction goto est utilisée pour transférer le contrôle à une instruction étiquetée dans la même fonction. La syntaxe de l' instruction goto est la suivante : aller à l'étiquette ; ... étiquette: // code à exécuter L' instruction return est utilisée pour terminer une fonction et retourner une valeur déclaration de rupture En C++, l' instruction break est une instruction de saut utilisée pour terminer une boucle ou une instruction switch et transférer le contrôle à l'instruction suivante suivant la boucle ou l'interrupteur. La syntaxe de l' instruction break est la suivante : Pause; Voici un exemple d'utilisation de l' instruction break en C++ : Dans cet exemple, l' instruction break est utilisée pour terminer la boucle for lorsque la valeur de i est 5. La boucle s'exécutera 5 fois, la valeur de i augmentant de 1 à chaque fois. Lorsque la valeur de i devient 5, l' instruction break sera exécutée et la boucle sera terminée. La sortie de ce programme sera les nombres 0 à 4, chacun sur une ligne séparée. L' instruction break est souvent utilisée pour terminer une boucle ou une instruction switch plus tôt lorsqu'une certaine condition est remplie. Il est important d'utiliser l' instruction break uniquement dans le corps d'une boucle ou d'une instruction switch, car son utilisation en dehors de ces contextes entraînera une erreur de compilation. continuer la déclaration En C++, l' instruction continue est une instruction de saut utilisée pour ignorer le reste de l'itération actuelle d'une boucle et transférer le contrôle à l'itération suivante. La syntaxe de l' instruction continue est la suivante : Continuez; Voici un exemple d'utilisation de l' instruction continue en C++ : Dans cet exemple, l' instruction continue est utilisée pour ignorer le reste de l'itération actuelle de la boucle for si la valeur de i est paire. La boucle s'exécutera 10 fois, la valeur de i augmentant de 1 à chaque fois. Si la valeur de i est paire, l' instruction continue sera exécutée et le reste de l'itération en cours sera ignoré. La sortie de ce programme sera les nombres impairs de 1 à 9, chacun sur une ligne distincte. L' instruction continue est souvent utilisée pour ignorer certaines itérations d'une boucle lorsqu'une certaine condition est remplie. Il est important d'utiliser l' instruction continue uniquement dans le corps d'une boucle, car son utilisation en dehors d'une boucle entraînera une erreur de compilation. déclaration de retour En C++, l' instruction de retour est une instruction de saut utilisée pour terminer une fonction et renvoyer une valeur à la fonction appelante. La syntaxe de l' instruction return est la suivante : expression de retour ; L' est une expression facultative qui spécifie une valeur à renvoyer à la fonction appelante. Si l' est omise, la fonction renvoie la valeur par défaut pour le type de retour de la fonction. expression expression Voici un exemple d'utilisation de l' instruction return en C++ : Dans cet exemple, l' instruction return est utilisée pour renvoyer le résultat de la fonction add à la fonction appelante. La fonction add prend deux arguments, x et y , et renvoie leur somme. L' instruction return est exécutée lorsque la fonction add est appelée et la valeur de x + y est renvoyée à la fonction appelante. Dans ce cas, la valeur 5 est renvoyée et imprimée à l'écran. L' instruction return est utilisée pour terminer une fonction et renvoyer une valeur à la fonction appelante. Il est important de s'assurer que le type de retour de la fonction est compatible avec la valeur renvoyée, car tenter de renvoyer une valeur du mauvais type entraînera une erreur de compilation. Aller à l'instruction En C++, l' instruction goto est une instruction de saut utilisée pour transférer le contrôle à une instruction étiquetée dans la même fonction. La syntaxe de l' instruction goto est la suivante : aller à l'étiquette ; ... étiquette: // code à exécuter L' étiquette est un identifiant défini par l'utilisateur qui est utilisé pour marquer un point dans le code auquel le contrôle peut être transféré. Voici un exemple d'utilisation de l' instruction goto en C++ : Dans cet exemple, l' instruction goto est utilisée pour transférer le contrôle à l' étiquette paire lorsque la valeur de x est paire. La boucle while s'exécutera indéfiniment, la valeur de x augmentant de 1 à chaque fois. Si la valeur de x est paire, l' instruction goto sera exécutée et le contrôle sera transféré à l' étiquette paire . Au niveau de l' étiquette paire , un message est imprimé à l'écran indiquant qu'un nombre pair a été rencontré. L' instruction goto est généralement considérée comme une construction de flux de contrôle moins souhaitable que d'autres options telles que les instructions if , les boucles for et les boucles while . Il est généralement recommandé d'utiliser goto avec parcimonie, voire pas du tout, car cela peut rendre le code plus difficile à comprendre et à maintenir. Transferts de contrôle En C++, les transferts de contrôle sont utilisés pour modifier le flux d'exécution d'un programme. Il existe plusieurs types de transferts de contrôle en C++, notamment : Instructions conditionnelles : Les instructions conditionnelles sont utilisées pour exécuter un bloc de code de manière conditionnelle en fonction de la valeur d'une expression booléenne. L' instruction if est utilisée pour exécuter un bloc de code si une condition est vraie, et l' instruction if-else est utilisée pour exécuter un bloc de code si une condition est vraie et un autre bloc de code si la condition est fausse. itération : Les instructions d'itération sont utilisées pour exécuter un bloc de code de manière répétée. La boucle while est utilisée pour exécuter un bloc de code alors qu'une condition est vraie, la boucle do- while est utilisée pour exécuter un bloc de code au moins une fois puis à plusieurs reprises tant qu'une condition est vraie, et la boucle for est utilisée pour exécuter un bloc de code un certain nombre de fois. saut : Les instructions de saut sont utilisées pour transférer le contrôle à un point différent du programme. L' instruction break est utilisée pour terminer une boucle ou une instruction switch et transférer le contrôle à l'instruction suivante suivant la boucle ou l'interrupteur, l' instruction continue est utilisée pour ignorer le reste de l'itération en cours d'une boucle et transférer le contrôle à l'itération suivante, la goto est utilisée pour transférer le contrôle à une instruction étiquetée dans la même fonction, et l' instruction return est utilisée pour terminer une fonction et renvoyer une valeur à la fonction appelante. Gestion des exceptions : La gestion des exceptions permet de gérer des erreurs ou des circonstances exceptionnelles pouvant survenir lors de l'exécution d'un programme. L' instruction try est utilisée pour inclure un bloc de code susceptible de lever une exception, l' instruction throw est utilisée pour lever une exception et l' instruction catch est utilisée pour gérer une exception qui a été levée. Espaces de noms En C++, un espace de noms est un conteneur pour un ensemble d'identificateurs (tels que des fonctions, des variables et des classes). Les espaces de noms sont utilisés pour organiser et gérer les identifiants dans un programme et pour éviter les collisions de noms entre des identifiants portant le même nom mais des significations différentes. La syntaxe pour définir un espace de noms en C++ est la suivante : espace de noms namespace_name { // déclarations } Le namespace_name est le nom de l'espace de noms et les déclarations dans l'espace de noms sont les identificateurs contenus dans l'espace de noms. Voici un exemple de définition et d'utilisation d'un espace de noms en C++ : Dans cet exemple, l' espace de noms my_namespace contient les variables x et y et la fonction add . Les identificateurs au sein de l'espace de noms sont accessibles à l'aide de la syntaxe namespace_name ::identifier . Dans ce cas, les variables x et y sont accessibles à l'aide de la syntaxe my_namespace::x et my_namespace::y , et la fonction add est accessible à l'aide de la syntaxe my_namespace::add . Les espaces de noms sont utiles pour organiser et gérer les identifiants dans un programme et pour empêcher les collisions de noms entre des identifiants portant le même nom mais des significations différentes. Il est important de choisir des noms descriptifs et uniques pour les espaces de noms afin d'éviter les conflits avec d'autres espaces de noms dans le même programme. Énumérations Une énumération (ou enum) en C++ est un moyen de définir un ensemble de constantes entières nommées. Il est souvent utilisé pour attribuer des noms significatifs à un ensemble de valeurs intégrales, ce qui facilite la compréhension et la maintenance du code. Voici un exemple de définition d'une énumération : enum Couleur { RED, // RED reçoit la valeur 0 GREEN, // GREEN reçoit la valeur 1 BLEU, // BLEU prend la valeur 2 JAUNE // JAUNE prend la valeur 3 }; Dans cet exemple, nous avons défini une énumération appelée Color avec quatre membres : RED , GREEN , BLUE et YELLOW . Par défaut, le premier membre d'une énumération se voit attribuer la valeur 0, et chaque membre suivant se voit attribuer une valeur supérieure d'une unité au membre précédent. Donc, dans ce cas, ROUGE est 0, VERT est 1, BLEU est 2 et JAUNE est 3. Vous pouvez également spécifier explicitement les valeurs de chaque membre de l'énumération, comme ceci : enum Couleur { ROUGE = 10, // ROUGE reçoit la valeur 10 GREEN = 20, // GREEN reçoit la valeur 20 BLEU = 30, // BLEU reçoit la valeur 30 JAUNE = 40 // JAUNE prend la valeur 40 }; Une fois que vous avez défini une énumération, vous pouvez utiliser ses membres comme des variables : Couleur favoriteColor = RED; si (favoriteColor == ROUGE) { std::cout << "Votre couleur préférée est le rouge." << std ::endl; } Les énumérations sont souvent utilisées en conjonction avec une instruction ensemble fixe de valeurs : switch (favoriteColor) { boîtier ROUGE : std::cout << "Votre couleur préférée est le rouge." << std ::endl; Pause; boîtier VERT : std::cout << "Votre couleur préférée est le vert." << std ::endl; Pause; étui BLEU : std::cout << "Votre couleur préférée est le bleu." << std ::endl; Pause; switch pour gérer un boîtier JAUNE : std::cout << "Votre couleur préférée est le jaune." << std ::endl; Pause; défaut: std::cout << "Votre couleur préférée est inconnue." << std ::endl; Pause; } J'espère que ça aide! Faites moi savoir si vous avez des questions. Les syndicats En C++, une union est un type de données qui vous permet de stocker différents types de données dans le même emplacement mémoire. Il est similaire à une structure, mais un seul membre est accessible à la fois. Voici un exemple de définition d'une union en C++ : Dans cet exemple, le syndicat MyUnion compte trois membres : x , y et z . Cependant, étant donné qu'un syndicat ne vous permet d'accéder qu'à un seul membre à la fois, vous ne pouvez utiliser qu'un seul de ces membres à la fois. Pour accéder aux membres d'un syndicat, vous pouvez utiliser le une structure : . opérateur, comme vous le feriez avec Les unions sont souvent utilisées lorsque vous souhaitez stocker différents types de données dans le même emplacement mémoire, mais vous n'avez besoin d'accéder qu'à l'un d'entre eux à la fois. Cela peut être utile pour économiser de la mémoire dans certaines situations. Cependant, vous devez être prudent lorsque vous utilisez des unions, car il est facile d'écraser accidentellement les valeurs d'un membre avec un autre. Les fonctions En C++, une fonction est un bloc de code qui exécute une tâche spécifique et peut renvoyer une valeur. Les fonctions vous permettent de réutiliser le code et de diviser un programme volumineux en éléments plus petits et plus faciles à gérer. Voici un exemple de fonction simple en C++ : Cette fonction, appelée d'entier. add , prend deux arguments entiers, x et y , et renvoie leur somme sous forme Pour appeler cette fonction et utiliser sa valeur de retour, vous feriez quelque chose comme ceci : En C++, les fonctions peuvent avoir différents types de paramètres et de valeurs de retour. Par exemple, une fonction pourrait renvoyer une valeur à virgule flottante, ou elle pourrait n'avoir aucune valeur de retour (auquel cas elle aurait un type de retour de void ). Les fonctions peuvent également avoir des valeurs par défaut pour leurs paramètres. Cela vous permet d'appeler la fonction avec moins d'arguments, auquel cas les valeurs par défaut seront utilisées pour les arguments manquants. Voici un exemple: Les fonctions sont une partie importante de C++ et sont largement utilisées dans la plupart des programmes. Ils vous aident à écrire un code plus modulaire et réutilisable, ce qui peut faciliter la compréhension et la maintenance de vos programmes. Fonctions avec des listes d'arguments variables En C++, vous pouvez définir une fonction avec un nombre variable d'arguments en utilisant la notation C'est ce qu'on appelle une fonction « variadique ». Voici un exemple de fonction variadique simple en C++ : .... Cette fonction, appelée print , prend une chaîne de format comme premier argument et un nombre variable d'arguments supplémentaires. La chaîne de format spécifie les types des arguments supplémentaires. Par exemple, si la chaîne de format est "dffs", cela indique que les trois arguments suivants sont des entiers et que le quatrième argument est une chaîne. Pour appeler cette fonction, vous pouvez utiliser la notation un exemple: ... pour transmettre les arguments supplémentaires. Voici print("dffs", 10, 3.14, 5.67, "bonjour"); // Sortie "10 3.14 5.67 bonjour" Les fonctions variadiques peuvent être utiles lorsque vous devez transmettre un nombre variable d'arguments à une fonction, mais elles peuvent également être plus difficiles à utiliser et à gérer que les fonctions à arguments fixes. Il est généralement recommandé d'utiliser des fonctions à arguments fixes dans la mesure du possible et de n'utiliser des fonctions variadiques que lorsque cela est nécessaire. Surcharge de fonctions En C++, la surcharge de fonctions est une fonctionnalité qui vous permet de définir plusieurs fonctions avec le même nom, mais avec des ensembles d'arguments différents. Le compilateur C++ sélectionnera automatiquement la fonction correcte à appeler en fonction du nombre et des types d'arguments passés à la fonction. Voici un exemple de surcharge de fonction en C++ : Dans cet exemple, la fonction add est surchargée trois fois. La première version prend deux arguments entiers et renvoie un entier. La deuxième version prend deux arguments doubles et renvoie un double. La troisième version prend deux arguments de chaîne et renvoie une chaîne. Pour appeler l'une de ces fonctions, vous pouvez utiliser la syntaxe d'appel de fonction normale et le compilateur C++ sélectionnera automatiquement la version correcte de la fonction en fonction des types d'arguments que vous transmettez. Par exemple: int a = ajouter(1, 2); // Appelle la première version de add double b = addition(3.14, 2.72); // Appelle la seconde version de add std::string c = add("bonjour", "monde"); // Appelle la troisième version de add La surcharge de fonction peut être utile lorsque vous souhaitez effectuer des opérations similaires sur différents types de données ou lorsque vous souhaitez fournir plusieurs versions d'une fonction avec différents nombres d'arguments. Cependant, vous devez être prudent lorsque vous surchargez des fonctions, car cela peut être déroutant pour les utilisateurs de votre code si les fonctions ont le même nom mais se comportent différemment en fonction des arguments. C'est généralement une bonne idée de choisir des noms de fonctions qui décrivent clairement leur objectif et les types d'arguments qu'elles attendent. Fonctions explicitement définies par défaut et supprimées En C++, vous pouvez utiliser la syntaxe certaines fonctions de votre classe. = default et = delete pour spécifier le comportement par défaut de La syntaxe = default peut être utilisée pour spécifier explicitement qu'une fonction doit avoir son comportement par défaut, qui est défini par le langage C++. Ceci est généralement utilisé pour les fonctions qui ont une implémentation par défaut, telles que le constructeur de copie ou l'opérateur d'affectation. Voici un exemple d'utilisation de constructeur de copie : = default pour spécifier explicitement le comportement par défaut d'un La syntaxe = delete peut être utilisée pour spécifier explicitement qu'une fonction ne doit pas être utilisée. Ceci est souvent utilisé pour empêcher le compilateur de générer certaines fonctions dont vous ne voulez pas, comme le constructeur de copie ou l'opérateur d'affectation. Voici un exemple d'utilisation de pas être utilisé : = delete pour spécifier explicitement qu'un constructeur de copie ne doit L'utilisation de = default et = delete peut être utile dans certaines situations où vous souhaitez contrôler explicitement le comportement de certaines fonctions de votre classe. Cependant, vous devez être prudent lorsque vous utilisez ces syntaxes, car elles peuvent prêter à confusion pour les utilisateurs de votre code si elles ne sont pas utilisées correctement. C'est généralement une bonne idée d'utiliser le comportement par défaut des fonctions chaque fois que possible, et d'utiliser uniquement = default ou = delete lorsque cela est nécessaire. Recherche de nom dépendant de l'argument (Koenig) sur En C++, la recherche de nom dépendante de l'argument (également appelée "recherche Koenig") est une fonctionnalité qui permet au compilateur de rechercher des fonctions dans les espaces de noms des types des arguments de la fonction. Cela peut être utile lorsque vous souhaitez appeler une fonction définie dans le même espace de noms que l'un des arguments de la fonction. Voici un exemple du fonctionnement de la recherche de nom dépendant d'un argument en C++ : Dans cet exemple, la fonction f est définie dans l' espace de noms A et prend un argument de type X , qui est également défini dans l' espace de noms A. La fonction f appelle la fonction g , qui n'est pas définie dans l' espace de noms A. Cependant, comme g est appelé avec un argument de type Y , qui est défini dans l' espace de noms B , le compilateur recherchera g dans l' espace de noms B en utilisant la recherche de nom dépendant de l'argument. Cela permet au compilateur de trouver la bonne définition de g et de l'appeler correctement. La recherche de nom dépendante de l'argument peut être utile lorsque vous souhaitez appeler des fonctions définies dans le même espace de noms que l'un des arguments de la fonction. Cependant, cela peut également prêter à confusion si vous ne faites pas attention, car le compilateur peut trouver plusieurs définitions de la même fonction dans différents espaces de noms. C'est généralement une bonne idée d'utiliser des noms complets pour les fonctions afin d'éviter toute confusion potentielle. fonctions en c++ En C++, une fonction est un bloc de code qui exécute une tâche spécifique et peut renvoyer une valeur. Les fonctions vous permettent de réutiliser le code et de diviser un programme volumineux en éléments plus petits et plus faciles à gérer. Voici un exemple de fonction simple en C++ : Cette fonction, appelée d'entier. add , prend deux arguments entiers, x et y , et renvoie leur somme sous forme Pour appeler cette fonction et utiliser sa valeur de retour, vous feriez quelque chose comme ceci : En C++, les fonctions peuvent avoir différents types de paramètres et de valeurs de retour. Par exemple, une fonction pourrait renvoyer une valeur à virgule flottante, ou elle pourrait n'avoir aucune valeur de retour (auquel cas elle aurait un type de retour de void ). Les fonctions peuvent également avoir des valeurs par défaut pour leurs paramètres. Cela vous permet d'appeler la fonction avec moins d'arguments, auquel cas les valeurs par défaut seront utilisées pour les arguments manquants. Voici un exemple: Les fonctions sont une partie importante de C++ et sont largement utilisées dans la plupart des programmes. Ils vous aident à écrire un code plus modulaire et réutilisable, ce qui peut faciliter la compréhension et la maintenance de vos programmes. Arguments par défaut En C++, vous pouvez spécifier des valeurs par défaut pour les arguments de fonction. Cela vous permet d'appeler la fonction avec moins d'arguments, auquel cas les valeurs par défaut seront utilisées pour les arguments manquants. Voici un exemple de fonction avec des arguments par défaut en C++ : Dans cet exemple, la fonction add prend deux arguments entiers, x et y . L' argument y a une valeur par défaut de 1 , ce qui signifie qu'il est facultatif. Vous pouvez appeler cette fonction avec un ou deux arguments : int a = ajouter(3); // a est maintenant égal à 4 entier b = ajouter(3, 5); // b est maintenant égal à 8 Les arguments par défaut peuvent être utiles lorsque vous souhaitez fournir des valeurs par défaut pour les arguments de fonction facultatifs. Cependant, vous devez être prudent lorsque vous utilisez des arguments par défaut, car ils peuvent rendre votre code plus difficile à comprendre s'ils sont utilisés de manière excessive. C'est généralement une bonne idée d'utiliser des arguments par défaut uniquement pour les arguments facultatifs qui ont une valeur par défaut claire et évidente. Fonctions en ligne En C++, une fonction inline est une fonction qui est développée sur place par le compilateur chaque fois qu'elle est appelée, plutôt que d'être appelée via le mécanisme d'appel de fonction normal. Les fonctions en ligne peuvent être utiles pour améliorer les performances de votre programme en réduisant la surcharge des appels de fonction. Voici un exemple de fonction inline en C++ : Pour utiliser cette fonction en ligne, vous pouvez l'appeler comme n'importe quelle autre fonction : int a = 3 ; entier b = 4 ; entier c = ajouter(a, b); // c est maintenant égal à 7 Le mot-clé inline est une demande au compilateur pour développer la fonction en ligne, mais le compilateur n'est pas obligé d'honorer cette demande. Le compilateur peut choisir de ne pas intégrer la fonction s'il détermine que cela ne serait pas bénéfique. Les fonctions en ligne peuvent être utiles pour améliorer les performances de votre programme en réduisant la surcharge des appels de fonction. Cependant, vous devez être prudent lorsque vous utilisez des fonctions en ligne, car elles peuvent augmenter la taille de votre programme si elles sont utilisées de manière excessive. C'est généralement une bonne idée d'utiliser les fonctions inline uniquement pour les petites fonctions simples qui sont appelées fréquemment. Chapitre onze Surcharge de l'opérateur En C++, la surcharge d'opérateur est une fonctionnalité qui vous permet de redéfinir le comportement des opérateurs pour les types définis par l'utilisateur. Cela peut être utile pour rendre votre code plus lisible et intuitif en vous permettant d'utiliser des opérateurs comme + , - , * et / avec vos propres types. Voici un exemple de surcharge d'opérateur en C++ : Dans cet exemple, la classe Vector2 a trois opérateurs surchargés : + , - et * . Ces opérateurs vous permettent d'ajouter, de soustraire et de multiplier des objets Vector2 à l'aide des opérateurs familiers - et * . + , Pour utiliser ces opérateurs surchargés, vous pouvez utiliser la syntaxe d'opérateur normale : La surcharge d'opérateurs peut être utile pour rendre votre code plus lisible et intuitif. Cependant, vous devez être prudent lorsque vous surchargez des opérateurs, car cela peut être source de confusion pour les utilisateurs de votre code si les opérateurs se comportent de manière inattendue. C'est généralement une bonne idée de surcharger les opérateurs d'une manière cohérente avec leur comportement standard. Règles générales de surcharge des opérateurs En C++, il existe quelques règles générales à suivre lors de la surcharge d'opérateurs : 1. Opérateurs de surcharge uniquement pour les types qui ont un sens. Par exemple, il n'est pas logique de surcharger l' opérateur + pour un type qui représente une connexion à une base de données. 2. Surcharger les opérateurs d'une manière cohérente avec leur comportement standard. Par exemple, si vous surchargez l' opérateur + pour un type qui représente un nombre complexe, il doit ajouter les parties réelles et imaginaires des nombres. 3. Évitez de surcharger les opérateurs qui modifient le comportement fondamental de l'opérateur. Par exemple, ce n'est généralement pas une bonne idée de surcharger l' opérateur = pour effectuer une autre opération, car cela peut prêter à confusion pour les utilisateurs de votre code. 4. Utilisez le mot-clé const de manière appropriée lors de la surcharge d'opérateurs. Cela vous permettra d'utiliser l'opérateur surchargé sur les objets const et d'empêcher les utilisateurs de modifier accidentellement l'objet. 5. Soyez conscient de la priorité et de l'associativité des opérateurs que vous surchargez. Cela garantira que vos opérateurs surchargés se comportent comme prévu lorsqu'ils sont utilisés dans des expressions avec d'autres opérateurs. En suivant ces règles générales, vous pouvez vous assurer que la surcharge de votre opérateur est claire, intuitive et cohérente avec le comportement standard des opérateurs. Cela rendra votre code plus facile à comprendre et à maintenir. Surcharger les opérateurs unaires En C++, vous pouvez surcharger les opérateurs unaires (opérateurs qui prennent un seul opérande) en définissant des fonctions membres ou des fonctions non membres avec les noms appropriés. Voici un exemple de surcharge de l'opérateur unaire Dans cet exemple, la classe Vector2 . Vector2 a un opérateur - - en tant que fonction membre : surchargé qui annule les composants x et y de l' objet Pour utiliser cet opérateur surchargé, vous pouvez utiliser la syntaxe normale de l'opérateur : Voici un exemple de surcharge de l'unaire ! opérateur en tant que fonction non membre : Dans cet exemple, la classe MyClass a une fonction membre appelée getValue qui renvoie la valeur d'une variable membre privée. Le ! L'opérateur est surchargé en tant que fonction non membre qui nie la valeur renvoyée par getValue . Pour utiliser cet opérateur surchargé, vous pouvez utiliser la syntaxe normale de l'opérateur : La surcharge d'opérateur unaire peut être utile pour rendre votre code plus lisible et intuitif. Cependant, vous devez être prudent lorsque vous surchargez des opérateurs unaires, car cela peut être source de confusion pour les utilisateurs de votre code si les opérateurs se comportent de manière inattendue. C'est généralement une bonne idée de surcharger les opérateurs unaires d'une manière cohérente avec leur comportement standard. Surcharge des opérateurs d'incrémentation et de décrémentation En C++, vous pouvez surcharger les opérateurs d'incrémentation ( ++ ) et de décrémentation ( -- ) pour les types définis par l'utilisateur. Cela peut être utile pour rendre votre code plus lisible et intuitif en vous permettant d'utiliser ces opérateurs avec vos propres types. Voici un exemple de surcharge des opérateurs d'incrémentation et de décrémentation en tant que fonctions membres : Dans cet exemple, la classe Counter a surchargé les opérateurs ++ et -- qui incrémentent et décrémentent une variable membre privée appelée value_ . L' opérateur ++ est surchargé à la fois dans les formes de préfixe ( ++x ) et de suffixe ( x++ ), et l' opérateur -- est surchargé dans les formes de préfixe ( --x ) et de suffixe ( x-- ). Pour utiliser ces opérateurs surchargés, vous pouvez utiliser la syntaxe d'opérateur normale : La surcharge des opérateurs d'incrémentation et de décrémentation peut être utile pour rendre votre code plus lisible et intuitif. Cependant, vous devez être prudent lorsque vous surchargez ces opérateurs, car cela peut être source de confusion pour les utilisateurs de votre code si les opérateurs se comportent de manière inattendue. C'est généralement une bonne idée de surcharger ces opérateurs d'une manière cohérente avec leur comportement standard. Opérateurs binaires En C++, un opérateur binaire est un opérateur qui prend deux opérandes. Certains exemples courants d'opérateurs binaires incluent + , - , * , / et % . Voici un exemple d'utilisation d'opérateurs binaires en C++ : En C++, vous pouvez également surcharger les opérateurs binaires pour les types définis par l'utilisateur. Cela vous permet de définir un comportement personnalisé pour les opérateurs lorsqu'ils sont utilisés avec vos propres types. Voici un exemple de surcharge de l' opérateur Dans cet exemple, la classe objets Vector2 . + en tant que fonction membre : Vector2 a un opérateur + surchargé qui ajoute les composants x et y des deux Pour utiliser cet opérateur surchargé, vous pouvez utiliser la syntaxe normale de l'opérateur : La surcharge d'opérateurs binaires peut être utile pour rendre votre code plus lisible et intuitif. Cependant, vous devez être prudent lorsque vous surchargez des opérateurs binaires, car cela peut être source de confusion pour les utilisateurs de votre code si les opérateurs se comportent de manière inattendue. C'est généralement une bonne idée de surcharger les opérateurs binaires d'une manière cohérente avec leur comportement standard. Mission En C++, l'opérateur d'affectation ( = ) est utilisé pour affecter une valeur à une variable. Voici un exemple d'utilisation de l'opérateur d'affectation en C++ : Dans la première ligne, l' opérateur = est utilisé pour initialiser la variable a à la valeur 3 . Dans la deuxième ligne, l' opérateur = est utilisé pour attribuer une nouvelle valeur à a , en écrasant la valeur précédente. Vous pouvez également utiliser l'opérateur d'affectation pour enchaîner les affectations, comme ceci : Dans cet exemple, l'opérateur d'affectation est utilisé pour affecter la valeur 0 aux trois variables dans une seule ligne de code. Vous pouvez également utiliser l'opérateur d'affectation pour affecter la valeur d'une expression à une variable, comme ceci : Dans cet exemple, l' opérateur variable c . = est utilisé pour affecter le résultat de l'expression a+b (qui est 7 ) à la L'opérateur d'affectation est une partie importante de C++ et est largement utilisé dans la plupart des programmes. Il vous permet d'attribuer des valeurs aux variables et de modifier leurs valeurs si nécessaire. Appel de fonction En C++, un appel de fonction est une expression qui appelle une fonction et passe éventuellement des arguments à la fonction. La syntaxe d'un appel de fonction est le nom de la fonction suivi d'une liste d'arguments entre parenthèses. Voici un exemple d'appel de fonction en C++ : Dans cet exemple, la fonction add prend deux arguments entiers, x et y , et renvoie leur somme sous forme d'entier. La fonction est appelée en utilisant son nom suivi des arguments entre parenthèses. La valeur de retour de la fonction est affectée à la variable c . Vous pouvez également utiliser des appels de fonction dans le cadre d'expressions, comme ceci : Dans cet exemple, l'appel de fonction add(a, b) est utilisé dans le cadre d'une expression qui multiplie la valeur de retour par 2 . Le résultat de l'expression est alors affecté à la variable c . Les appels de fonction sont une partie importante de C++ et sont largement utilisés dans la plupart des programmes. Ils vous permettent de réutiliser le code et de diviser un programme volumineux en éléments plus petits et plus faciles à gérer. Abonnement En C++, l'indice (également appelé indexation) est un moyen d'accéder aux éléments individuels d'un tableau ou d'un conteneur à l'aide de l' opérateur [] . Voici un exemple d'utilisation de l'indice pour accéder aux éléments d'un tableau en C++ : Dans cet exemple, l' opérateur [] est utilisé pour accéder aux éléments du tableau arr . Le premier élément du tableau a un index de 0 , le deuxième élément a un index de 1 , et ainsi de suite. Vous pouvez également utiliser l'indice pour modifier les éléments d'un tableau : L'abonnement est un moyen puissant et pratique d'accéder et de modifier les éléments d'un tableau ou d'un conteneur en C++. Il est largement utilisé dans de nombreux programmes pour manipuler des données stockées dans des tableaux et des conteneurs. Accès membre En C++, l'accès aux membres est un moyen d'accéder aux données membres et aux fonctions membres d'une classe ou d'une structure à l'aide de l'extension . ou -> opérateur. Voici un exemple d'utilisation de l'accès aux membres pour accéder aux données membres d'une classe en C++ : Dans cet exemple, la classe Point a deux membres de données, x_ et y_ , et deux fonctions membres, getX et getY , qui renvoient les valeurs de ces membres de données. Les membres de données sont accessibles à l'aide de . et les fonctions membres sont appelées à l'aide de l'opérateur . opérateur et parenthèses. Vous pouvez également utiliser l'accès membre pour appeler les fonctions membres d'une classe : Classes et structures En C++, les classes et les structures sont des types définis par l'utilisateur qui vous permettent de définir vos propres types de données personnalisés. Une classe est un type défini par l'utilisateur qui peut contenir des données membres (variables) et des fonctions membres (fonctions faisant partie de la classe). Les classes sont définies à l'aide du mot-clé class , comme ceci : Dans cet exemple, la classe Point a deux membres de données, et getY , qui renvoient les valeurs de ces membres de données. x_ et y_ , et deux fonctions membres, getX Une structure est similaire à une classe, mais tous ses membres sont publics par défaut. Les structures sont définies à l'aide du mot-clé struct , comme ceci : Dans cet exemple, la structure Point a deux membres de données, x et y , qui sont tous deux publics. Vous pouvez créer une instance d'une classe ou d'un struct en utilisant l' opérateur une variable de type class ou struct, comme ceci : new ou en déclarant Point p1(1, 2); // Crée une instance de Point en utilisant le constructeur Point *p2 = nouveau Point(3, 4); // Crée une instance de Point en utilisant new Point p3 ; // Crée une instance de Point avec le constructeur par défaut Les classes et les structures sont une partie importante de C++ et sont largement utilisées dans de nombreux programmes pour définir des types de données personnalisés et encapsuler des données et des fonctionnalités. quelle est la classe En C++, une classe est un type défini par l'utilisateur qui peut contenir des données membres (variables) et des fonctions membres (fonctions faisant partie de la classe). Les classes sont définies à l'aide du motclé class , comme ceci : Dans cet exemple, la classe Point a deux membres de données, et getY , qui renvoient les valeurs de ces membres de données. x_ et Vous pouvez créer une instance d'une classe en utilisant l' opérateur type classe, comme ceci : y_ , et deux fonctions membres, new getX ou en déclarant une variable de Point p1(1, 2); // Crée une instance de Point en utilisant le constructeur Point *p2 = nouveau Point(3, 4); // Crée une instance de Point en utilisant new Point p3 ; // Crée une instance de Point avec le constructeur par défaut Les classes sont une partie importante de C++ et sont largement utilisées dans de nombreux programmes pour définir des types de données personnalisés et encapsuler des données et des fonctionnalités. quelle structure En C++, une structure est un type défini par l'utilisateur qui est similaire à une classe, mais tous les membres sont publics par défaut. Les structures sont définies à l'aide du mot-clé struct , comme ceci : Dans cet exemple, la structure Point a deux membres de données, x et y , qui sont tous deux publics. Vous pouvez créer une instance d'un struct en déclarant une variable de type struct, comme ceci : Les structures sont souvent utilisées pour définir des structures de données simples qui n'ont pas besoin de l'encapsulation et de la protection fournies par les classes. Cependant, les structures peuvent également contenir des fonctions membres et peuvent être utilisées de la même manière que les classes dans de nombreux cas. Les structures sont une partie importante de C++ et sont largement utilisées dans de nombreux programmes pour définir des types de données personnalisés et regrouper des données associées. Présentation des membres du groupe En C++, une classe est un type défini par l'utilisateur qui peut contenir des données membres (variables) et des fonctions membres (fonctions faisant partie de la classe). Les classes sont définies à l'aide du motclé class , comme ceci : Dans cet exemple, la classe Point a deux membres de données, et getY , qui renvoient les valeurs de ces membres de données. x_ et y_ , et deux fonctions membres, getX Le mot-clé public dans la définition de classe spécifie que les membres qui le suivent sont accessibles depuis l'extérieur de la classe. Cela signifie que vous pouvez accéder aux fonctions membres et aux données membres d'une instance de la classe Point depuis l'extérieur de la classe à l'aide de . opérateur. Le mot-clé private dans la définition de classe spécifie que les membres qui le suivent ne sont accessibles qu'à partir de la classe. Cela signifie que vous ne pouvez pas accéder aux données membres directement depuis l'extérieur de la classe, mais vous pouvez y accéder via les fonctions membres. Vous pouvez créer une instance d'une classe en utilisant l' opérateur type classe, comme ceci : new ou en déclarant une variable de Les classes sont une partie importante de C++ et sont largement utilisées dans de nombreux programmes pour définir des types de données personnalisés et encapsuler des données et des fonctionnalités. Contrôle d'accès des membres En C++, vous pouvez utiliser les mots clés membres d'une classe. public , private et protected pour spécifier le contrôle d'accès des Le mot-clé public spécifie que les membres qui le suivent sont accessibles depuis l'extérieur de la classe. Cela signifie que vous pouvez accéder aux fonctions membres et aux membres de données d'une instance de la classe depuis l'extérieur de la classe à l'aide de . opérateur. Le mot-clé private spécifie que les membres qui le suivent ne sont accessibles qu'à partir de la classe. Cela signifie que vous ne pouvez pas accéder aux données membres directement depuis l'extérieur de la classe, mais vous pouvez y accéder via les fonctions membres. Le mot-clé protected spécifie que les membres qui le suivent ne sont accessibles qu'à partir de la classe et de ses classes dérivées. Cela signifie que vous ne pouvez pas accéder aux données membres directement depuis l'extérieur de la classe, mais vous pouvez y accéder via les fonctions membres de la classe et de ses classes dérivées. Voici un exemple d'utilisation du contrôle d'accès dans une définition de classe : Dans cet exemple, la classe Point a deux fonctions membres publiques, getX et getY , qui peuvent être appelées depuis l'extérieur de la classe à l'aide de la classe . opérateur. Les membres de données x_ et sont privés, ce qui signifie qu'ils ne sont accessibles qu'à partir de la classe. Le contrôle d'accès est une partie importante de C++ et est utilisé pour spécifier quels membres d'une classe sont accessibles depuis l'extérieur de la classe. Il vous permet d'encapsuler des données et des fonctionnalités et de contrôler leur utilisation. qu'est-ce qu'un ami En C++, une fonction friend est une fonction qui a accès aux membres privés et protégés d'une classe. Une fonction amie n'est pas une fonction membre de la classe, mais elle a accès aux détails d'implémentation internes de la classe. y_ Vous pouvez déclarer une fonction comme de la classe, comme ceci : amie d'une classe en utilisant le mot-clé friend dans la définition Dans cet exemple, la classe Point a un membre de données privé, x_ , et une fonction friend , distance , qui a accès au membre de données x_ . La fonction de distance n'est pas une fonction membre de la classe Point , mais elle peut accéder aux données privées membres de la classe Point comme s'il s'agissait d'une fonction membre. sont utiles lorsque vous souhaitez autoriser une fonction à accéder aux données privées membres d'une classe, mais que vous ne souhaitez pas faire de la fonction une fonction membre de la classe. Ils sont également utilisés pour implémenter la surcharge d'opérateurs en C++. friend sont une partie importante de C++ et sont largement utilisées dans de nombreux programmes pour implémenter des techniques de programmation avancées et la surcharge des opérateurs. friend privé En C++, le mot clé private est utilisé pour spécifier le contrôle d'accès pour les membres d'une classe. Les membres d'une classe qui sont déclarés comme privés ne sont accessibles que depuis l'intérieur de la classe, et ils ne sont pas accessibles directement depuis l'extérieur de la classe. Voici un exemple d'utilisation du mot clé Dans cet exemple, la classe Point private dans une définition de classe : a deux fonctions membres publiques, getX et getY , qui peuvent être appelées depuis l'extérieur de la classe à l'aide de la classe . opérateur. Les membres de données sont privés, ce qui signifie qu'ils ne sont accessibles qu'à partir de la classe. x_ et y_ Le contrôle d'accès privé est utilisé pour encapsuler les données et les fonctionnalités et contrôler leur utilisation. Il vous permet de masquer les détails d'implémentation d'une classe au code externe et de protéger l'intégrité des données. Le mot clé private est une partie importante de C++ et est largement utilisé dans de nombreux programmes pour spécifier le contrôle d'accès pour les membres d'une classe. protégé En C++, le mot clé protected est utilisé pour spécifier le contrôle d'accès pour les membres d'une classe. Les membres d'une classe qui sont déclarés comme protégés ne sont accessibles qu'à partir de la classe et de ses classes dérivées, et ils ne sont pas accessibles directement depuis l'extérieur de la classe. Voici un exemple d'utilisation du mot clé protected dans une définition de classe : Dans cet exemple, la classe Point a deux fonctions membres publiques, getX et getY , qui peuvent être appelées depuis l'extérieur de la classe à l'aide de la classe . opérateur. Les membres de données x_ et sont protégés, ce qui signifie qu'ils ne sont accessibles qu'à partir de la classe Point et de ses classes dérivées. La classe ColorPoint est dérivée de la classe Point et a accès aux membres de données x_ et ces membres de données ne sont pas accessibles depuis l'extérieur de la classe ColorPoint . y_ y_ . Cependant, Le contrôle d'accès protégé est utilisé pour permettre aux classes dérivées d'accéder aux données et aux fonctionnalités de leurs classes de base, tout en masquant les détails d'implémentation du code externe. C'est une partie importante du mécanisme d'héritage en C++ et est largement utilisé dans de nombreux programmes pour spécifier le contrôle d'accès pour les membres d'une classe. Publique En C++, le mot clé public est utilisé pour spécifier le contrôle d'accès pour les membres d'une classe. Les membres d'une classe qui sont déclarés comme public sont accessibles depuis l'extérieur de la classe, et ils peuvent être accédés directement en utilisant le . opérateur. Voici un exemple d'utilisation du mot clé public dans une définition de classe : Dans cet exemple, la classe Point a deux fonctions membres publiques, getX et getY , qui peuvent être appelées depuis l'extérieur de la classe à l'aide de la classe . opérateur. Les membres de données x_ et sont privés, ce qui signifie qu'ils ne sont accessibles qu'à partir de la classe. y_ Le contrôle d'accès public est utilisé pour spécifier quels membres d'une classe sont accessibles depuis l'extérieur de la classe. Il vous permet d'exposer les données et les fonctionnalités d'une classe à du code externe et de contrôler son utilisation. Le mot clé public est une partie importante de C++ et est largement utilisé dans de nombreux programmes pour spécifier le contrôle d'accès pour les membres d'une classe. Initialisation des accolades En C++, l'initialisation des accolades est un moyen d'initialiser des variables et des objets à l'aide d'accolades {} . Il permet de spécifier les valeurs des variables ou des arguments au constructeur d'un objet lors de sa création. Voici quelques exemples d'utilisation de l'initialisation des accolades : L'initialisation des accolades est préférée aux autres formes d'initialisation en C++ car elle est plus expressive et moins sujette aux erreurs. Il est également plus flexible et vous permet d'initialiser des variables et des objets avec une gamme plus large de valeurs et de types. L'initialisation des accolades est une partie importante de C++ et est largement utilisée dans de nombreux programmes pour initialiser des variables et des objets. Il est particulièrement utile lorsque vous souhaitez spécifier des valeurs ou des arguments autres que ceux par défaut pour le constructeur d'un objet. Gestion de la durée de vie et des ressources des objets (RAII) En C++, la durée de vie d'un objet fait référence à la période de temps pendant laquelle l'objet existe en mémoire et est accessible à partir de votre code. Une bonne gestion de la durée de vie des objets est importante car elle détermine quand les ressources sont allouées et libérées, et combien de temps les ressources sont disponibles pour votre programme. Une manière courante de gérer la durée de vie des objets et des ressources en C++ consiste à utiliser la technique RAII (Resource Acquisition Is Initialization). RAII est un modèle de conception qui utilise la durée de vie des objets pour gérer les ressources de manière sûre, efficace et sans exception. L'idée de base du RAII est d'associer l'acquisition d'une ressource à la création d'un objet, et la libération de la ressource à la destruction de l'objet. Cela garantit que la ressource est automatiquement libérée lorsque l'objet sort de la portée ou est détruit, même si une exception est levée. Voici un exemple d'utilisation de RAII pour gérer la durée de vie d'un objet et d'une ressource : Dans cet exemple, la classe File gère la durée de vie d'un handle de fichier. Le descripteur de fichier est acquis dans le constructeur de l' objet File et publié dans le destructeur. Cela garantit que le descripteur de fichier est toujours correctement fermé, même si une exception est levée pendant l'utilisation du fichier. RAII est une partie importante de C++ et est largement utilisé dans de nombreux programmes pour gérer la durée de vie des objets et des ressources de manière sûre et efficace. Cela aide à prévenir les fuites de ressources et à améliorer la fiabilité et la sécurité des exceptions de votre code. Idiome Pimpl pour l'encapsulation au moment de la compilation En C++, l'idiome Pointer to IMPLementation (Pimpl) est un modèle de conception utilisé pour réaliser l'encapsulation au moment de la compilation des détails d'implémentation. Il est utilisé pour masquer les détails d'implémentation d'une classe à partir de l'interface publique, tout en permettant à la classe d'être utilisée de manière sécurisée. L'idée de base de l'idiome Pimpl est de définir l'interface publique d'une classe dans un fichier d'en-tête et de définir les détails d'implémentation dans un fichier source séparé. Les détails d'implémentation sont accessibles via un pointeur vers une classe déclarée en avant qui est définie dans le fichier d'implémentation. Portabilité aux limites ABI En C++, l'Application Binary Interface (ABI) définit les conventions et les règles d'interaction entre les différents composants logiciels au niveau binaire. Il spécifie comment les données sont disposées en mémoire, comment les appels et les retours de fonction sont effectués, et d'autres détails de bas niveau qui sont nécessaires pour que différents composants logiciels interagissent. Lors de l'écriture de code C++ portable, il est important de considérer l'ABI aux frontières entre les différents composants logiciels, tels que les bibliothèques, les exécutables et les objets partagés. Différents compilateurs et plates-formes peuvent avoir des ABI différents, et il est important de s'assurer que votre code est compatible avec les ABI des plates-formes que vous ciblez. Il existe plusieurs façons d'assurer la portabilité aux limites ABI en C++ : 1. Utilisez un ABI stable : certaines plates-formes, telles que Linux et Windows, ont des ABI stables qui sont pris en charge par plusieurs compilateurs. En utilisant une ABI stable, vous pouvez vous assurer que votre code est compatible avec différents compilateurs et platesformes. 2. Utilisez une ABI multiplateforme : plusieurs ABI multiplateformes sont disponibles, telles que l'ABI Itanium C++, qui sont prises en charge par plusieurs compilateurs sur différentes plates-formes. En utilisant une ABI multiplateforme, vous pouvez vous assurer que votre code est portable sur différentes plateformes. 3. Utilisez un système de gestion des versions : certains systèmes, tels que le système de gestion des versions ELF sous Linux, vous permettent de spécifier différentes versions de votre code pour différentes ABI. En utilisant un système de gestion des versions, vous pouvez vous assurer que votre code est compatible avec différentes ABI et plates-formes. 4. Utiliser une couche de compatibilité : Certains systèmes, tels que le format Microsoft Windows Portable Executable (PE), vous permettent de spécifier des informations de compatibilité dans le binaire. En utilisant une couche de compatibilité, vous pouvez vous assurer que votre code est compatible Chapitre douze Constructeurs En C++, un constructeur est une fonction membre spéciale d'une classe qui est appelée lorsqu'un objet de la classe est créé. Les constructeurs sont utilisés pour initialiser les membres de données de l'objet et effectuer toute autre tâche requise pour configurer l'objet en vue de son utilisation. Les constructeurs ont le même nom que la classe et n'ont pas de type de retour, pas même void. Ils sont automatiquement appelés par le compilateur lorsqu'un objet est créé, et ils ne peuvent pas être appelés directement depuis votre code. Voici un exemple de classe avec un constructeur : Dans cet exemple, la classe Point a un constructeur qui prend deux arguments, x et y , et initialise les membres de données x_ et y_ avec ces valeurs. Le constructeur n'a pas de type de retour, et il est appelé automatiquement par le compilateur lorsqu'un objet de la classe Point est créé. Les constructeurs sont une partie importante de C++ et sont largement utilisés dans de nombreux programmes pour initialiser des objets et effectuer d'autres tâches lors de leur création. Vous pouvez définir plusieurs constructeurs dans une classe pour fournir différentes manières de créer des objets ou pour prendre en charge Constructeurs de copie et opérateurs d'affectation de copie En C++, un constructeur de copie est une fonction membre spéciale d'une classe qui est appelée lorsqu'un objet de la classe est créé en tant que copie d'un autre objet. Un opérateur d'affectation de copie est une fonction membre spéciale qui est appelée lorsqu'un objet est affecté à un autre objet. Les constructeurs de copie et les opérateurs d'affectation de copie sont utilisés pour effectuer une copie complète d'un objet, ce qui signifie qu'ils créent un nouvel objet avec une copie distincte des membres de données de l'objet d'origine. Cela est nécessaire pour garantir que le nouvel objet est indépendant de l'objet d'origine et peut être modifié sans affecter l'objet d'origine. Voici un exemple de classe avec un constructeur de copie et un opérateur d'affectation de copie : Dans cet exemple, la classe Point a un constructeur de copie qui prend une référence const à un autre objet Point et initialise les données membres du nouvel objet avec les valeurs de l'objet d'origine. L'opérateur d'affectation de copie est défini comme un opérateur d'affectation surchargé qui effectue une copie complète des membres de données de l'objet d'origine. Les constructeurs de copie et les opérateurs d'affectation de copie sont une partie importante de C++ et sont largement utilisés dans de nombreux programmes pour prendre en charge la création et l'affectation d'objets. Ils sont nécessaires pour s'assurer que les objets sont correctement copiés et modifiés sans affecter les objets d'origine. Déplacer les constructeurs et déplacer les opérateurs d'affectation En C++, un constructeur de déplacement est une fonction membre spéciale d'une classe qui est appelée lorsqu'un objet de la classe est créé en déplaçant le contenu d'un autre objet. Un opérateur d'affectation de déplacement est une fonction membre spéciale qui est appelée lorsqu'un objet est affecté à un autre objet en déplaçant le contenu de l'objet d'origine. Les constructeurs de déplacement et les opérateurs d'affectation de déplacement sont utilisés pour effectuer un déplacement d'un objet, ce qui signifie qu'ils transfèrent le contenu de l'objet d'origine vers le nouvel objet sans faire de copie. Ceci est plus efficace que de faire une copie car cela évite la surcharge de copie des membres de données de l'objet. Voici un exemple de classe avec un constructeur de déplacement et un opérateur d'affectation de déplacement : Dans cet exemple, la classe Point a un constructeur de déplacement qui prend une référence rvalue à un autre objet Point et initialise les données membres du nouvel objet avec les valeurs de l'objet d'origine. L'opérateur d'affectation de déplacement est défini comme un opérateur d'affectation surchargé qui effectue un déplacement des membres de données de l'objet d'origine. Les constructeurs de déplacement et les opérateurs d'affectation de déplacement sont une partie importante de C++ et sont largement utilisés dans de nombreux programmes pour prendre en charge la création et l'affectation efficaces d'objets. Ils sont particulièrement utiles lorsque vous travaillez avec des objets volumineux ou des objets avec des opérations de copie coûteuses, car ils peuvent améliorer les performances de votre code. Constructeurs délégués En C++, la délégation de constructeurs est une fonctionnalité qui permet à un constructeur d'une classe d'appeler un autre constructeur de la même classe dans le cadre de son initialisation. Cela peut être utile lorsque vous souhaitez fournir plusieurs façons de construire un objet ou lorsque vous souhaitez réutiliser le code d'initialisation d'un constructeur dans un autre constructeur. Pour utiliser des constructeurs délégués, vous pouvez utiliser la syntaxe : suivie du nom du constructeur que vous souhaitez appeler et des arguments que vous souhaitez lui transmettre. Le constructeur appelé est exécuté avant le corps du constructeur appelant, et il peut initialiser les membres de données et effectuer d'autres tâches selon les besoins. Voici un exemple de classe avec des constructeurs délégués : Dans cet exemple, la classe Point a trois constructeurs : un constructeur par défaut, un constructeur à un argument et un constructeur à deux arguments. Le constructeur par défaut et le constructeur à argument unique utilisent des constructeurs de délégation pour initialiser les données membres de l'objet en appelant le constructeur à deux arguments avec les arguments appropriés. Les constructeurs délégués sont une partie importante de C++ et sont largement utilisés dans de nombreux programmes pour fournir plusieurs façons de construire des objets et de réutiliser le code d'initialisation. Ils peuvent améliorer la lisibilité et la maintenabilité de votre code en réduisant la duplication et en vous permettant de centraliser les tâches d'initialisation courantes dans un seul constructeur. Destructeurs En C++, un destructeur est une fonction membre spéciale d'une classe qui est appelée lorsqu'un objet de la classe est détruit. Les destructeurs sont utilisés pour effectuer toutes les tâches nécessaires pour nettoyer l'objet et libérer toutes les ressources qu'il contient. Les destructeurs ont le même nom que la classe précédé d'un tilde ( ~ ) et n'ont pas d'arguments ni de type de retour. Ils sont automatiquement appelés par le compilateur lorsqu'un objet sort de la portée ou est supprimé, et ils ne peuvent pas être appelés directement à partir de votre code. Voici un exemple de classe avec un destructeur : Dans cet exemple, la classe Point a un destructeur qui n'a pas d'arguments ou de type de retour et n'exécute aucune tâche. Le destructeur est appelé automatiquement par le compilateur lorsque l' objet sort de la portée à la fin de main . Les destructeurs sont une partie importante de C++ et sont largement utilisés dans de nombreux programmes pour libérer des ressources et effectuer d'autres tâches lorsque des objets sont détruits. Vous pouvez définir un destructeur dans une classe pour effectuer toutes les tâches requises pour p nettoyer l'objet avant qu'il ne soit détruit. Aperçu des fonctions des membres En C++, les fonctions membres sont des fonctions qui sont définies dans une classe et opèrent sur les données membres de la classe. Ils constituent une partie importante de l'interface de classe et sont utilisés pour fournir le comportement et les fonctionnalités de la classe. Les fonctions membres ont plusieurs caractéristiques qui les distinguent des autres types de fonctions : 1. Les fonctions membres sont définies dans la définition de classe et ont accès aux données privées membres de la classe. Cela leur permet d'agir sur l'état interne de l'objet et de fournir le comportement et la fonctionnalité souhaités. 2. Les fonctions membres sont appelées à l'aide de . ou -> opérateur, selon que l'objet est une référence ou un pointeur. Cela vous permet d'appeler la fonction membre sur un objet et d'accéder à ses membres de données. 3. Les fonctions membres peuvent être déclarées en tant que const , ce qui signifie qu'elles ne modifient pas les données membres de l'objet et peuvent être appelées sur un objet const. Cela vous permet de définir des fonctions qui ne modifient pas l'état de l'objet et peuvent être appelées à partir du contexte const. Voici un exemple de classe avec quelques fonctions membres : spécificateur virtuel En C++, le spécificateur virtuel est utilisé pour déclarer une fonction membre virtuelle dans une classe. Une fonction membre virtuelle est une fonction membre qui peut être remplacée par des classes dérivées, leur permettant de fournir leur propre implémentation de la fonction. Le spécificateur virtuel est utilisé dans la déclaration de la fonction membre dans la classe de base, et la fonction est marquée comme override dans la classe dérivée pour indiquer qu'elle remplace l'implémentation de la classe de base. Voici un exemple de classe avec une fonction membre virtuelle : Dans cet exemple, la classe Shape a une fonction de membre virtuel pur draw qui est déclarée avec le spécificateur virtual et n'a pas d'implémentation. Les classes Circle et Square sont dérivées de Shape et fournissent leurs propres implémentations de la fonction draw en la marquant comme override . Les fonctions membres virtuelles sont une partie importante de C++ et sont largement utilisées dans de nombreux programmes pour prendre en charge le polymorphisme et le polymorphisme d'exécution. Ils vous permettent de définir une interface commune pour un groupe de classes associées et de fournir différentes implémentations pour chaque classe, en fonction de son comportement et de ses fonctionnalités spécifiques. spécificateur de remplacement En C++, le spécificateur de remplacement est utilisé pour indiquer qu'une fonction membre dans une classe dérivée remplace une fonction membre virtuelle dans la classe de base. Le spécificateur de remplacement garantit que la fonction de classe dérivée a la même signature et le même type de retour que la fonction de classe de base, et il aide à éviter les erreurs et à améliorer la lisibilité du code. Le spécificateur de remplacement est utilisé dans la déclaration de la fonction membre dans la classe dérivée et doit être précédé du spécificateur virtuel dans la déclaration de la fonction de classe de base. Voici un exemple de classe avec une fonction membre virtuelle et une fonction surchargée : Dans cet exemple, la classe Shape a une fonction de membre virtuel pur draw qui est déclarée avec le spécificateur virtual et n'a pas d'implémentation. La classe Circle est dérivée de Shape et fournit sa propre implémentation de la fonction draw en la marquant comme override . Le spécificateur de remplacement est une partie importante de C++ et est largement utilisé dans de nombreux programmes pour indiquer qu'une fonction membre dans une classe dérivée remplace une fonction membre virtuelle dans la classe de base. Cela permet de s'assurer que la fonction de classe dérivée a la signature et le type de retour corrects et d'éviter les erreurs dans l'implémentation de la classe dérivée. table des matières Votre guide complet étape par étape pour tout savoir sur C++ Présentation Chapitre un notions de base Système de types C++ Portée Fichiers d'en-tête Unités de traduction et liaison fonction principale et arguments de ligne de commande Arrêt du programme Valeurs L et valeurs r Objets temporaires Alignement Trivial, mise en page standard et types de POD qu'est-ce que les types de valeur Conversions de type et sécurité de type Conversions standards Chapitre II types intégrés Types intégrés Plages de types de données nullpt nullptr bouffon faux vrai __m64 __m128 __m128d __m128i __ptr32, __ptr64 Chapitre III LIMITES NUMERIQUES Limites numériques Limites d'entiers Limites flottantes le quatrième chapitre Déclarations et définitions Classes de stockage automatique const constexpr externe Initialiseurs Alias et typedefs en utilisant la déclaration volatil décltype Attributs Chapitre V Opérateurs intégrés, priorité et association aligner l'opérateur Opérateur __uuidof Opérateurs additifs : + et Adresse de l'opérateur : & Opérateurs d'affectation Opérateur ET au niveau du bit : & Opérateur OU exclusif au niveau du bit : ^ Opérateur OU inclusif au niveau du bit : | Opérateur de distribution : () Opérateur virgule : , Opérateur conditionnel : ? : supprimer l'opérateur Opérateurs d'égalité : == et != Opérateur de conversion de type explicite : () Opérateur d'appel de fonction : () Opérateur d'indirection : * Opérateurs de décalage à gauche et à droite (>> et <<) Opérateur ET logique : && Opérateur de négation logique : ! Opérateur logique OU : || Opérateurs d'accès membres : . et -> Opérateurs multiplicatifs et opérateur de module nouvel opérateur Opérateur complément à un : ~ Opérateurs pointeur vers membre : .* et ->* Opérateurs d'incrémentation et de décrémentation suffixés : ++ et -Opérateurs d'incrémentation et de décrémentation préfixés : ++ et -Opérateurs relationnels : <, >, <= et >= Opérateur de résolution de portée : :: taille de l'opérateur Opérateur d'indice : opérateur typeid en Opérateurs unaires plus et négation : + et Expressions Chapitre six Types d'expressions Expressions primaires Modèles de points de suspension et variadiques Expressions postfixées Expressions avec opérateurs unaires Expressions avec opérateurs binaires Expressions constantes Sémantique des expressions qu'est-ce que le casting septième chapitre Opérateurs de fonderie opérateur dynamic_cast exception bad_cast opérateur static_cast opérateur const_cast opérateur reinterpret_cast Chapitre VIII Informations sur le type d'exécution (RTTI) exception bad_typeid type_info classe Déclarations Présentation des instructions C++ Énoncés étiquetés Énoncé d'expression Instruction nulle Instructions composées (Blocs) Chapitre Neuf Énoncés de sélection instruction if-else __if_exists instruction __if_not_exists instruction instruction switch Instructions d'itération tandis que la déclaration instruction do-while pour l'énoncé Basé sur la plage pour l'instruction Chapitre dix instructions de saut déclaration de rupture continuer la déclaration déclaration de retour aller à l'instruction Transferts de contrôle noms Énumérations Syndicats Fonctions Fonctions avec des listes d'arguments variables Surcharge de fonctions Fonctions explicitement définies par défaut et supprimées Recherche de nom dépendant de l'argument (Koenig) sur Arguments par défaut Fonctions en ligne Chapitre onze Surcharge opérateur Règles générales de surcharge des opérateurs Surcharger les opérateurs unaires Surcharge des opérateurs d'incrémentation et de décrémentation Opérateurs binaires Devoir Appel de fonction Abonnement Accès membre Classes et structures qu'est-ce que la classe quelle structure Aperçu des membres du groupe Contrôle d'accès des membres qu'est-ce qu'un ami privé protégé publique Initialisation des accolades Gestion de la durée de vie et des ressources des objets (RAII) Idiome Pimpl pour l'encapsulation au moment de la compilation Portabilité aux limites ABI Chapitre douze Constructeurs Constructeurs de copie et opérateurs d'affectation de copie Déplacer les constructeurs et déplacer les opérateurs d'affectation Constructeurs Destructeurs Vue d'ensemble des fonctions membres spécificateur virtuel remplacer le spécificateur