Sim201 7 C++11
Sim201 7 C++11
Sim201 7 C++11
C++ 2011
E. Lunéville
2022
Introduction
C++98 : fondements du C++ mais
avec des défauts, certains palliés par le compilateur
avec des manques, certains palliés par d'autres librairies (e.g. boost)
et un manque de modernité que proposent d'autres langages !
SIM201– Chapitre 7 2
attribut constexpr
Le C++11 introduit l'attribut constexpr plus fort que const :
il indique que la variable peut être évaluée à la compilation. S'applique à des variables
de type litteral qui doivent être initialisées :
Une fonction peut être déclarée constexpr. Elle sera évaluée à la compilation si c'est
possible, sinon elle sera évaluée à l'exécution. C'est une fonction inline :
evalué à la compilation
type de k : i
type de y : d impression console
type de fp : PFiiE pointeur de fonction int -> int
autre exemple :
auto est une commodité qui permet d'alléger le code (déclaration d'itérateurs en
particulier) mais attention il ne permet pas de s'affranchir de la connaissance
du type réel. Ne pas en abuser !
le C++11 introduit le mot clé decltype pour "récupérer" le type d'une variable
ou d'une expression, permettant ainsi de déclarer une variable du même type
qu'une autre :
La classe std::initializer_list<T>
ne propose que les fonctions
size, begin, end
liste explicite
vecteur de float
noter l'initialisation de la map names utilisant une liste d'initialisation constituée de listes
d'initialisation
SIM201– Chapitre 7 8
Fonctions avec trailing type
Le C++11 introduit la possibilité de préciser le type de l'argument de retour après
la déclaration de la fonction (trailing type) en conjonction avec l'attribut auto
Son intérêt réside dans le cas où le type de l'argument de retour peut dépendre du type
des arguments d'entrées :
SIM201– Chapitre 7 9
Du côté des classes
Le C++11 introduit quelques nouveautés pour la gestion classes
Initialisation des données membre non statiques
non surchageable
un constructeur quelconque
restauration des fonctions par défaut
Les attributs delete et default peuvent être utilisés sur toutes les fonctions susceptibles
d'être automatiquement créées, par exemple des fonctions de conversion.
SIM201– Chapitre 7 12
Du côté des classes
Opérateur de conversion explicite
En C++98, les opérations de conversion peuvent être réalisées soit à l'aide de
constructeurs implicites ( appelés automatiquement par le compilateur) ou
explicites (appelés par l'utilisateur) ou d'opérateurs de conversion toujours
implicites
SIM201– Chapitre 7 13
Du côté des template
les double chevrons
l'espace entre le chevrons <> dans le cas de classes template emboitées n'est plus obligatoire
interdit en C++98
ip est un int*
En C++11, on peut utiliser using à la place de typedef
alias sur un pointeur de fonction int -> void
SIM201– Chapitre 7 14
Lambda fonction
Une lambda fonction est une fonction anonyme de syntaxe générale :
aucun argument
SIM201– Chapitre 7 15
Lambda fonction
Stocker une lambda fonction et la réutiliser :
• Les lambda fonctions sont destinées à être utilisées localement contrairement aux
fonctions usuelles à portée globale.
• Plus rapides car elles sont par principe inline
• L'intérêt des lambda fonctions est leur capacité à capturer par référence ou valeur des
objets de la portée englobante (paramètres).
• Concept moderne issu de la programmation fonctionnelle et répandu dans les langages
plus récents (python, C#, java, ...)
SIM201– Chapitre 7 16
Référence sur des right values
left value : expression assignable (adresse mémoire accessible)
souvent une variable stockée en mémoire
une variable const est une left value non modifiable
right value : expression non assignable (adresse mémoire non accessible)
en général un résultat temporaire souvent stocké dans les registres
classification plus fine en C++11 (sous catégories prvalue, xvalue, glvalue) voir
https://en.cppreference.com/w/cpp/language/value_category
SIM201– Chapitre 7 17
Référence sur des right values
Sémantique de déplacement (move) :
consiste à proposer un moyen de déplacer des objets sans les copier
si le contexte le permet, en particulier dans le cas d'objets temporaires!
Le C++98 ne le permet pas : objet temporaire recopié puis détruit !
Le C++11 introduit la notion de référence sur une right value (entité temporaire
qui va être détruite) avec la notation &&. En définissant un constructeur
agissant sur de telles références, on peut déplacer les objets temporaires
sans les copier :
Dans certaine situation, les objets sont de type lvalue mais ont un caractère temporaire.
La fonction de la STL std::move permet de les réinterpréter comme des rvalue :
SIM201– Chapitre 7 19
Extensions de la STL
Nombreuses extensions dans la STL (voir documentation en ligne). Ici, seulement un aperçu
des principales nouvelles classes :
Classe thread, entête <thread>, importée de la librairie Boost
exemple
vérification de conformité
exemple
Table de hachage (unordered), collection avec indexation numérique des clés (hash)
• classes unordered_set, unordered_multiset, entête <unordered_set>
• classes unordered_map, unordered_multimap, entête <unordered_map>
• fonction de hachage par défaut, peut être modifiée
• proposent la même chose que les classes set, map, multiset, multimap
• map : insertion, recherche, supression en O(log(n)); parcours ordonné selon les clés
• unordered_map : insertion, recherche, supression en O(1) en moyenne, en O(n) au
pire; parcours non ordonné
SIM201– Chapitre 7 23