Le langage C++ introduit le qualificateur const qui indique qu'une donnée ne sera pas modifiée. Situé au niveau d'un sous-programme const indique qu'aucune donnée ne sera modifiée à l'intérieur du sous-programme. le qualificateur const peut également servir à :
En ce qui concerne les pointeurs constants, on peut les déclarer de plusieurs manières :
Le mot clé enum permet de déclarer des énumérations ou un nouveau type (entier) associé à une liste de valeurs.
C++11 introduit les enum class que l'on qualifie d'énumération à portée (scoped) pour lesquelles il est nécessaire de spécifier le nom qui définit l'énumération :
un_jour = 2
mardi = 2
Fevrier = 2
Par défaut, les énumérations à portée sont de type int mais on peut modifier leur comportement :
enum Class Status: std::uint32_t;
enum Class Jour: std::uint8_t;
Pour des projets de grande envergure, des conflits de noms apparaissent pour certains noms de classes ou de variables. C'est par exemple le cas si on tente d'utiliser différentes librairies de calcul ensemble comme BLAS, GSL et MKL. Si on utilise le produit de matrices, le sous-programme cblas_dgemm existe sous BLAS et MKL. De même, les constantes comme CblasNoTrans est redéfnie dans chaque librairie.
Le C++ offre un moyen de remédier à ce problème en limitant la portée des symboles à une zone appelée espace de nommage ou namespace, appliqué à l'exemple précédent on aurait :
namespace cblas {
enum CBLAS_TRANSPOSE {CblasNoTrans=111, CblasTrans=112, CblasConjTrans=113};
void cblas_dgemm(...);
}
namespace mkl {
typedef enum {CblasNoTrans=111, CblasTrans=112, CblasConjTrans=113} CBLAS_TRANSPOSE;
void cblas_dgemm(...);
}
namespace gsl {
typedef enum CBLAS_TRANSPOSE CBLAS_TRANSPOSE_t;
int gsl_blas_dgemm(...);
}
Pour accéder à une déclaration de l'espace de nommage on peut utiliser l'opérateur de résolution de portée :: ou alors utiliser l'instruction :
#include "mkl.h"
#include "cblas.h"
#include "gsl_cblas.h"
cblas::cblas_dgemm(cblas::CblasRowMajor, cblas::CblasNoTrans, ...);
mkl::cblas_dgemm(mkl::CblasRowMajor, mkl::CblasNoTrans, ...)
gsl::gsl_blas_dgemm(gsl::CblasRowMajor, gsl::CblasNoTrans, ...);
En particulier std est l'espace de nommage réservé à la STL (Standard Template Library).
Attention à ne pas utiliser un nom qui correspond à une fonction ou mot-clé du C. (ex: system)
Dans la partie header (.h) définir le namespace, puis dans la partie implementation (.cpp) l'utiliser :
La STL introduit des flux (stream) sur lesquels on peut réaliser des entrées/sorties. Par défaut on trouve les flux suivants :
On manipule ces flux comme en Java et non plus comme en C mais en utilisant des opérateurs spécifiques. Le symbole endl (enf of line) représente le caractère '\n'
// include the librairy for input/output
#include <iostream>
using namespace std;
int n;
cin >> n; // lecture d'un entier
cout << "la valeur de n est " << n << endl;
Des manipulateurs de flux sont définis qui permettent de formater l'affichage des données :
Utilisation de la fonction istream& getline(istream& is, string& str, char delim) pour lire des chaines de caractères.
Afin de remédier aux déficiences du langage C concernant le typage, de nouveaux opérateurs sont introduits :
// tranform integer into double
int i=1;
double d = static_cast<double>(i);
int f(int& n) {
return n+1;
}
int g(const int& n) {
return f(const_cast<int>>(n));
}
La possibilité est offerte en C++ de donner une valeur par défaut uniquement aux paramètres les plus à droite dans la définition d'un sous-programme :
void fonction(int n, int m = 1) {
cout << n << " " << m << endl;
}
f(1,5); // n = 1, m = 5
f(1); // equivalent to f(1,1) because m was not specified