Les Types
bool: true ou falsechar: caractère (1 octet)int: entierdouble: nombre à virgulestring: chaîne de caractères. Nécessite la directire #include
Déclaration et initialisation d’une variable
type nomVariable (valeurInit);
type nomVariable = valeurInit;
Déclaration d’une constante:
type const nomConstante = valeurInit;
const type nomConstante = valeurInit;
Références
Une référence consiste à définir un nom supplémentaire qui désigne une variable déjà existante.
int variable1(12);
int& variable2(variable1);
La variable2 référence la variable1. Accéder à variable2 revient strictement au même qu’accéder à variable1.
- la déclaration d’un référence se fait pas l’ajout du symbole
&après le type. - la référence doit avoir le même type que la variable référencée.
Pointeurs
&var: adresse de la variabletype* ptr_var: pointeur sur une variable de type type*ptr: valeur de la variable pointée
ptr = new type; // Allocation de mémoire
delete ptr; // Libération de la mémoire. Il est d'usage d'affecter 0 au pointeur après l'instruction 'delete' pour bien indiquer que le pointeur ne pointe plus sur rien.
On peut également définir un pointeur sur un objet
ptr = new NomClasse(); // Constructeur par défaut
ptr = new NomClasse(attributs); // Constructeur surchargé
On accède ensuite aux attributs et aux méthodes avec l’opérateur flèche
ptr->attribut1;
ptr->methode(arguments);
A l’intérieur d’un objet, on accès à l’objet lui-même avec le pointeur this
Fonctions
Passage d’arguments
Passage par valeur
void fonction(type var)
Utilisation classique identique au C
Passage par référence
void fonction(type& var)
La variable crée à l’intérieur de la fonction est une référence à la variable de l’appel de la fonction. Toute modification effectuée à l’intérieur de la fonction porte sur la variable passée en paramètre.
Passage par référence constante
void fonction(type const& var)
Idem passage par référence mais la variable n’est pas modifiable à l’intérieur de la fonction. Intérêt: évite la duplication de la mémoire et donc gain de temps d’exécution.
Arguments facultatifs
Pour rendre un paramètre facultatif, il faut lui définir une valeur par défaut dans le prototype.
void fonction(type1 param1, type2 param2 = val);
Lors de l’appel, on pourra alors omettre le 2ème paramètre.
fonction(val1);
- la définition des valeurs par défaut se fait uniquement dans le prototype. Et non dans la définition de la fonction.
- les paramètres obligatoires à gauche, les paramètres facultatifs à droite.
- on ne peut pas omettre un premier paramètre facultatif puis renseigner le suivant. La lecture des paramètres se fait de gauche à droite.
- on peut déclarer tous les paramètres comme facultatifs.
Retour par référence
Une fonction peut retourner une référence
type& fonction(arguments)
- La fonction peut être membre gauche d’une affectation
fonction() = valeur;
Fonctions lambda
- Une lambda est une fonction anonyme. Utile pour mettre un peu de code (dans une boucle, un itérateur, une callback) sans avoir besoin de créer une fonction dédiée accessible par tous.
- Syntaxe de base: le code renvoie un pointeur sur une fonction pour être utilisé.
[]capture()paramètres{}code
[](){ ... }
- Syntaxe avec valeur de retour
[]() -> T { ... } // T: type de la valeur de retour
- La partie code est du code C++ classique
- Les paramètres, sont des paramètres d’appel de la fonction lambda
auto square = [](int a){ return a*a; };
- La zone de capture permet de définir comment la lambda capture les éléments externes
- Une lambda a accès à tous les objets accessibles dans la portée où la lambda est déclarée
- Ces éléments peuvent être accédés soit par copie (symbole =)
- soit par référence (symbole &)
// La lambda accède à toutes les variables par copie
[=](){ ... }:
// La lambda accès à toutes les var par référence
[&](){ ... };
// La lambda spécifie explicitement comment accéder aux variables
[foo, &bar](){ ... }; // foo par copie et bar par référence
// La lambda spécifie un mode général et des exceptions
[=,&foo](){ ... }; // accès par copie, sauf pour foo par ref
[&,bar](){ ... }; // accès par ref, sauf pour bar par copie
Tableaux
Tableaux statiques
Identique au langage C
int tableau[taille];
Tableaux dynamiques
Déclaration
Nécessite l’utilisation de la library <vector>
#include <vector>
vector<''type''> nomTableau(taille); // Déclaration du tableau mais non initialisé
vector<''type''> nomTableau(taille, valInit); // Toutes les cellules du tableau sont initialisées à ''valInit''
Gestion de la taille
- Ajouter une valeur:
nomTableau.push_back(valeur); - Supprimer une valeur:
nomTableau.pop_back(); - Récupérer la taille:
nomTableau.size();
Tableaux dynamiques & fonctions
void fonction(vector<type> nomParam);
- peut s’utiliser avec le passage par référence
- peut s’utiliser avec le passage par référence constante
Tableaux multidimensionnels
Statique:
type nomTableau[dim1][dim2]...;
Dynamique:
vector< vector<int> > nomTableau;
IO Stream
Affichage
#include <iostream>
cout << "Mon texte";
cout << "Mon texte suivi d'un retour à la ligne" << endl;
cout << maVariable;
cout << "la variable vaut: " << maVariable << endl;
Saisie
#include <iostream>
cin >> maVariable;
Cette fonction récupère la saisie utilisateur mais s’arrête dès qu’elle rencontre un retour à la ligne ou un espace. Embêtant pour les strings.
#include <iostream>
getline(cin , maVariable);
- Si utilisation simultanée de
cin >>et degetline(cin puis getline), il faut impérativement utilisercin.ignore();après les chevrons.
cin >> variable1;
cin.ignore();
...
getline(cin, variable2);
Libraries
Fonctions mathématiques
#include <cmath>
| Fonction | Description |
|---|---|
| sqrt(x) | racine carée |
| sin(x) | sinus (en radians) |
| cos(x) | cosinus |
| tan(x) | tangente |
| exp(x) | exponentielle |
| log(x) | logarithme népérien |
| log10(x) | logarithme décimal |
| fabs(x) | valeur absolue |
| floor(x) | arrondi vers le bas |
| ceil(x) | arrondi vers le haut |
| pow(a,b) | a puissance b |
#include <cstdlib>
#include <ctime>
| Fonction | Description |
|---|---|
| srand(time(0)) | Nécessaire pour initialiser le générateur aléatoire |
| rand() | Génération d’un nombre aléatoire |
| rand() % x | Génération d’un nombre aléatoire entre 0 et x-1 |
Strings
#include <string>
Une string se comporte comme un tableau dynamique.
nomString.push_back(lettre);
nomString.erase(position, nbre); // efface 'nbre' caractères à partir de la 'position'
nomString.size();
Pour concaténer 2 chaines:
chaine1 += chaine2;
| Instruction | Description |
|---|---|
string obj; |
Déclaration d’un objet obj appartenant à la classe string |
string obj("chaine"); |
Déclaration et initialisation d’un objet de type string |
string obj = "chaine"; |
Déclaration et initialisation d’un objet de type string |
obj.size() |
Renvoie la taille de la chaine |
obj.erase() |
Efface entièrement la chaine |
obj.substr(debut [, longueur]); |
Renvoie un extrait de la chaine: longueur caractères à partir de debut. Si longueur est omis, renvoie tous les caractères jusqu’à la fin de la chaine. |
obj.c_str() |
Renvoie un pointeur sur le tableau qui contient la chaine de caractères. Utilisé avec les ofstream et ifstream |
Fichiers
#include <fstream>
| Instruction | Description |
|---|---|
ofstream nomFlux("fichier"); |
Crée et ouvre le fichier en écriture. Le crée si inexistant. fichier peut être un chemin absolu ou relatif |
ofstream nomFlux("fichier", ios::app); |
Ouvre le fichier et écrit à la suite de ce qui existe déjà |
ofstream nomFlux(stringNomFichier.c_str()); |
Si utilisation d’une variable pour stocker le nom du fichier, il faut utiliser la méthode c_str() |
ifstream nomFlux("fichier"); |
Ouvre le fichier en lecture. |
if (nomFlux) |
renvoie TRUE si l’ouverture du fichier s’est bien passée. |
nomFlux.open("fichier"); |
ouvre explicitement le fichier si cela n’a pas été fait lors de la déclaration de la variable |
nomFlux << "chaine de caractères" << variable; |
écriture d’une chaine de caractères ou d’une variable dans le fichier |
getline(nomFlux, nomString); |
Lit une ligne entière du fichier pointé par le flux et la stocke dans la string ‘‘nomString’’. Renvoie TRUE si effectué avec succès. Renvoie FALSE si erreur ou si fin de fichier. |
nomFlux >> nomVar; |
Lit un mot et le stocke dans la variable. Un cast est effectué selon le type de la variable de destination |
nomFlux.get(caractere); |
Lit le fichier caractère par caractère. |
nomFlux.close(); |
Ferme explicitement de le fichier. Note: le fichier est automatiquement fermer lors de la destruction de la variable flux. |
nomFlux.tellp(); |
retourne la position actuelle du curseur. Valable uniquement pour les ofstream |
nomFlux.tellg(); |
retourne la position actuelle du curseur. Valable uniquement pour les ifstream |
nomFlux.seekp(nbCar, posRef); |
Déplace le curseur nbCar par rapport à posRef. Valable uniquement pour les ofstream. posRef peut valoir: ios::beg=début du fichier / ios::end=fin du fichier / ios::cur=position courante |
nomFlux.seekg(nbCar, posRef); |
Déplace le curseur nbCar par rapport à posRef. Valable uniquement pour les ifstream. |
| taille du fichier | Il faut se placer à la fin du fichier en utilisant seek puis on récupère la position du curseur avec tell. |