Knowledge base dedicated to Linux and applied mathematics.
Accueil > C++ > Cours de C++ — 1. Introduction au C++
Voici une courte introduction au langage C++. On traitera de la définition et de l’initialisation de variables et de la compilation de programmes C++ au sein d’environnement de type Unix/Linux. Bonne lecture.
Le C++ est une extension du langage C crée par Brian Kernighan et Dennis Ritchie à la programmation objet. C’est Bjarne Stroustrup en 1982 qui introduit le C++. Les apports principaux de ses travaux ont été d’augmenter les capacités du langage C, sa sécurité et la programmation par objet. Un objet est une structure de données qui possède un état et un comportement :
– les données relatives à sa situation ou à son état sont des champs appelés attributs
– son comportement est caractérisé par des méthodes.
Il faut savoir que c’est un langage très difficile à maà®triser malgré sa facilité apparente !!!
Quels sont les avantages d’un tel langage :
– un langage très utilisé
– structuration du code
– encapsulation des données
– modularité accrue
– programmation générique
Les inconvénient du C++ sont peu nombreux mais existent tout de màªme
– lisibilité des programmes de bas niveaux
– pas de garbage collector en C++ autrement dit, il n’y a pas de recyclage de la mémoire préalablement allouée puis inutilisée.
– l’exécutable produit est plus lourd.
Les fichiers de bases en C++ ont généralement pour extension .cc ou .cpp alors que les bibliothèques de programmes se terminent par .h .
Nous allons voir à présent un premier exemple de code C++ .
Voici un programme de base en C++, nommez le file.cpp par exemple
#include <iostream>
using namespace std;
main()
{
cout << "My first program in C++";
}
Ce programme de base débute par une instruction pré-processing à savoir une directive
d’inclusion, en l’occurrence ici on introduit la bibliothèque d’entrée-sortie iostream
du C++ c’est à dire l’ensemble des fonctions permettant d’inter-agir avec la machine. Du point de vue programmation, la directive d’inclusion
indique au préprocesseur de remplacer la ligne courante par l’ensemble des lignes du fichier nommé en paramètre.
La seconde ligne du programme indique que l’on utilise l’espace standard à savoir std, nous verrons plus tard
que signifie cette directive.
main()
indique que l’on débute un programme ; le main est le programme principal en C++. Il s’agit d’une suite
d’instructions délimités par les accolades {} l’ensemble accolades+instructions à l’intérieur des accolades
est appelé bloc d’instructions. Un main est donc constitué d’un bloc d’instructions.
Regardons à présent l’instruction
cout << "My first program in C++";
cout << est l’opérateur de flux de sortie. C’est quoi ? Il s’agit d’une commande appartenant à la
bibliothèque iostream, elle permet de renvoyer en sortie (à l’écran) un message, le message est ici une chaine
de caractères délimitée par des guillemets " ". à€ noter que cette instruction se termine par un ;
Il faut savoir que toutes les instructions en C++ se terminent par un ; excepté les structures de contrà´le
que nous verrons par la suite.
Nous avons certes écrit un programme C++, mais comment l’exécuter ? Nous nous limiterons ici que dans le cadre
des systèmes de type Unix/Linux. Pour les utilisateurs de Windows, je ferai une introduction à Visual Studio C++. Alors pourquoi
un site dédié à Linux présenterait il un logiciel Microsoft ? Pour la simple et bonne raison que Visual Studio C++ est incontournable
dans le monde de l’entreprise. Un bon programmeur doit s’adapter à différents environnements et c’est dans cette démarche que je
m’inscris ...
Pour compiler un programme C++, on utilise la commande suivante
g++ file.cpp
o๠file.cpp est votre fichier source, c’est à dire le fichier contenant votre programme. Si tout se passe bien
(pas d’erreur de programmation) un exécutable est produit : il s’agit par défaut du fichier a.out . Pour l’exécuter
on utilise la commande
./a.out
On peut évidemment donner un nom à l’exécutable produit, on procède alors comme suit :
g++ file.cpp -o application
Pour l’exécuter, on procède comme précédemment
./application
La commande générale de compilation est donc :
g++ nom_du_fichier_source -o nom_executable
Remarque. Parfois les débutants confondent erreur de compilation et avertissements ...
Un warning ou un avertissement n’est pas une erreur de compilation, vous pouvez donc exécuter votre programme.
Un conseil : analysez toujours les messages qui vous sont renvoyés par le compilateur. Si vous voulez
ne plus voir les warnings (avertissements), utilisez l’option -w
g++ -w file.cpp -o application
Pour définir une variable, on doit définir son type et lui donner un nom ou un identificateur.
L’idenficateur est une chaà®ne de caractères, faites attention le C++ respecte la casse, c’est à dire
que toto est différent de Toto, le C++ fait dont la distinction entre les minuscules et les majuscules.
Pour déclarer une variable en C++, on procède comme suit
type identificateur;
Regardons à présent les types existants en C++.
Rappelons au préalable que les données informatiques occupent un espace mémoire
dont l’unité est l’octet, c’est à dire 8 bits. 1 bit représente une
unité élémentaire d’information, un bit est l’information de base d’un ordinateur, il correspond à 0 ou 1 soit un circuit fermé ou un circuit ouvert, un ordinateur traite les informations au niveau du bit qui sert ainsi d’unité.
Il existe plusieurs types d’entier en C++, comme le montre le tableau suivant
Type | Définition | Taille en octets | Plage de valeurs |
int | Entier | 2 pour les processeurs 16-bits | -32 768 à 32 767 |
int | Entier | 4 pour les processeurs 32-bits | -2 147 483 648 à 2 147 483 647 |
short int | Entier court | 2 | -32 768 à 32 767 |
unsigned short int | Entier court non signé | 2 | 0 à 65 535 |
unsigned int | Entier non signé | 2 pour les processeurs 16-bits | 0 à 65 535 |
unsigned int | Entier non signé | 4 pour les processeurs 32-bits | 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 |
Les types non signés (unsigned) ne possèdent pas de nombre négatif.
De la màªme manière, on définit les types réels comme suit :
Type | Définition | Taille en octets | Plage de valeurs |
float | Flottant | 4 | -3.4*10^-38 à 3.4*10^38 |
double | Flottant double | 8 | -1.7*10^-308 à 1.7*10^308 |
long double | Flottant double long | 10 | -3.4*10^-4932 à 3.4*10^4932 |
Voici un programme vous permettant suivant votre machine de voir la mémoire
alloué aux divers types C++ :
#include <iostream>
using namespace std;
main()
{
long double my_pi=3.14;
cout << "size(bool):=\t\t" << sizeof(bool) << endl;
cout << "size(int):=\t\t" << sizeof(int) << endl;
cout << "size(short int):=\t" << sizeof(short) << endl;
cout << "size(long int):=\t" << sizeof(long) << endl;
cout << "size(char):=\t\t" << sizeof(char) << endl;
cout << "size(float):=\t\t" << sizeof(float) << endl;
cout << "size(double):=\t\t" << sizeof(double) << endl;
cout << "size(long double):=\t" << sizeof(long double) << endl;
cout << "size(my_pi):=\t\t" << sizeof(my_pi) << endl;
}
La commande sizeof renvoie un entier représentant la taille du type pris en argument.
Une des particularités du C++ par rapport au C est d’offrir un type booléen.
Le type bool ne peut prendre que deux valeurs
– true ou 1
– false ou 0
Néanmoins, le type bool est défini sur un octet (8 bits) or la valeur 0 ou 1 n’occupe que
1 bit, il reste donc 7 octets de libre ... Une des conséquences, de cette liberté d’espace est finalement
que toute donnée différente de 0 et comportant au plus 8 bits sera considérée comme vraie (true).
Le tableau suivant nous donne les opérateurs de comparaison permettant de définir des booléens.
Opérateur | Signification | Exemple | Résultat |
== | égal à | 2==3 | 0 |
!= | différent de | 2 !=3 | 1 |
< | strictement inférieur à | 2<3 | 1 |
> | strictement supérieur à | 2>3 | 0 |
<= | inférieur ou égal à | 2<=2 | 1 |
>= | supérieur ou égal à | 2>=0 | 1 |
Le programme suivant
#include <iostream>
using namespace std;
main()
{
bool equality(1 == 2);
cout << "equality:="<< equality <<endl;
}
a pour résultat
equality:=0
Un caractère est codé sur 1 octet soit sur 8 bits. Un caractère est un entier particulier situé
entre 0 et 255, à la différence près qu’il sert de représentation pour les textes. Autrement dit,
la lettre A est représentée en machine par l’entier 65.
Voici un exemple :
#include <iostream>
using namespace std;
main()
{
char letter_1 = 'A', letter_2 = 65;
bool equality(letter_1 == letter_2);
cout << "equality:="<< equality << endl;
}
On a défini les variables letter_1 et letter_2 respectivement par le caractère A
et par sa représentation entière ; on vérifie ensuite à l’aide d’un booléen si ces deux caractères
sont égaux. Le résultat est le suivant :
equality:=1
Il existe comme dans d’autres langages des caractères spéciaux
Caractère | Action |
\n | Passage à la ligne - new line |
endl | Passage à la ligne - new line |
\t | Tabulation |
\b | Retrait - backspace |
\" | Guillemets - double quote |
\’ | Apostrophe - single quote |
~? | Point d’interrogation - question mark |
\ | Backslash |
Tout ces caractères spéciaux sont à mettre entre parenthèses excepté endl.
Par exemple, les commandes
cout << "\n";
et
cout << endl;
entraà®neront un passage à la ligne.
Après avoir défini des variables, nous allons voir à présent comment
les initialiser. Pour assigner une valeur à une variable, on utilise
l’opérateur =
int number;
number=2;
On peur créer une variable et l’assigner en màªme temps :
int number=2;
On peut initialiser et définir plusieurs variables en màªme temps :
int day=3,month,year=2012;
On crée ici trois variables de type int et deux d’entre elles ont été assignées
en l’occurrence day et year.
On peut également initialiser une variable en utilisant l’opérateur parenthèse ()
comme suit :
int number(2);
Il peut s’avérer parfois pénible de réécrire à chaque création de variable un type tel
que unsigned long int. Le C++ permet de contourner ce problème en créant un alias
ou un synonyme si vous préférez. Pour créer un alias on utilise le mot clé
typedef comme suit
typedef type alias;
Voici un exemple :
typedef unsigned long int ULI;
La déclaration d’un alias (typedef) doit se faire avant la déclaration du main
(programme principal) ou juste après les directives d’inclusion si vous préférez !
Voici un exemple :
#include <iostream>
using namespace std;
typedef unsigned long int ULI;
main()
{
ULI n=128;
n=2*n;
cout << n;
}
Pour définir une constante, on utilise le mot clé const suivi de son type, de son identificateur
et d’une initialisation. Comme son nom l’indique, une constante n’est pas variable, une fois définie on ne peut plus
la modifier.
const int k=7;
la commande
k=99;
entraà®nera une erreur lors de la compilation de type
error: assignment of read-only variable «k"
Une autre manière obsolète de définir une constante est d’utiliser l’instruction pré-processing
#define
On l’utilise avant le main comme suit :
#define k 7;
#define identificateur valeur;
On ne définit pas de type ici, cette instruction signifie que k sera constamment remplacé par le caractère 7 dans le programme,
autrement dit
int p=k+1;
cout<<p;
affichera 8. On parle alors de constantes symboliques.
On peut créer en C++ une énumération constante, en natif les éléments d’une énumération
sont des entiers. Pour définir une énumération, on procède comme suit :
enum COLOR {RED,GREEEN,BLUE};
Ici COLOR est un type énuméré. Les constantes RED, GREEN, et BLUE
sont des constantes symboliques dont les valeurs sont respectivement 0,1 et 2.
Si l’on veut définir des constantes différentes, on procède comme suit :
enum COLOR {RED=1,GREEEN=234,BLUE=999};
Si une constante n’a pas été assignéé, alors celle ci est égale à celle qui la précède
auquelle on ajoute 1. Ainsi
enum COLOR {RED=1,GREEEN=234,WHITE,BLUE=999};
dans cet exemple WHITE vaut 235.
Ce qu’il faut retenir
– le langage C++ est un langage de programmation objets (POO), nous verrons par la suite comment définir de tels
objets
– le C++ est un langage typé : attentions aux types que vous utilisez (sont ils les bons ? Notamment en terme de limites ...)
– un programme de base débute par des directives d’inclusion
– on peut définir des alias à l’aide de typedef
– = et () permettent d’affecter une valeur à une variable
– une instruction se termine par ;
– il existe des constantes numériques et symboliques en C++
– la compilation sous Linux se fait à l’aide de g++
– a chaque code source compilé est associé un exécutable qui par défaut est a.out
Nous verrons très prochainement les opérateurs et structures de contrà´le du C++.