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.

Historique

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++ .

Premier code en 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 <html>{}</html> 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.

Compilation d’un programme C++

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

Définition de variables

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é.

Les types entiers: int, short, long, unsigned

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.

Les types réels et décimaux: float, double et long double

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.410^-38 à  3.410^38
double Flottant double 8 -1.710^-308 à  1.710^308
long double Flottant double long 10 -3.410^-4932 à  3.410^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.

Le type booléen: bool

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

Le type caractère: char

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.

Initialisation de variables en C++: = et ()

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);

Créer des alias de type en C++: typedef

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;
}

Définition de constantes: const

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"

Définition de constantes: #define

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.

Un type énuméré constant: enum

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.

Conclusion

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++.