Intro :
Des changements ont été ajoutés dans la nouvelle version du C++ (nommée C++11).
Tous les mots-clés en liaison avec les changements sont représentés dans l’image de l’en-tête.
Explications :
Le mot-clé / constante nullptr :
– Il remplace l’ancien « #define NULL 0 » pour définir un pointeur nul.
Le mot-clé auto :
– Il identifie automatiquement le type de la variable correspondante en fonction de l’affectation décrite. Il permet de simplifier l’écriture du code.
Exemple :
|
1 2 3 4 |
for(auto i = nombres.begin() ; i != nombres.end() ; ++i) {     std::cout << (*i) << std::endl; } |
decltype :
– Permet de retrouver le type de l’objet lorsque l’on a utilisé le mot-clé auto.
Variadic templates :
– Permet d’utiliser un nombre variable de spécifications de classe sur les templates.
unique_ptr<> :
– Un pointeur intelligent possédant qu’un seul (et unique) propriétaire !
Initialisation des données membres non-statique :
– Les variables membres non-statiques peuvent être définit au sein même de la déclaration de la classe.
|
1 2 3 4 5 6 7 8 9 10 11 |
class UneClasse { public: UneClasse() {} int a = 7; int b = 5; private: std::string s{"Une chaîne"}; }; |
Alias de templates :
– On peut désormais utiliser le mot-clé « using » pour faire un alias à la place du classique typedef
Constructeurs délégués :
– Avec le C++11, un constructeur peut appeler un autre constructeur directement.
|
1 2 3 4 5 |
struct A { A(int); A(): A(42) { } // délègue au constructeur A(int) }; |
Range-based for :
– On peut parcourir un tableau, une liste, un vector, etc… avec une boucle simplifiée :
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
std::vector<double> v; for (double d : v) { std::cout << d << std::endl; } for (auto d : v) { std::cout << d << std::endl; } for (auto& d : v) { ++d; } for (auto const& d : v) { ++d; } std::map<int, std::string> m; for (auto element : m) { printf("%d\n", element.first); printf("%s\n", element.second); } |
Les fonctions lambda :
– La syntaxe est : [ liste de capture ] ( paramètres ) retour { code }
Exemple :
|
1 2 3 |
[](int element) { cout << element << endl; } |
On peut passer une fonction anonyme à une variable :
|
1 2 3 |
std::function<int (int, int)> addition = [](int x, int y) -> int { return x + y; }; |
Les énumérations fortement typées :
Dorénavant les numérations peuvent être fortement typées ainsi :
|
1 2 3 4 5 6 7 8 |
// On rajoute le mot-clé "class" enum class Direction { Haut, Droite, Bas, Gauche }; // Se comporte comme des attributs ! // On est obligé de spécifier la classe d'origine "Direction::" Direction direction = Direction::Haut; // Pour afficher sa valeur entière on doit convertir : std::cout << static_cast<int>(direction) << std::endl; |
Bug template corrigé :
|
1 2 3 4 5 |
// Avant : std::vector<std::vector<int> > nombres; // Après : std::vector<std::vector<int>> nombres; |
Les listes d’initialisateurs :
|
1 2 |
std::vector<int> nombres = { 1, 2, 3, 4, 5 }; std::map<int, std::string> nombres = { { 1, "un" }, { 2, "deux" }, { 3, "trois" } }; |
Les tableaux à taille fixe :
|
1 |
std::array<int, 5> tableauFixe; |
Tuple :
Mémoire locale pour un thread :
– Avec le mot-clé std::thread_local, on peut spécifier une variable locale à un thread !
Sizeof sur les attributs de classes :
– On peut désormais savoir la taille qu’occupe un attribut d’une classe.
Références :
– http://cpp.developpez.com/redaction/data/pages/users/gbdivers/cpp11/
– http://fr.wikipedia.org/wiki/C%2B%2B11
– http://openclassrooms.com/courses/introduction-a-c-2011-c-0x


