Spécificités du C++ (indépendantes de la POO)
Librairies standards & Déclaration de variables
- Les librairies du C ont été optimisées aux besoins du C++
Inclusion en C
// Inclusion en C #include <math.h> #include <time.h>
Inclusion en C++
// Inclusion en C++ #include <cmath> #include <ctime>
:BEAMER_ENV: ignoreheading
- Possibilité de déclarer les variables locales quel que soit l’endroit
for (unsigned int i = 0 ; i < 10 ; i++) {...}
Arguments par défaut de fonctions
C++ autorise l’utilisation de valeurs par défaut dans les prototypes de fonction
// Prototype de fonction void initialize(const double abs, const double ord = 0.0); int main() { initialize(1.0); } void initialize(const double abs, const double ord) { ... }
- En l’absence de second argument, le compilateur assigne la valeur 0.0 à la
variable
ord
- Les arguments concernés doivent obligatoirement être les derniers dans la liste.
Surdéfinition (surcharge) de fonctions
En C++ deux fonctions peuvent porter le même nom dès lors qu’elles n’ont pas les mêmes types d’argument
void dummy(int i, double a, char c); void dummy(int i, int a, char c); void dummy(int i);
Le compilateur se charge d’appeler la “bonne” fonction par rapport au contexte i.e. au vu de la liste d’arguments donnée lors de l’appel.
int main() { dummy(1, 1.0, 'a'); dummy(1, 1, 'a'); dummy(1); }
Fonction inline
Les fonctions en ligne remplacent (avantageusement) les macros utilisées en C tout en conservant un temps d’exécution plus court
On remplacera ainsi la déclaration en C
// Macro en C #define CARRE(x) ((x) * (x))
par
// Fonction en ligne en C++ inline double carre(const double x) { return x*x; }
Le type bool
Ce nouveau type est naturellement formé de deux valeurs notées true
et false
bool is_ok = true; if (is_ok) { ... } bool is_java_idiom = false; bool is_c_idiom = is_ok && !is_java_idiom;
Les espaces de noms
Les espaces de noms sont des zones de déclaration qui permettent de délimiter la recherche des noms des identificateurs par le compilateur.
#include <iostream> using namespace std; ... cout << "Standard output" << endl; ...
Leur but est principalement d’éviter les conflits de noms entre plusieurs parties d’un projet.
Les espaces de noms
namespace utl { void dump() { cout << "utl::dump" << endl; } } namespace io { void dump() { cout << "io::dump" << endl; } }
// Utilisation de l'espace de nom io using namespace io; int main() { // Par défaut, io::dump() dump(); // Précision de l'espace de nom utl::dump(); io::dump(); }