Le langage C++

Le C++ reprend la quasi-intégralité des concepts présents dans le langage C, si bien que les programmes écrits en langage C fonctionnent avec un compilateur C++. En réalité le langage C++ est un surensemble du C, il y ajoute, entre autres, des fonctionnalités objet :

L'encapsulation
L'héritage (simple et multiple)
Le polymorphisme
ainsi qu'un ensemble de nouvelles fonctionnalités, parmi lesquelles :

le contrôle de type
les arguments par défaut
la surcharge de fonctions
les fonctions inline
...
[ Ajouter un commentaire ] [ Aucun commentaire ]

# Posté le dimanche 04 décembre 2005 07:55

C++ (suite)

Le fichier source d'un programme écrit en langage C++ est un simple fichier texte dont l'extension est par convention .CPP.
Ce fichier source doit être un fichier texte non formaté, c'est-à-dire un fichier texte dans sa plus simple expression, sans mise en forme particulière ou caractères spéciaux, c'est-à-dire qu'il contient uniquement les caractères ASCII de base.

Lorsque le programme est prêt à être « essayé », il s'agit de le compiler (le traduire en langage machine) à l'aide d'un compilateur.

Il existe des environnements fournissant un éditeur de texte, un éditeur de liens et un compilateur. Ces environnements sont appelés EDI (Environnement de Développement Intégré).
Les principaux EDI permettant le développement d'applications en langage C++ sont :

Borland C++
Borland C++ Builder
Microsoft Visual C++
Aspect d'un programme en C++


Un programme écrit en langage C++ ressemble beaucoup à un programme écrit en langage C, à la différence près qu'il contient essentiellement des classes. Il comporte ainsi une fonction principale appelée main() renfermant les instructions qui doivent être exécutées. Celles-ci sont comprises entre des accolades qui suivent le nom de la fonction. Cela vous semble tombé du ciel si vous n'avez jamais programmé en C++, mais il faut admettre pour l'instant la manière d'écrire un programme en C++. La finalité de cette écriture vous sera dévoilée au cours des chapitres suivants...

Typologie


La manière d'écrire les choses en langage C++ a son importance. Le langage C++ est par exemple sensible à la casse (en anglais case sensitive), cela signifie qu'un nom contenant des majuscules est différent du même nom écrit en minuscules. Ainsi, les spécifications du langage C++ précisent que la fonction principale doit être appelée main() et non Main() ou MAIN().
D'autre part, toute instruction se termine par un point-virgule.

Ajout de commentaires


Lorsqu'un programme devient long et compliqué il peut être intéressant (il est même conseillé) d'ajouter des lignes de commentaires dans le programme, c'est-à-dire des portions du fichier source qui ont pour but d'expliquer le fonctionnement du programme sans que le compilateur ne les prenne en compte (car il générerait une erreur).

Pour ce faire, il est possible, comme en langage C, d'utiliser des balises qui vont permettre de délimiter les explications afin que le compilateur les ignore et passe directement à la suite du fichier.
Ces délimiteurs sont /* et */. Un commentaire sera donc noté de la façon suivante :

/* Voici un commentaire ! */
Il y a toutefois quelques règles à respecter : Les commentaires peuvent être placés n'importe où dans le fichier source
Les commentaires ne peuvent contenir le délimiteur de fin de commentaire (*/)
Les commentaires ne peuvent être imbriqués
Les commentaires peuvent être écrits sur plusieurs lignes
Les commentaires ne peuvent pas couper un mot du programme en deux
[ Ajouter un commentaire ] [ Aucun commentaire ]

# Posté le dimanche 04 décembre 2005 07:56

langage C++ (les types de données)

Les types de données


Les données manipulées en langage C++, comme en langage C, sont typées, c'est-à-dire que pour chaque donnée que l'on utilise (dans les variables par exemple) il faut préciser le type de donnée, ce qui permet de connaître l'occupation mémoire (le nombre d'octets) de la donnée ainsi que sa représentation :

des nombres : entiers (int) ou réels, c'est-à-dire à virgules (float)
des pointeurs (en anglais pointers) : permettent de stocker l'adresse d'une autre donnée, ils « pointent » vers une autre donnée
En C++ il existe plusieurs types d'entiers, dépendant du nombre d'octets sur lesquels ils sont codés ainsi que de leur format, c'est-à-dire s'ils sont signés (possédant le signe - ou +) ou non. Par défaut les données sont signées.

De plus, le langage C++ introduit par rapport au langage C un nouveau type de donnée appelé bool. Ce type de variable accepte deux états :

true (vrai) : correspondant à la valeur 1
false (faux) : correspondant à la valeur 0
Etant donné que ce type de donnée est codé sur 8 bits (un octet), 7 de ces bits ne servent à rien, puisqu'une variable de ce type ne peut prendre que deux états. En réalité, toutes les valeurs différentes de zéro sont considérées comme vraies (donc considérées comme égales à 1).

Voici un tableau donnant les types de données en langage C++ :

Type de donnée Signification Taille (en octets) Plage de valeurs acceptée
char Caractère 1 -128 à 127
unsigned char Caractère non signé 1 0 à 255
short int Entier court 2 -32 768 à 32 767
unsigned short int Entier court non signé 2 0 à 65 535
int Entier 2 (sur processeur 16 bits)
4 (sur processeur 32 bits) -32 768 à 32 767
-2 147 483 648 à 2 147 483 647
unsigned int Entier non signé 2 (sur processeur 16 bits)
4 (sur processeur 32 bits) 0 à 65 535
0 à 4 294 967 295
long int Entier long 4 -2 147 483 648 à 2 147 483 647
unsigned long int Entier long non signé 4 0 à 4 294 967 295
float Flottant (réel) 4 -3.4*10-38 à 3.4*1038
double Flottant double 8 -1.7*10-308 à 1.7*10308
long double Flottant double long 10 -3.4*10-4932 à 3.4*104932
bool Booléen Même taille que le type int, parfois 1 sur quelques compilateurs Prend deux valeurs : 'true' et 'false' mais une conversion implicite (valant 0 ou 1) est faite par le compilateur lorsque l'on affecte un entier (en réalité toute autre valeur que 0 est considérée comme égale à True).




Nombre entier (int)


Un nombre entier est un nombre sans virgule qui peut être exprimé dans différentes bases :

Base décimale : l'entier est représenté par une suite de chiffres unitaires (de 0 à 9) ne devant pas commencer par le chiffre 0
Base hexadécimale : l'entier est représenté par une suite d'unités (de 0 à 9 ou de A à F (ou a à f)) devant commencer par 0x ou 0X
Base octale : l'entier est représenté par une suite d'unités (incluant uniquement des chiffres de 0 à 7) devant commencer par 0
Les entiers sont signés par défaut, cela signifie qu'ils comportent un signe. Pour stocker l'information concernant le signe (en binaire), les ordinateurs utilisent le complément à deux.

Nombre à virgule (float)


Un nombre à virgule flottante est un nombre à virgule, il peut toutefois être représenté de différentes façons :

un entier décimal : 895
un nombre comportant un point (et non une virgule) : 845.32
une fraction : 27/11
un nombre exponentiel, c'est-à-dire un nombre (éventuellement à virgule) suivi de la lettre e (ou E), puis d'un entier correspondant à la puissance de 10 (signé ou non, c'est-à-dire précédé d'un + ou d'un -) :
2.75e-2
35.8E+10
.25e-2
En réalité, les nombres réels sont des nombres à virgule flottante, c'est-à-dire un nombre dans lequel la position de la virgule n'est pas fixe, et est repérée par une partie de ses bits (appelée l'exposant), le reste des bits permettent de coder le nombre sans virgule (la mantisse).

Les nombres de type float sont codés sur 32 bits dont :

23 bits pour la mantisse
8 bits pour l'exposant
1 bit pour le signe
Les nombres de type double sont codés sur 64 bits dont :

52 bits pour la mantisse
11 bits pour l'exposant
1 bit pour le signe
Les nombres de type long double sont codés sur 80 bits dont :

64 bits pour la mantisse
15 bits pour l'exposant
1 bit pour le signe
La précision des nombres réels est approchée. Elle dépend du nombre de positions décimales, suivant le type de réel elle sera au moins :

de 6 chiffres après la virgule pour le type float
de 15 chiffres après la virgule pour le type double
de 17 chiffres après la virgule pour le type long double
Caractère (char)



Le type char (provenant de l'anglais character) permet de stocker la valeur ASCII d'un caractère, c'est-à-dire un nombre entier !

Par défaut les nombres sont signés, cela signifie qu'ils comportent un signe. Pour stocker l'information concernant le signe (en binaire), les ordinateurs utilisent le complément à deux. Une donnée de type char est donc signée, cela ne signifie bien sûr pas que la lettre possède un signe mais tout simplement que dans la mémoire la valeur codant le caractère peut être négative...

Si jamais on désire par exemple stocker la lettre B (son code ASCII est 66), on pourra définir cette donnée soit par le nombre 66, soit en notant 'B' où les apostrophes simples signifient code ascii de...

Il n'existe pas de type de données pour les chaînes de caractères (suite de caractères) en langage C. Pour créer une chaîne de caractères on utilisera donc des tableaux contenant dans chacune de ses cases un caractère...

Créer un type de donnée


Il est possible en C++ comme en C de définir un nouveau type de données grâce au mot clé typedef. Celui-ci admet la syntaxe suivante :

typedef Caracteristiques_du_type Nom_du_type

Caracteristiques_du_type représente un type de données existant (par exemple float, short int, ...)
Nom_du_type définit le nom que vous donnez au nouveau type de donnée
Ainsi l'instruction suivante crée un type de donnée Ch calqué sur le type char :

typedef char Ch
Conversion de type de données


On appelle conversion de type de données le fait de modifier le type d'une donnée en une autre. Il peut arriver par exemple que l'on veuille travailler sur un type de variable, puis l'utiliser sous un autre type. Imaginons que l'on travaille par exemple sur une variable en virgule flottante (type float), il se peut que l'on veuille « supprimer les chiffres après la virgule », c'est-à-dire convertir un float en int. Cette opération peut être réalisée de deux manières :

conversion implicite : une conversion implicite consiste en une modification du type de donnée effectuée automatiquement par le compilateur. Cela signifie que lorsque l'on va stocker un type de donnée dans une variable déclarée avec un autre type, le compilateur ne retournera pas d'erreur mais effectuera une conversion implicite de la donnée avant de l'affecter à la variable. int x;

x = 8.324;
x contiendra après affectation la valeur 8.
conversion explicite : une conversion explicite (appelée aussi opération de cast) consiste en une modification du type de donnée forcée. Cela signifie que l'on utilise un opérateur dit de cast pour spécifier la conversion. L'opérateur de cast est tout simplement le type de donnée, dans lequel on désire convertir une variable, entre des parenthèses précédant la variable. int x;

x = (int)8.324;
x contiendra après affectation la valeur 8.
De plus, le langage C++ rajoute une notation fonctionnelle pour faire une conversion explicite, la syntaxe de cette notation est :

int x;

x = int(8.324);
[ Ajouter un commentaire ] [ Aucun commentaire ]

# Posté le dimanche 04 décembre 2005 07:58

Langage C++ (les variables)

Une variable est un objet repéré par son nom, pouvant contenir des données, qui pourront être modifiées lors de l'exécution du programme. Les variables en langage C++ sont typées, c'est-à-dire que les données contenues dans celles-ci possèdent un type, ainsi elles sont donc stockées à une adresse mémoire et occupent un nombre d'octets dépendant du type de donnée stockée.

En langage C++, les noms de variables peuvent être aussi long que l'on désire, toutefois le compilateur ne tiendra compte que des 32 premiers caractères. De plus, elles doivent répondre à certains critères :

un nom de variable doit commencer par une lettre (majuscule ou minuscule) ou un « _ » (pas par un chiffre)
un nom de variable peut comporter des lettres, des chiffres et le caractère « _ » (les espaces ne sont pas autorisés !)
les noms de variables ne peuvent pas être les noms suivants (qui sont des noms réservés) :
asm, auto
break
case, catch, char, class, const, continue
default, delete, do, double
else, enum, extern
float, for, friend
goto
if, inline, int
long
new
operator
private, protected, public
register, return
short, signed, sizeof, static, struct, switch
template, this, throw, try, typedef
union, unsigned
virtual, void, volatile
while
Nom de variable correct Nom de variable incorrect Raison
Variable Nom de Variable comporte des espaces
Nom_De_Variable 123Nom_De_Variable commence par un chiffre
nom_de_variable toto@mailcity.com caractère spécial @
nom_de_variable_123 Nom-de-variable signe - interdit
_707 this nom réservé


Les noms de variables sont sensibles à la casse (le langage C++ fait la différence entre un nom en majuscules et un nom en minuscules), il faut donc veiller à utiliser des noms comportant la même casse !


La déclaration de variables


Pour pouvoir utiliser une variable, il faut la définir, c'est-à-dire lui donner un nom, mais surtout un type de donnée à stocker afin qu'un espace mémoire conforme au type de donnée qu'elle contient lui soit réservé.

Une variable se déclare de la façon suivante :

type Nom_de_la_variable;
ou bien s'il y a plusieurs variables du même type :

type Nom_de_la_variable1, Nom_de_la_variable2, ...;
Le langage C++ impose que les variables soient impérativement déclarées
Le langage C++ permet de définir une variable à n'importe quel endroit du code, afin de le rendre plus lisible



Affectation d'une donnée à une variable


Pour stocker une donnée dans une variable que l'on a initialisée, il faut faire une affectation, c'est-à-dire préciser la donnée qui va être stockée à l'emplacement mémoire qui a été réservé lors de l'initialisation.

Pour cela on utilise l'opérateur d'affectation « = » :

Nom_de_la_variable = donnée;
Pour stocker le caractère B dans la variable que l'on a appelée Caractere, il faudra écrire :

Caractere = 'B';
Ce qui signifie stocker la valeur ASCII de « B » dans la variable nommée « Caractere ». Il est bien évident qu'il faut avoir préalablement déclaré la variable en lui affectant le type char :

char Caractere;
Initialisation d'une variable


La déclaration d'une variable ne fait que « réserver » un emplacement mémoire où stocker la variable. Tant que l'on ne lui a pas affecté une donnée celle-ci contient ce qui se trouvait précédemment à cet emplacement, que l'on appelle garbage (en français détritus).

On peut donc affecter une valeur initiale à la variable lors de sa déclaration, on parle alors d'initialisation :

type Nom_de_la_variable = donnee;
Par exemple :

float Toto = 125.36;
Portée (visibilité) des variables


Selon l'endroit où on déclare une variable, celle-ci pourra être accessible (visible) de partout dans le code ou bien que dans une portion confinée de celui-ci (à l'intérieur d'une fonction par exemple), on parle de portée (ou visibilité) d'une variable.

Lorsqu'une variable est déclarée dans le code même, c'est-à-dire à l'extérieur de toute fonction ou de tout bloc d'instruction, elle est accessible de partout dans le code (n'importe quelle fonction du programme peut faire appel à cette variable). On parle alors de variable globale.

Lorsque l'on déclare une variable à l'intérieur d'un bloc d'instructions (entre des accolades), sa portée se confine à l'intérieur du bloc dans lequel elle est déclarée.

Une variable déclarée au début du code, c'est-à-dire avant tout bloc de donnée, sera globale, on pourra alors l'utiliser à partir de n'importe quel bloc d'instruction.
Une variable déclarée à l'intérieur d'un bloc d'instructions (dans une fonction ou une boucle par exemple) aura une portée limitée à ce seul bloc d'instruction, c'est-à-dire qu'elle est inutilisable ailleurs, on parle alors de variable locale.
En C++, il existe un opérateur, appelé opérateur de résolution de portée, qui permet d'accéder à des variables globales plutôt qu'à des variables locales, lorsqu'il en existe portant le même nom. Cet opérateur se note ::. Imaginons que l'on définisse plusieurs variables portant le même nom dans des blocs différents :


int i = 3;



void main(){

int i = 12;

::i = i + ::i;

}


L'opérateur de résolution de portée placé devant le nom de la variable indique qu'il s'agit de la variable globale. Ainsi, l'instruction ::i = i + ::i; permet d'ajouter à la variable globale i (celle située en dehors de la fonction main()) la valeur de la variable locale i.

D'une manière générale il est tout de même préférable de donner des noms différents aux variables locales et globales...

Définition de constantes


Une constante est une variable dont la valeur est inchangeable lors de l'exécution d'un programme. En langage C, les constantes sont définies grâce à la directive du préprocesseur #define, qui permet de remplacer toutes les occurrences du mot qui le suit par la valeur immédiatement derrière elle. Par exemple la directive suivante remplacera toutes les chaînes de caractères « _Pi » par la valeur 3.1415927 :

#define _Pi 3.1415927
Toutefois, avec cette méthode les constantes ne sont pas typées, c'est pourquoi le C++ rajoute le mot réservé const, qui permet de définir une constante typée, qui ne pourra pas être modifiée pendant toute la durée d'exécution du programme. Il est ainsi nécessaire d'initialiser la constante dès sa définition :


const int A = 26;

const float Pi = 3.14159
[ Ajouter un commentaire ] [ Aucun commentaire ]

# Posté le dimanche 04 décembre 2005 08:00

Modifié le jeudi 08 décembre 2005 14:07

Les opérateurs (à quoi ça sert et qu'est-ce que c'est donc????)

Qu'est-ce qu'un opérateur ?


Les opérateurs sont des symboles qui permettent de manipuler des variables, c'est-à-dire effectuer des opérations, les évaluer, etc.
On distingue plusieurs types d'opérateurs :

les opérateurs de calcul
les opérateurs d'assignation
les opérateurs d'incrémentation
les opérateurs de comparaison
les opérateurs logiques
(les opérateurs bit-à-bit)
(les opérateurs de rotation de bit)
Les opérateurs de calcul


Les opérateurs de calcul permettent de modifier mathématiquement la valeur d'une variable.

Opérateur Dénomination Effet Exemple Résultat (avec x valant 7)
+ opérateur d'addition Ajoute deux valeurs x+3 10
- opérateur de soustraction Soustrait deux valeurs x-3 4
* opérateur de multiplication Multiplie deux valeurs x*3 21
/ opérateur de division Divise deux valeurs x/3 2.3333333
= opérateur d'affectation Affecte une valeur à une variable x=3 Met la valeur 3 dans la variable x


Les opérateurs d'assignation


Ces opérateurs permettent de simplifier des opérations telles que ajouter une valeur dans une variable et stocker le résultat dans la variable. Une telle opérations s'écrirait habituellement de la façon suivante par exemple : x=x+2
Avec les opérateurs d'assignation il est possible d'écrire cette opération sous la forme suivante : x+=2
Ainsi, si la valeur de x était 7 avant opération, elle sera de 9 après...

Les autres opérateurs du même type sont les suivants :

Opérateur Effet
+= additionne deux valeurs et stocke le résultat dans la variable (à gauche)
-= soustrait deux valeurs et stocke le résultat dans la variable
*= multiplie deux valeurs et stocke le résultat dans la variable
/= divise deux valeurs et stocke le résultat dans la variable


Les opérateurs d'incrémentation


Ce type d'opérateur permet de facilement augmenter ou diminuer d'une unité une variable. Ces opérateurs sont très utiles pour des structures telles que des boucles, qui ont besoin d'un compteur (variable qui augmente de un en un).

Un opérateur de type x++ permet de remplacer des notations lourdes telles que x=x+1 ou bien x+=1.

Opérateur Dénomination Effet Syntaxe Résultat (avec x valant 7)
++ Incrémentation Augmente d'une unité la variable x++ 8
-- Décrémentation Diminue d'une unité la variable x-- 6


Les opérateurs de comparaison


Opérateur Dénomination Effet Exemple Résultat (avec x valant 7)
==
A ne pas confondre avec le signe d'affectation (=) ! opérateur d'égalité Compare deux valeurs et vérifie leur égalité x==3 Retourne 1 si x est égal à 3, sinon 0
< opérateur d'infériorité stricte Vérifie qu'une variable est strictement inférieure à une valeur x<3 Retourne 1 si x est inférieur à 3, sinon 0
<= opérateur d'infériorité Vérifie qu'une variable est inférieure ou égale à une valeur x<=3 Retourne 1 si x est inférieur ou égal à 3, sinon 0
> opérateur de supériorité stricte Vérifie qu'une variable est strictement supérieure à une valeur x>3 Retourne 1 si x est supérieur à 3, sinon 0
>= opérateur de supériorité Vérifie qu'une variable est supérieure ou égale à une valeur x>=3 Retourne 1 si x est supérieur ou égal à 3, sinon 0
!= opérateur de différence Vérifie qu'une variable est différente d'une valeur x!=3 Retourne 1 si x est différent de 3, sinon 0


Les opérateurs logiques (booléens)


Ce type d'opérateur permet de vérifier si plusieurs conditions sont vraies :

Opérateur Dénomination Effet Syntaxe
|| OU logique Vérifie qu'une des conditions est réalisée ((condition1)||(condition2))
&& ET logique Vérifie que toutes les conditions sont réalisées ((condition1)&&(condition2))
! NON logique Inverse l'état d'une variable booléenne (retourne la valeur 1 si la variable vaut 0, 0 si elle vaut 1) (!condition)


(Les opérateurs bit-à-bit)


Si vous ne comprenez pas ces opérateurs cela n'est pas important, vous n'en aurez probablement pas l'utilité. Pour ceux qui voudraient comprendre, rendez-vous aux chapitres suivants :

Compréhension du binaire
Représentation des données
Instructions arithmétiques et logiques en assembleur
Ce type d'opérateur traite ses opérandes comme des données binaires, plutôt que des données décimales, hexadécimales ou octales. Ces opérateurs traitent ces données selon leur représentation binaire mais retournent des valeurs numériques standard dans leur format d'origine.

Les opérateurs suivants effectuent des opérations bit-à-bit, c'est-à-dire avec des bits de même poids.

Opérateur Dénomination Effet Syntaxe Résultat
& ET bit-à-bit Retourne 1 si les deux bits de même poids sont à 1 9 & 12 (1001 & 1100) 8 (1000)
| OU bit-à-bit Retourne 1 si l'un ou l'autre des deux bits de même poids est à 1 (ou les deux) 9 | 12 (1001 | 1100) 13 (1101)
^ OU exclusif bit-à-bit Retourne 1 si l'un des deux bits de même poids est à 1 (mais pas les deux) 9 ^ 12 (1001 ^ 1100) 5 (0101)


(Les opérateurs de rotation de bit)


Si vous ne comprenez pas ces opérateurs cela n'est pas important, vous n'en aurez probablement pas l'utilité. Pour ceux qui voudraient comprendre, rendez-vous aux chapitres suivants :

Compréhension du binaire
Représentation des données
Instructions arithmétiques et logiques en assembleur
Ce type d'opérateur traite ses opérandes comme des données binaires d'une longueur de 32 bits, plutôt que des données décimales, hexadécimales ou octales. Ces opérateurs traitent ces données selon leur représentation binaire mais retournent des valeurs numériques standard dans leur format d'origine.

Les opérateurs suivants effectuent des rotations sur les bits, c'est-à-dire qu'ils décalent chacun des bits d'un nombre de bits vers la gauche ou vers la droite. La première opérande désigne la donnée sur laquelle on va faire le décalage, la seconde désigne le nombre de bits duquel elle va être décalée.

Opérateur Dénomination Effet Syntaxe Résultat
<< Rotation à gauche Décale les bits vers la gauche (multiplie par 2 à chaque décalage). Les zéros qui sortent à gauche sont perdus, tandis que des zéros sont insérés à droite 6 << 1 (110 << 1) 12 (1100)
>> Rotation à droite avec conservation du signe Décale les bits vers la droite (divise par 2 à chaque décalage). Les zéros qui sortent à droite sont perdus, tandis que le bit non nul de poids plus fort est recopié à gauche 6 >> 1 (0110 >> 1) 3 (0011)
>>> Rotation à droite avec remplissage de zéros Décale les bits vers la droite (divise par 2 à chaque décalage). Les zéros qui sortent à droite sont perdus, tandis que des zéros sont insérés à gauche 6 >>> 1 (0110 >>> 1) 3 (0011)


Les priorités


Lorsque l'on associe plusieurs opérateurs, il faut que le compilateur sache dans quel ordre les traiter (ou plus exactement dans quel ordre il doit disposer les instructions), voici donc dans l'ordre décroissant les priorités de tous les opérateurs :

Priorité des opérateurs
() []
-- ++ ! ~ -
* / %
+ -
< <= >= >
== !=
^
|
&& ||
? :
= += -= *= /= %= <<= >>= >>>= &= ^= |=
,
[ Ajouter un commentaire ] [ Aucun commentaire ]

# Posté le dimanche 04 décembre 2005 08:00