Résumé
Dans un langage de programmation, une fermeture ou clôture () est une fonction accompagnée de son environnement lexical. L'environnement lexical d'une fonction est l'ensemble des variables non locales qu'elle a capturées, soit par valeur (c'est-à-dire par copie des valeurs des variables), soit par référence (c'est-à-dire par copie des adresses mémoires des variables). Une fermeture est donc créée, entre autres, lorsqu'une fonction est définie dans le corps d'une autre fonction et utilise des paramètres ou des variables locales de cette dernière. Une fermeture peut être passée en argument d'une fonction dans l'environnement où elle a été créée (passée vers le bas) ou renvoyée comme valeur de retour (passée vers le haut). Dans ce cas, le problème posé alors par la fermeture est qu'elle fait référence à des données qui auraient typiquement été allouées sur la pile d'exécution et libérées à la sortie de l'environnement. Hors optimisations par le compilateur, le problème est généralement résolu par une allocation sur le tas de l'environnement. La fonction interne ajoute10 a toujours accès à l'argument nombre, bien que l'appel à la fonction ajouteur soit terminé. En ActionScript : var ajouteur = function(nombre) { function ajoute(valeur) { return nombre + valeur; } return ajoute; } var ajoute10 = ajouteur(10); ajoute10(1); Depuis C++11 : int main() { auto ajouteur = [](int i) { return ([=](int j) -> int { return i + j; }); }; auto ajoute_10 = ajouteur(10); ajoute_10(1); // renvoie 10+1 ce qui fait 11 return 0; } Avant C++11, le concept de clôture pouvait être implémenté avec des structures : #include struct Ajouteur { int n; Ajouteur(int val): n(val) {} int operator ()(int rhs) { return n + rhs; } }; // version utilisant les templates, en supposant que le paramètre 'val' est connu à la compilation // si ce n'est pas le cas, les templates sont inutiles et l'autre version est la seule possible template struct AjouteurT { int operator ()(int rhs) { return n + rhs; } }; int main(void) { Ajouteur ajoute10(10); std::cout < ajoute10(2) < std::endl; // si les optimisations sont désactivées, calcule 12 en additionnant deux variables AjouteurT
À propos de ce résultat
Cette page est générée automatiquement et peut contenir des informations qui ne sont pas correctes, complètes, à jour ou pertinentes par rapport à votre recherche. Il en va de même pour toutes les autres pages de ce site. Veillez à vérifier les informations auprès des sources officielles de l'EPFL.