Les fonctions

En Java, toutes les méthodes sont liées à une classe. En C++ (de même qu’en C), les méthodes peuvent exister indépendamment de toute classe. Notez qu’en C nous parlerons plutôt de fonctions ou de procédures1 à la place de méthodes; les méthodes sont liées aux classes de C++.

int Max(int x, int y) {
    return x > y ? y : x;
}

En Java les arguments de types simples (int, float, …) sont toujours passés par valeur (copie) et les arguments de type string, les tableaux et les objets sont toujours passés par référence. En C++ les tableaux sont passés par référence, mais pour les autres types on a le choix. Par défaut, les arguments sont passés par valeur, mais on peut les passer par référence si on ajoute un & à la fin du type. Par exemple :

void Swap(int& a, int& b) {
    int temp = a;
    a = b;
    b = temp;
}

Lorsque nous appelons Swap(x,y), nous passons des références vers x et y et la procédure Swap peut modifier les valeurs de x et de y. Notez que si vous appelez avec des constantes (Swap(1,2)), la compilation ne sera pas possible et le compilateur indiquera une erreur.

On peut aussi choisir de passer des arguments par référence pour des questions de performance sans forcément vouloir laisser la fonction modifier le contenu de l’argument. On peut le faire en C++ en ajoutant le préfixe const :

void Find(const BigObject& o, int x) {
    ...
}

Tout comme Java, le C++ permet de surcharger des fonctions du moment que les arguments sont de types différents :

int Max(int a, int b) {
    return a > b ? a : b;
}

float Max(float a, float b) {
    return a > b ? a : b;
}

La surcharge de fonction n’est pas possible en C.

Une autre caractéristique de C++ qui n’est pas possible en C ou en Java est et de permettre des valeurs par défaut pour les arguments :

void Sort(Array& array, bool descending=false) {
    ...
}

On peut appeler cette méthode avec un ou deux arguments :

Sort(myArray);        // descending = false (default)
Sort(myArray, false); // OK, but redundant
Sort(myArray, true);  // descending = true

Cette construction permet bien souvent de s’épargner la surcharge de fonction et elle simplifie aussi le code.


  1. La différence entre une fonction et une procédure c’est qu’une fonction retourne une valeur alors qu’une procédure ne retourne rien (void).