Compilation & Directives de préprocesseur Pointeurs, Références & Allocation Dynamique de Mémoire Spécificités du C++ (indépendantes de la POO) Structures & Classes Encapsulation des données Constructeur & Destructeur de classe Copie d'objets Amitié & Surcharge d'opérateur Héritage (Partie 1) Héritage (Partie 2) Patrons de fonctions et de classes Introduction à la librairie standard
Retour menu principal

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();
}