Ces annexes contiennent quelques informations utiles pour vous aider à comprendre des codes sources que vous aurez trouvés au hasard du web et qui contiendraient des éléments du C++ pas abordés dans le cours.
Liste des opérateurs du C++
Cette annexe contient la liste des opérateurs du langage C++. Les opérateurs les plus courants ont été vus dans le cours mais il arrive que l'on ait besoin d'autres opérations ou que l'on tombe sur un code source mystérieux au hasard du web. Cette liste complète est là pour vous aider dans ces cas. Il ne sert à rien de l'apprendre par cœur.
Je vous invite à vous en servir comme référence pour avoir le bon prototype lors de la surcharge de vos opérateurs.
Nom | Symbole | Syntaxe | Priorité | Associativité | Prototype | Existe en C ? |
---|---|---|---|---|---|---|
Résolution de portée |
|
| 16 | Pas associatif | Non surchargeable | Non |
Appel de fonction |
|
| 15 | L-R |
| Oui |
Accès à un élément de tableau |
|
| 15 | L-R |
| Oui |
Accès à membre |
|
| 15 | L-R | Non surchargeable | Oui |
Accès à membre via un pointeur |
|
| 15 | L-R |
| Oui |
Identification de type |
|
| 15 | L-R | Non surchargeable | Non |
Incrémentation suffixée |
|
| 15 | L-R |
| Oui |
Décrémentation suffixée |
|
| 15 | L-R |
| Oui |
Déréférencement |
|
| 14 | R-L |
| Oui |
Adresse de |
|
| 14 | R-L |
| Oui |
NON logique |
|
| 14 | R-L |
| Oui |
NON bit à bit |
|
| 14 | R-L |
| Oui |
Taille en mémoire |
|
| 14 | R-L | Non surchargeable | Oui |
Plus unaire |
|
| 14 | R-L |
| Oui |
Moins unaire |
|
| 14 | R-L |
| Oui |
Incrémentation préfixée |
|
| 14 | R-L |
| Oui |
Décrémentation préfixée |
|
| 14 | R-L |
| Oui |
Allocation dynamique |
|
| 14 | R-L |
| Non |
Allocation dynamique de tableau |
|
| 14 | R-L |
| Non |
Libération |
|
| 14 | R-L |
| Non |
Libération de tableau |
|
| 14 | R-L |
| Non |
Déréférencement d'un pointeur membre |
|
| 13 | L-R | Non surchargeable | Non |
Déréférencement d'un pointeur membre |
|
| 13 | L-R |
| Non |
Multiplication |
|
| 12 | L-R |
| Oui |
Division |
|
| 12 | L-R |
| Oui |
Modulo |
|
| 12 | L-R |
| Oui |
Addition |
|
| 11 | L-R |
| Oui |
Soustraction |
|
| 11 | L-R |
| Oui |
Décalage de bit vers la gauche |
|
| 10 | L-R |
| Oui |
Décalage de bit vers la droite |
|
| 10 | L-R |
| Oui |
Strictement inférieur à |
|
| 9 | L-R |
| Oui |
Inférieur à |
|
| 9 | L-R |
| Oui |
Strictement supérieur à |
|
| 9 | L-R |
| Oui |
Supérieur à |
|
| 9 | L-R |
| Oui |
Est égal à |
|
| 8 | L-R |
| Oui |
Est différent de |
|
| 8 | L-R |
| Oui |
ET bit à bit |
|
| 7 | L-R |
| Oui |
OU exclusif (XOR) bit à bit |
|
| 6 | L-R |
| Oui |
OU bit à bit |
|
| 5 | L-R |
| Oui |
ET logique |
|
| 4 | L-R |
| Oui |
OU logique |
|
| 3 | L-R |
| Oui |
Opérateur ternaire |
|
| 2 | R-L | Non surchargeable | Oui |
Affectation |
|
| 1 | R-L |
| Oui |
Affectation par addition |
|
| 1 | R-L |
| Oui |
Affectation par soustraction |
|
| 1 | R-L |
| Oui |
Affectation par multiplication |
|
| 1 | R-L |
| Oui |
Affectation par division |
|
| 1 | R-L |
| Oui |
Affectation par modulo |
|
| 1 | R-L |
| Oui |
Affectation par ET bit à bit |
|
| 1 | R-L |
| Oui |
Affectation par OU exclusif (XOR) bit à bit |
|
| 1 | R-L |
| Oui |
Affectation par OU bit à bit |
|
| 1 | R-L |
| Oui |
Affectation par décalage de bits vers la gauche |
|
| 1 | R-L |
| Oui |
Affectation par décalage de bits vers la droite |
|
| 1 | R-L |
| Oui |
Opérateur virgule |
|
| 0 | R-L |
| Oui |
Quelques explications
Il y a deux colonnes un peu mystérieuses dans ce tableau, celles intitulées "Priorité" et "Associativité". La première indique dans quelle ordre les opérations seront effectuées, ce qu'on appelle l'ordre de préséance. Vous avez certainement appris à l'école qu'en arithmétique on effectue les multiplications avant les additions. C'est la même chose en C++. Certains opérations s'effectuent avant d'autres. Les opérations avec une plus grande priorité seront effectuées avant les autres. Ainsi, la ligne
a %= ++b*8;
correspond à la ligne
a %= ((++b)*8);
L'associativité indique dans quel ordre sont effectuées les opérations de même priorité. C'est-à-dire en allant de gauche à droite (LR = left to right) ou de droite à gauche (RL = right to left). Une suite de divisions comme :
a/b/c/d
sera interprétée comme valant :
((a/b)/c)/d
et non pas comme valant :
a/(b/(c/d))
ce qui serait le cas si l'opérateur division avait une associativité R-L.
Les prototypes
Les prototypes des surcharges sont donnés à titre d'exemple pour les cas d'utilisation les plus courants.C
représente la classe dont on cherche à surcharger les opérateurs,R
est le type du résultat (qui peut être le même queC
) etA
est une autre classe (potentiellement la même queC
ouR
).
Ainsi, pour la classeDuree
, l'opérateur += pour un entier s'écrira:
Duree& Duree::operator+=(int secondes); //Methode de classe
ou
Duree& operator+=(Duree& duree, int secondes); //Fonction libre en-dehors de toute classe
La première version étant une méthode de la classe et la deuxième une fonction libre. La première version est celle que nous avons dans le chapitre sur la surcharge d'opérateurs et je vous invite vivement à suivre les recettes données dans ce chapitre pour écrire vos opérateurs surchargés de manière optimale.
La différence entre l'opérateur incrémentation préfixée et suffixée est la présence d'un argument de typeint
dans la version suffixée. Cet argument est inutilisé dans le corps des fonctions et est uniquement là pour différentier les deux opérateurs.
L'opérateur ternaire
Cet opérateur est un brin spécial dans le sens où c'est le seul qui prend trois arguments. Il permet de remplacer l'instructionif(){}else{}
un peu à la manière de la fonctionSI()
que l'on retrouve dans les tableurs comme Microsoft Excel.
On l'utilise comme suit:
int a(2), b(4), c(5);
int resultat = a > 0 ? b : c;
qui se traduit par
int a(2), b(4), c(5);
int resultat;
if(a > 0)
resultat = b;
else
resultat = c;
C'est une notation plus concise que certains programmeurs adorent mais qui laisse souvent les débutants sur leur faim.
Liste des mots-clés du C++
Cette annexe contient la liste des mots-clés du langage C++. Nous avons vu une grande partie de ces mots-clés dans le cours mais certains plus rares ont été omis. L'important est de savoir qu'il est interdit d'utiliser un de ces mots pour nommer une variable, une fonction, méthode ou classe.
Nom | Courte description |
---|---|
| Permet de remplacer le symbole |
| Permet de remplacer le symbole |
| Permet de déclarer une portion de code écrite directement en assembleur. |
| Permet de déclarer une variable comme locale. La mémoire allouée sera automatiquement |
| Permet de remplacer le symbole |
| Permet de remplacer le symbole |
| Type de variable contenant une valeur booléenne (valant vrai ou faux uniquement). |
| Instruction permettant de sortir d'une boucle ( |
| Instruction indiquant un des cas d'un |
| Instruction introduisant un bloc permettant d'attraper des exceptions. |
| Type de variable contenant une lettre. |
| Mot-clé introduisant la définition d'une classe. |
| Permet de remplacer le symbole |
| Indique qu'une variable ou objet ne peut pas être modifié. |
| Permet de changer le type d'un objet déclaré |
| Instruction permettant de passer à l'itération suivante d'une boucle (for ou while). |
| Instruction indiquant le cas par défaut d'un |
| Opérateur libérant la mémoire allouée précédemment via |
| Déclare une boucle constituée d'une condition finale uniquement dont le corps est exécuté au moins une fois. |
| Type de variable contenant un nombre à virgule (généralement sur 64 bits). |
| Permet de changer le type d'un objet déclaré d'une classe parent vers enfant ou d'une classe parent à une autre. |
| Introduit une portion de code exécutée si un test |
| Mot-clé introduisant la définition d'un type énuméré. |
| Indique que le constructeur doit être appelé explicitement par l'utilisateur. |
| Mot-clé (non utilisé) permettant de séparer le prototype de la définition d'un |
| Indique qu'une variable ou un objet est déclaré dans un autre fichier source. |
| La valeur logique "faux". |
| Type de variable contenant un nombre à virgule (généralement sur 32 bits). |
| Déclare une boucle constituée d'une initialisation, d'une condition finale et d'un incrément. |
| Mot-clé permettant de déclarer une fonction ou une classe amie d'une autre classe. |
| Instruction permettant de sauter directement à un autre point du code source. |
| Introduit une structure conditionnelle. |
| Indique que le corps d'une fonction ou méthode doit être (si possible) copiée à l'endroit de l'appel. |
| Type de variable contenant un nombre entier (généralement sur 32 bits). |
| Type de variable contenant un nombre entier (généralement sur 64 bits). |
| Indique qu'un attribut peut changer même si l'instance de la classe est déclarée constante. |
| Mot-clé introduisant la définition d'un espace de nom. |
| Opérateur allouant de la mémoire et appelant le constructeur d'une variable ou d'un objet. |
| Permet de remplacer le symbole |
| Permet de remplacer le symbole |
| Permet de déclarer une surcharge d'opérateur. |
| Permet de remplacer le symbole |
| Permet de remplacer le symbole |
| Droit d'accès aux éléments d'une classe interdisant l'accès depuis l'extérieur de la classe. |
| Droit d'accès aux éléments d'une classe interdisant l'accès depuis l'extérieur de la classe |
| Droit d'accès aux éléments d'une classe autorisant l'accès depuis l'extérieur de la classe. |
| Indique qu'une variable ou un objet doit être stockée dans les registres du processeurs si possible. |
| Permet de changer le type d'un objet déclaré en réinterprétant les données brutes bit par bit. |
| Indique la valeur qu'une fonction doit renvoyer. |
| Type de variable contenant un nombre entier (généralement sur 16 bits). |
| Indique qu'un type peut contenir des valeurs positives et négatives (comportement par défaut). |
| Opérateur renvoyant la taille en octets d'un type. |
| Permet de déclarer un attribut ou une méthode comme étant statique. |
| Permet de changer le type d'un objet déclaré vers un autre objet si les types sont compatibles. |
| Mot-clé introduisant la définition d'une structure (une classe où tout est |
| Introduit une structure conditionnelle avec plusieurs sorties possibles selon la valeur de l'expression testée. |
| Mot-clé introduisant la définition d'un patron de classe ou de fonction. |
| Pointeur vers l'objet courant. |
| Instruction lançant une exception. |
| La valeur logique "vrai". |
| Instruction introduisant un bloc sensible aux exceptions. |
| Mot-clé introduisant la définition d'un alias de type. |
| Opérateur renvoyant des informations (nom, ...) sur un objet. |
| Permet de décrire un type indéterminé dans le cadre d'une fonction ou d'une classe template. |
| Mot-clé introduisant la définition d'une union (structure où les attributs utilisent la même adresse mémoire). |
| Indique qu'un type peut contenir des valeurs positives seulement. |
| Permet d'indiquer que l'on utilise les objets et variables d'un espace de nom sans avoir à le spécifier |
| Permet de déclarer une méthode comme étant virtuelle. |
| Type de retour d'une fonction ne renvoyant rien. |
| Indique qu'une variable peut changer à tout moment pour des raisons externes au programme. |
| Type de variable contenant une lettre généralisée (UTF-8 ou autre). |
| Déclare une boucle constituée d'une condition finale uniquement. |
| Permet de remplacer le symbole |
| Permet de remplacer le symbole |