Skip to content
Snippets Groups Projects
cours-digressions.md 5.41 KiB
jupytext:
  text_representation:
    extension: .md
    format_name: myst
    format_version: 0.13
kernelspec:
  display_name: C++17
  language: C++17
  name: xcpp17
rise:
  auto_select: first
  autolaunch: false
  centered: false
  controls: false
  enable_chalkboard: true
  height: 100%
  margin: 0
  maxScale: 1
  minScale: 1
  scroll: true
  slideNumber: true
  start_slideshow_at: selected
  transition: none
  width: 90%

+++ {"slideshow": {"slide_type": "slide"}}

Digressions : surcharge, templates, espaces de noms, ...

Nous allons maintenant faire quelques digressions, pour pointer vers des fonctionnalités de C++ que nous avons utilisées sans explications jusqu'ici, et dont l'usage est naturel et potentiellement utile dès maintenant.

+++ {"slideshow": {"slide_type": "slide"}, "tags": []}

Surcharge de fonctions ♣️

+++ {"slideshow": {"slide_type": "fragment"}}

Exemple : la fonction monMax

+++ {"slideshow": {"slide_type": "skip"}, "tags": []}

Nous avons vu maintes fois la fonction max sur les entiers :

---
slideshow:
  slide_type: fragment
tags: []
---
int monMax(int a, int b) {
    if ( a < b )
        return b;
    else
        return a;
}

monMax(1,3)

+++ {"slideshow": {"slide_type": "skip"}, "tags": []}

On remarquera que le code est générique : on peut par exemple calculer de même le maximum de deux nombres réels :

---
slideshow:
  slide_type: fragment
tags: []
---
double monMax(double a, double b) {
    if ( a < b)
        return b;
    else
        return a;
}

monMax(1.0, 3.5)

+++ {"slideshow": {"slide_type": "skip"}, "tags": []}

ou même de deux chaînes de caractères :

---
slideshow:
  slide_type: fragment
tags: []
---
using namespace std;
:tags: []

string monMax(string a, string b) {
    if ( a < b)
        return b;
    else
        return a;
}

monMax("toto", "alfred")

+++ {"slideshow": {"slide_type": "fragment"}}

:::{hint} Observation Nous avons utilisé chaque fois le même nom de fonction et C++ a appelé automatiquement la bonne version. :::

+++ {"slideshow": {"slide_type": "fragment"}}

:::{hint} Remarque Il serait de même possible d'utiliser le même nom de fonction pour le max à trois arguments (et plus!) : :::

:tags: []

int monMax(int a, int b, int c) {
    return monMax(monMax(a, b), c);
}

monMax(2,4,3)

+++ {"slideshow": {"slide_type": "fragment"}, "tags": []}

:::{attention} Attention aux ambiguïtés
:::

:tags: []

monMax(3, 4.5)

+++ {"slideshow": {"slide_type": "slide"}, "tags": []}

:::{prf:definition} Surcharge de fonction

  • En C++, on peut avoir plusieurs fonctions avec le même nom et des signatures différentes
  • Idem en Java, mais pas en C ou en Python par exemple! :::

+++ {"slideshow": {"slide_type": "fragment"}, "tags": []}

:::{hint} Bonne pratique Il est recommandé que toutes les fonctions ayant le même nom aient la même sémantique :::

+++ {"slideshow": {"slide_type": "slide"}, "tags": []}

Digression : templates ♣️

:::{warning} Problème L'exemple précédent n'est pas satisfaisant : on a dû implanter la fonction monMax pour chaque type sur lequel on peut faire une comparaison, en dupliquant le même code. :::

+++ {"slideshow": {"slide_type": "fragment"}, "tags": []}

:::{hint} Solution Les templates pour écrire du code générique :::

+++ {"slideshow": {"slide_type": "fragment"}, "tags": []}

La fonction monMax suivante est valide pour tout type sur lequel on peut faire des comparaisons :

---
slideshow:
  slide_type: fragment
---
template<class T>
T monMax(T a,T b) {
    if ( a < b )
        return b;
    else
        return a;
}
---
slideshow:
  slide_type: fragment
---
monMax(1,3)