1 Langage Dia

Télécharger au format pdf ou txt
Télécharger au format pdf ou txt
Vous êtes sur la page 1sur 37

Le langage C++

Numérique & Science Informatique

1
Le langage C++
Numérique & Science Informatique

“I think that object orientedness is almost as


much of a hoax as Artificial Intelligence.”

― Alexander Stepanov

2
Le langage C++
Numérique & Science Informatique

Le langage C avec des classes

 Objective-C, 1983, Brad Cox


Utilisé par NeXT, puis Apple

 C++, 1983, Bjarne Stroustrup


Développé aux Bell Labs

3
Le langage C++
Numérique & Science Informatique

Langage C++

 Créé au cours des années 1980 par Bjarne Stroustrup


 Langage très populaire chez les développeurs
 Multi paradigmes
 Memory-unsafe
 En constante évolution : dernière norme en 2020
 Utilisé dans de nombreux compilateurs & OS

4
Le langage C++
Numérique & Science Informatique

Avantages du langage C++

 Rapide et économe en ressources


 Libre de droits
 Norme (1ère release : ISO/CEI 14882:1998)
 Portable
 Compatible avec les bibliothèques C

5
Le langage C++
Numérique & Science Informatique

Le typage en C++
Les types built-in :
int : entier (short, long, long long)
float : réel (double)
char : l’octet
bool : booléen
auto : inférence de type

Les types construits :


string : chaîne de caractères
array<type, taille> : tableau de <taille> éléments de <type>
...

6
Le langage C++
Numérique & Science Informatique

Les espaces de nommage


zone de déclaration d'identificateurs
permettant au compilateur de résoudre les conflits de noms
namespace a
{
void function(void) {} // première fonction
}

namespace b
{
void function(void) {} // seconde fonction
}

a::function(); // appelle la première à l’aide l’opérateur de portée ::


b::function(); // appelle la seconde
7
Le langage C++
Numérique & Science Informatique

Exemple d’espaces de nommage


Définir un espace de nommage english avec 2 fonctions :
• Hello → affiche « Hello »
• Bye → affiche « Bye bye »
Définir un espace de nommage french avec 1 fonction :
• Hello → affiche « Bonjour »
Appeler ces 3 fonctions dans le programme principal.

8
Le langage C++
Numérique & Science Informatique

L'instruction conditionnelle

if ( condition ) {
Traitement() ;
}
else {
Autre_Traitement() ;
}

Les instructions à exécuter sont indiquées par les accolades

9
Le langage C++
Numérique & Science Informatique

Implémentation en langage C++


Écrire un programme qui indique si une année est
bissextile ou non.
#include <iostream>
using namespace std; // espace de nommage pour cout & cin
int main(void)
{
unsigned short year;
cout << "Entrez une année : ";
cin >> year ;
if ( year % 400 == 0 || (year % 4 == 0 && year % 100 != 0) )
cout << "L’année " << year << " est bissextile" << endl ;
else
cout << year << " n’est pas une année bissextile" << endl ;
return 0 ;
}
10
Le langage C++
Numérique & Science Informatique

Itérations
C++ dispose de deux types de boucles :
 Boucle for
• de façon « classique »
• utilisation d’un itérateur sur des conteneurs
 Boucle while
while ( condition ) {
Traitement() ;
}

11
Le langage C++
Numérique & Science Informatique

Exemple de parcours de séquence


Écrire une fonction qui compte le nombre de voyelles
dans une phrase quelconque.

Créer :
• une fonction qui parcours une chaîne et compte les voyelles
• une fonction qui indique si une lettre est une voyelle

12
Le langage C++
Numérique & Science Informatique

Le parcours indexé d’une chaîne


unsigned int count(const string& s)
{
/** compte le nombre de voyelles dans une chaîne
@param s -- chaîne de recherche
@return le nombre de voyelles
*/
unsigned int total = 0;

// parcours à l’aide d’un indice


for (unsigned int i = 0; i < s.size(); i++)
if ( is_vowel(s[i]) )
total++;

return total;
}
13
Le langage C++
Numérique & Science Informatique

Le parcours avec itérateur


unsigned int count(const string& s)
{
/** compte le nombre de voyelles dans une chaîne
@param s -- chaîne de recherche
@return le nombre de voyelles
*/
unsigned int total = 0;

// parcours à l’aide d’un itérateur


for (string::iterator it = s.begin(); it!= s.end(); it++)
if ( is_vowel(*it) )
total++;

return total;
}
14
Le langage C++
Numérique & Science Informatique

Parcours par inférence


bool is_vowel(const char c)
{
/** indique si une lettre est une voyelle
@param c -- un caractère
@return true si c est une voyelle, false sinon
*/
const array<char, 6> vowel = {'a', 'e', 'i', 'o', 'u', 'y'};

//auto permet de déclarer une variable sans donner son type


for (const auto& it : vowel)
if ( c == it )
return true;

return false;
}
15
Le langage C++
Numérique & Science Informatique

Les itérateurs
Objets qui pointent sur un tableau ou un conteneur

Exemple :
array<int, 4> data = { 1, 2, 3, 4 };
// élève au carré chaque élément de data
for (array<int, 4>::iterator it = data.begin(); it != data.end(); it++)
{
*it *= *it ;
cout << *it << endl;
}

16
Le langage C++
Numérique & Science Informatique

Itérateurs par inférence


#include <iostream>
#include <array>
int main(void)
{
std::array<int, 4> data = { 1, 2, 3, 4 };
// élève au carré chaque élément de data
for (auto it = data.begin(); it != data.end(); it++)
std::cout << *it * *it << " ";
std::cout << std::endl;
return 0;
}
17
Le langage C++
Numérique & Science Informatique

Classes built-in
Le langage C++ possède des classes prédéfinies :

• Pour les E/S <iostream>


• Pour la manipulation de chaînes <string>
• Pour les tableaux (statiques) <array>
• Pour les tableaux (dynamiques) <vector>
• ...

18
Le langage C++
Numérique & Science Informatique

Classe string
•+ opérateur de concaténation
• size() envoie la longueur de la chaîne
• clear() efface la chaîne enregistrée
• find() recherche une sous chaîne s
• substr() extrait une sous chaîne à l’indice i de n caractères
• front(), back() renvoie le 1er / dernier caractère
• push_back() ajoute le caractère c en fin de chaîne
• at() donne le caractère à l’indice i
• erase() supprime à l’indice i, n caractères
• replace() remplace à l’indice i, n car à partir de la chaîne s
• begin(), end() retourne un itérateur
19
Le langage C++
Numérique & Science Informatique

Passage par référence


void swap(int& a, int& b)
{
int tmp = a;
a=b;
b = tmp ;
}

int main(void)
{
int a = 3, b = 82;
swap(a, b);
cout << a << " " << b << endl;

return 0 ;
}
20
Le langage C++
Numérique & Science Informatique

Les types génériques (template)


Type abstrait de donnée servant de modèle générique

Exemple :
fonction unique qui échange deux variables de type quelconque

template <typename T>


void swap(T& a, T& b)
{
T tmp = a;
a=b;
b = tmp ;
}

21
Le langage C++
Numérique & Science Informatique

La spécialisation
Modifie le comportement d’une fonction selon un type
Exemple : comparaison entre 2 variables
template <typename T>
T getMax(const T& a, const T& b)
{
return a > b ? a : b ;
}

template <>
string getMax(const string& a, const string& b)
{
// la comparaison se fait cette fois sur la longueur de la chaîne
return a.size() > b.size() ? a : b ;
}
22
Le langage C++
Numérique & Science Informatique

Pointeur
variable contenant l'adresse d'un espace mémoire

// lève l’exception bad_alloc en cas d’erreur


float* fptr = new float; // allocation espace mémoire

*fptr = 3.14; // affectation dans la mémoire


cout << *fptr << " @ " << fptr << endl;

delete fptr; // libération espace mémoire


fptr = nullptr; // ré initialisation pointeur

// ne lève pas d’exception mais renvoie nullptr


double* dptr = new(std::nothrow) double;
if ( dptr )
delete dptr;
23
Le langage C++
Numérique & Science Informatique

Smart Pointer
permet d’éviter l'existence de dangling pointers

#include <memory>
void UseSmartPointer(const float f)
{
unique_ptr<float> pf(new float);
*pf = f;

// ...
} // pf sera automatiquement indisponible ici (out of scope!)

24
Le langage C++
Numérique & Science Informatique

Notation []
La déclaration des tableaux en C a été conservée
pour assurer une compatibilité avec les bibliothèques C
et manipulation de format de fichier

Exemple :
vector<unsigned int> frequency(SIZE, 0);
ifstream ifs(input_file, ifstream::binary);
if ( ifs )
// read frequency
ifs.read(reinterpret_cast<char*>(&frequency[0]), SIZE * sizeof(int));

25
Le langage C++
Numérique & Science Informatique

Manipulation de fichiers
3 classes de flux pour manipuler les fichiers :
• fstream : lecture/écriture
• ifstream : lecture
• ofstream : écriture

4 méthodes de base :
 Ouvrir
 Écrire
 Lire
 Fermer

26
Le langage C++
Numérique & Science Informatique

Ouvrir un fichier
void open(const string& fileName, ios::openmode mode);

Modes d’ouverture :
 in : lecture
 out : écriture
 trunc : écriture et lecture (écrase)
 app : ajout
Exception :
 failbit : erreur ouverture

27
Le langage C++
Numérique & Science Informatique

Écrire dans un fichier


ostream& write(const char* data, streamsize size);

Paramètres :
 data : données à écrire
 size : nombre d’octets à écrire
Exceptions :
 failbit : erreur sur la dernière opération
 badbit : erreur d’écriture

NB : streamsize = int
28
Le langage C++
Numérique & Science Informatique

Écrire un tableau
// ouverture fichier par constructeur
ofstream ofs(output_file, ifstream::binary);
if ( !ofs )
cout << "Erreur ouverture" << endl;
else {
array<int, 5> frequency = { 0, 1, 2, 3, 4 };
ofs.write(
reinterpret_cast<char*>(&frequency[0]),
frequency.size() * sizeof(int)
);
}
// fermeture automatique par destructeur

29
Le langage C++
Numérique & Science Informatique

Lire un fichier
istream& read(char* buffer, streamsize size);
Paramètres :
 buffer : tampon pour données lues
 size : nombre d’octets à lire
Exceptions :
 failbit : erreur de lecture
 eofbit : fin de fichier

NB : streamsize = int
30
Le langage C++
Numérique & Science Informatique

Lire un fichier octet par octet


// ouverture fichier par constructeur
ifstream ifs(input_file, ifstream::binary);
if ( !ifs )
cout << "Erreur ouverture" << endl;
else {
char c;
while ( ifs.get(c) )
cout << c;
}
// fermeture automatique par destructeur

31
Le langage C++
Numérique & Science Informatique

Lecture « bufferisée »
ifstream ifs(input_file, ifstream::binary);
if ( !ifs )
cout << "Erreur ouverture" << endl;
else
do {
// lecture par blocs de 1024 octets
vector<unsigned char> buffer(1024);
ifs.read(reinterpret_cast<char*>(&buffer[0]), 1024);
// affiche les octets lus
cout << ifs.gcount() << endl;
} while ( !ifs.eof() ); // s’arrête sur la fin de fichier

32
Le langage C++
Numérique & Science Informatique

Fermer un fichier
void close(void);

Exception :
 failbit : le fichier n’a pas été ouvert

Appelé automatiquement à la destruction de l’objet


Il n’est pas nécessaire d’appeler explicitement cette méthode

33
Le langage C++
Numérique & Science Informatique

Exemple de fichier de log


Écrire un programme qui enregistre la date courante
dans un fichier texte
puis affiche le contenu à l’écran.
Prototypes :
• int file_put_contents(
const string& filename,
const string& data,
const bool append = false)
• string file_get_contents(
const string& filename,
const unsigned int length_to_read = 0)

34
Le langage C++
Numérique & Science Informatique

Fonction anonyme (lambda)


auto fname = [capture] (param) -> retval { body }

• fname : nom de la fonction lambda


• capture : variables extérieures capturées par copie (=) ou référence (&)
• param : liste des paramètres
• retval : type de la valeur de retour (obsolète depuis C++14)
• body : corps de la fonction
Exemple :
auto in_string = [&str](const char c) -> bool
{
for (const auto& it : str)
if ( it == c )
return true;
return false;
};
35
Le langage C++
Numérique & Science Informatique

Itérateurs & Fonction anonyme

Exemple :
vector<int> values = {1, 3, 4, 5, 6};

auto square = [](auto& v) { for (auto& it : v) it *= it; return v; };


for (const auto& it : square(values))
cout << it << endl;

36
Le langage C++
Numérique & Science Informatique

37

Vous aimerez peut-être aussi