C++11 introduit les fonctions lambda : qu'est-ce que c'est ? Comment (bien) les utiliser ? Voici le support d'une présentation donnée à l'occasion des rencontres C++ à Montpellier le 21 oct. 2014.
Les nouveautés de C++11 : Ecrire du C++ ModerneMicrosoft
Le langage C++ a toujours la réputation d’un langage complexe, demandant une rigueur de tous les instants et qui peut en rebuter plus d’un. Mais avec l’arrivée de la nouvelle norme C++11 et de son intégration dans Visual Studio 11 (et intégration partielle dans Visual Studio 2010), elle permet comme le souligne Herb Sutter, d’écrire désormais du code "Clean, Safe and Fast", nous passons à l'ère du C++ moderne.
Articulé autour de C++ 11, cette session amène celui qui y assiste aux fondamentaux du développement logiciel : libraries, dépendances, TR1 et C++0X les fondations de C++ 11, runtime C alias CRT, runtime C++ alias STL, agilité en C++, ALM en C++, Windows 8 et C++, C++ et Windows 8 avec le nouveau modèle COM nommé WRL.
Introduction à la programmation lock-free en C++11 au moyen des atomics. Présentation données par Cyril Comparon lors des rencontres C++ de Montpellier (novembre 2014).
Ce deuxième cours concerne les tuples, séquences non modifiables d'éléments. On peut les étendre en tuples nommés en ajoutant un nom à chacune des entrées du tuple, appelées alors champs. Enfin, on peut aller plus loin et définir des objets en associant des fonctions à des données. Cette seconde partie introduit à la programmation orientée objet.
This course will introduce the core data structures of the Python programming language. We will move past the basics of procedural programming and explore how we can use the Python built-in data structures such as lists, dictionaries, and tuples to perform increasingly complex data analysis.
Ce premier cours présente les notions d'objet et de classe, et le lien entre elles. Il présente aussi le premier concept clé de la programmation orientée objet, à savoir l'encapsulation des données. Les exemples sont fournis dans plusieurs langages (Python, C#, Java, C++ et PHP).
C++11 introduit les fonctions lambda : qu'est-ce que c'est ? Comment (bien) les utiliser ? Voici le support d'une présentation donnée à l'occasion des rencontres C++ à Montpellier le 21 oct. 2014.
Les nouveautés de C++11 : Ecrire du C++ ModerneMicrosoft
Le langage C++ a toujours la réputation d’un langage complexe, demandant une rigueur de tous les instants et qui peut en rebuter plus d’un. Mais avec l’arrivée de la nouvelle norme C++11 et de son intégration dans Visual Studio 11 (et intégration partielle dans Visual Studio 2010), elle permet comme le souligne Herb Sutter, d’écrire désormais du code "Clean, Safe and Fast", nous passons à l'ère du C++ moderne.
Articulé autour de C++ 11, cette session amène celui qui y assiste aux fondamentaux du développement logiciel : libraries, dépendances, TR1 et C++0X les fondations de C++ 11, runtime C alias CRT, runtime C++ alias STL, agilité en C++, ALM en C++, Windows 8 et C++, C++ et Windows 8 avec le nouveau modèle COM nommé WRL.
Introduction à la programmation lock-free en C++11 au moyen des atomics. Présentation données par Cyril Comparon lors des rencontres C++ de Montpellier (novembre 2014).
Ce deuxième cours concerne les tuples, séquences non modifiables d'éléments. On peut les étendre en tuples nommés en ajoutant un nom à chacune des entrées du tuple, appelées alors champs. Enfin, on peut aller plus loin et définir des objets en associant des fonctions à des données. Cette seconde partie introduit à la programmation orientée objet.
This course will introduce the core data structures of the Python programming language. We will move past the basics of procedural programming and explore how we can use the Python built-in data structures such as lists, dictionaries, and tuples to perform increasingly complex data analysis.
Ce premier cours présente les notions d'objet et de classe, et le lien entre elles. Il présente aussi le premier concept clé de la programmation orientée objet, à savoir l'encapsulation des données. Les exemples sont fournis dans plusieurs langages (Python, C#, Java, C++ et PHP).
Ce cours présente les relations de composition et d'agrégation qu'il est possible d'établir entre plusieurs classes et objets. La seconde partie présente la notion d'immuabilité d'objets et montre comment faire des copies d'objets.
Ce cours est le premier en lien avec l'algorithmique présente les algorithmes et fonctions récursives ainsi que le type abstrait de données arbre. La première partie revient sur les notions de problème, algorithhme et spécification. La deuxième partie présente la récursion et de nombreux exemples. Enfin, la troisième partie présente le type abstrait de données arbre qui permet d'organiser des données de manière hiérarchique. Le cours se termine avec une introduction aux notions de backtracking et lookahead.
Ce cours présente comment définir de nouveaux objets en définissant des classes. Un objet est une instance d'une classe qui définit les variables d'instances (attributs) et méthodes (fonctionnalités) que les objets créés à partir de la classe auront.
CocoaHeads Rennes #1 : Grand Central DispatchCocoaHeadsRNS
Slides de la présentation "TA la découverte de Grand Central Dispatch" de la session des CocoaHeads Rennais du 21 avril 2011. Présentation assurée par Pierre Duchêne et Thomas Dupont, ingénieurs chez Niji
Dans ce cours, on découvre comment construire une interface graphique en Python en utilisant la librairie Tk. Après avoir vu les différents composants de base, ce cours présente la programmation évènementielle qui permet d'écrire du code qui réagit à des évènements comme le clic sur un bouton, par exemple.
Ce cours concerne le polymorphisme, c'est-à-dire la capacité pour une variable de prendre plusieurs types de donnée durant le temps de sa vie. Le cours présente aussi la notion de classe abstraite et d'interface qui est une classe abstraite pure.
- Les constructeurs
- La gestion des exceptions
- Les getters et les setters
- Lecture du clavier
- Les references
- Surcharge des méthodes
- Le mot clé this
- la méthode String tostring()
Ce cours présente la programmation fonctionnelle et montre comment il est possible de programmer avec ce paradigme en utilisant Python. La première partie présente la notion d'objet de type fonction, les fonctions lambda, le type callable et les closures. La deuxième partie présente les décorateur et montre comment ajouter du comportement à une fonction à l'aide d'un décorateur. La troisième partie présente les itérateurs et les générateurs qui, grâce à l'instruction yield, génère les données à la demande.
Ce cours concerne la manipulation des chaines de caractères et les expressions régulières. La première partie présente la classe str Python ainsi que les opérations qu'il est possible de faire sur des objets str. La seconde partie concerne les expressions regulières qui permettent de valider des chaines de caractères ou d'en extraire des sous-chaines qui satisfont un motif donné. On y voit finalement comment utiliser le module re Python.
Ce premier cours avancé sur Python concerne les deux structures de données avancées que sont les ensembles et les dictionnaires. Ces derniers sont notamment utilisés pour construire des bases de données orientées document.
Voici le chapitre sur la surcharge des opérateurs en C++.
Si vous avez des remarques ou suggestions afin de le parfaire.
N’hésitez pas à me contacter via mon email:
pr.azizdarouichi@gmail.com.
Bonne lecture
Voici le chapitre sur les classes et les objets en C++.
Si vous avez des remarques ou suggestions afin de le parfaire.
N’hésitez pas à me contacter via mon email:
pr.azizdarouichi@gmail.com.
Bonne lecture.
Ce cours présente la notion d'héritage entre classes qui permet de construire une relation de type "is-a". On crée une sous-classe à partir d'une super-classe, pour en hériter une partie de ses membres. On peut ensuite y ajouter des membres spécifiques. Ce cours présente également la redéfinition de méthodes, et comment utiliser les modificateurs de visibilité des membres.
Ce cours introduit à la notion de type abstrait de données (TAD). On commence par y découvrir les principes de complexité temporelle et spatiale permettant d'analyser les performances d'une structure de données et d'algorithmes. Ensuite, le cours présente plusieurs TAD : la pile, la file, le deque et le vecteur. Enfin, il présente comment implémenter des TAD avec des structures chainées.
Ce cours présente les relations de composition et d'agrégation qu'il est possible d'établir entre plusieurs classes et objets. La seconde partie présente la notion d'immuabilité d'objets et montre comment faire des copies d'objets.
Ce cours est le premier en lien avec l'algorithmique présente les algorithmes et fonctions récursives ainsi que le type abstrait de données arbre. La première partie revient sur les notions de problème, algorithhme et spécification. La deuxième partie présente la récursion et de nombreux exemples. Enfin, la troisième partie présente le type abstrait de données arbre qui permet d'organiser des données de manière hiérarchique. Le cours se termine avec une introduction aux notions de backtracking et lookahead.
Ce cours présente comment définir de nouveaux objets en définissant des classes. Un objet est une instance d'une classe qui définit les variables d'instances (attributs) et méthodes (fonctionnalités) que les objets créés à partir de la classe auront.
CocoaHeads Rennes #1 : Grand Central DispatchCocoaHeadsRNS
Slides de la présentation "TA la découverte de Grand Central Dispatch" de la session des CocoaHeads Rennais du 21 avril 2011. Présentation assurée par Pierre Duchêne et Thomas Dupont, ingénieurs chez Niji
Dans ce cours, on découvre comment construire une interface graphique en Python en utilisant la librairie Tk. Après avoir vu les différents composants de base, ce cours présente la programmation évènementielle qui permet d'écrire du code qui réagit à des évènements comme le clic sur un bouton, par exemple.
Ce cours concerne le polymorphisme, c'est-à-dire la capacité pour une variable de prendre plusieurs types de donnée durant le temps de sa vie. Le cours présente aussi la notion de classe abstraite et d'interface qui est une classe abstraite pure.
- Les constructeurs
- La gestion des exceptions
- Les getters et les setters
- Lecture du clavier
- Les references
- Surcharge des méthodes
- Le mot clé this
- la méthode String tostring()
Ce cours présente la programmation fonctionnelle et montre comment il est possible de programmer avec ce paradigme en utilisant Python. La première partie présente la notion d'objet de type fonction, les fonctions lambda, le type callable et les closures. La deuxième partie présente les décorateur et montre comment ajouter du comportement à une fonction à l'aide d'un décorateur. La troisième partie présente les itérateurs et les générateurs qui, grâce à l'instruction yield, génère les données à la demande.
Ce cours concerne la manipulation des chaines de caractères et les expressions régulières. La première partie présente la classe str Python ainsi que les opérations qu'il est possible de faire sur des objets str. La seconde partie concerne les expressions regulières qui permettent de valider des chaines de caractères ou d'en extraire des sous-chaines qui satisfont un motif donné. On y voit finalement comment utiliser le module re Python.
Ce premier cours avancé sur Python concerne les deux structures de données avancées que sont les ensembles et les dictionnaires. Ces derniers sont notamment utilisés pour construire des bases de données orientées document.
Voici le chapitre sur la surcharge des opérateurs en C++.
Si vous avez des remarques ou suggestions afin de le parfaire.
N’hésitez pas à me contacter via mon email:
pr.azizdarouichi@gmail.com.
Bonne lecture
Voici le chapitre sur les classes et les objets en C++.
Si vous avez des remarques ou suggestions afin de le parfaire.
N’hésitez pas à me contacter via mon email:
pr.azizdarouichi@gmail.com.
Bonne lecture.
Ce cours présente la notion d'héritage entre classes qui permet de construire une relation de type "is-a". On crée une sous-classe à partir d'une super-classe, pour en hériter une partie de ses membres. On peut ensuite y ajouter des membres spécifiques. Ce cours présente également la redéfinition de méthodes, et comment utiliser les modificateurs de visibilité des membres.
Ce cours introduit à la notion de type abstrait de données (TAD). On commence par y découvrir les principes de complexité temporelle et spatiale permettant d'analyser les performances d'une structure de données et d'algorithmes. Ensuite, le cours présente plusieurs TAD : la pile, la file, le deque et le vecteur. Enfin, il présente comment implémenter des TAD avec des structures chainées.
Ce document vise à présenter la programmation fonctionnelle sous Scala.
Les points abordés sont le paradigme fonctionnel, fonction anonyme, fonction d’ordre supérieur, Clôture, fonction partielle, la récursivité, Curryfication. Chaque notion est accompagnée par des exemples.
la plupart des programmes informatique sont des programmes complexes. Ils comportent des dizaines de milliers de lignes et les grosses applications en comportent des millions. Si l'on garde tout dans une seule fonction, la fonction main() par exemple, il va être très difficile de s'y retrouver. Il serait certainement plus simple de découper ce programme en fonctions. Chaque fonction est destinée à effectuer une tâche précise et renvoie généralement un résultat. Découper son programme en fonctions permet de s'organiser.
En plus, si vous êtes plusieurs développeurs à travailler sur le même programme, vous pourrez vous partager plus facilement le travail : chacun s'occupe d’une fonction différente.
Et ce n'est pas tout ! Prenons par exemple le calcul de la racine carrée, que nous avons vu précédemment. Si vous créez un programme de maths, il est bien possible que vous ayez besoin, à plusieurs endroits, d'effectuer des calculs de racines. Avoir une fonction sqrt() va nous permettre de faire plusieurs de ces calculs sans avoir à recopier le même code à plusieurs endroits. On peut réutiliser plusieurs fois la même fonction et c'est une des raisons principales d'en écrire.
Formation C# - Cours 3 - Programmation objetkemenaran
Troisième partie de la formation C# du Club Microsoft Isep.
Fondements de la Porgramation Orientée Objet, introduction aux classes, méthodes et attributs par l'exemple.
Présentation des nouveautés apportées par la version 7 du langage C# : Méthodes locales, Tuples, Déconstructeurs, Pattern matching, Variables de sortie, Membres sous forme d’expression, Amélioration de la levée des exceptions, ...
Une révision des principaux concepts du langage JavaScript : variables, fonctions, types, fermetures (closures), objets et prototypes, format JSON. De nombreux exemples téléchargeables sur GitHub.
Le Comptoir OCTO - Qu’apporte l’analyse de cycle de vie lors d’un audit d’éco...OCTO Technology
Par Nicolas Bordier (Consultant numérique responsable @OCTO Technology) et Alaric Rougnon-Glasson (Sustainable Tech Consultant @OCTO Technology)
Sur un exemple très concret d’audit d’éco-conception de l’outil de bilan carbone C’Bilan développé par ICDC (Caisse des dépôts et consignations) nous allons expliquer en quoi l’ACV (analyse de cycle de vie) a été déterminante pour identifier les pistes d’actions pour réduire jusqu'à 82% de l’empreinte environnementale du service.
Vidéo Youtube : https://www.youtube.com/watch?v=7R8oL2P_DkU
Compte-rendu :
OCTO TALKS : 4 Tech Trends du Software Engineering.pdfOCTO Technology
En cette année 2024 qui s’annonce sous le signe de la complexité, avec :
- L’explosion de la Gen AI
-Un contexte socio-économique sous tensions
- De forts enjeux sur le Sustainable et la régulation IT
- Une archipélisation des lieux de travail post-Covid
Découvrez les Tech trends incontournables pour délivrer vos produits stratégiques.
L'IA connaît une croissance rapide et son intégration dans le domaine éducatif soulève de nombreuses questions. Aujourd'hui, nous explorerons comment les étudiants utilisent l'IA, les perceptions des enseignants à ce sujet, et les mesures possibles pour encadrer ces usages.
Constat Actuel
L'IA est de plus en plus présente dans notre quotidien, y compris dans l'éducation. Certaines universités, comme Science Po en janvier 2023, ont interdit l'utilisation de l'IA, tandis que d'autres, comme l'Université de Prague, la considèrent comme du plagiat. Cette diversité de positions souligne la nécessité urgente d'une réponse institutionnelle pour encadrer ces usages et prévenir les risques de triche et de plagiat.
Enquête Nationale
Pour mieux comprendre ces dynamiques, une enquête nationale intitulée "L'IA dans l'enseignement" a été réalisée. Les auteurs de cette enquête sont Le Sphynx (sondage) et Compilatio (fraude académique). Elle a été diffusée dans les universités de Lyon et d'Aix-Marseille entre le 21 juin et le 15 août 2023, touchant 1242 enseignants et 4443 étudiants. Les questionnaires, conçus pour étudier les usages de l'IA et les représentations de ces usages, abordaient des thèmes comme les craintes, les opportunités et l'acceptabilité.
Résultats de l'Enquête
Les résultats montrent que 55 % des étudiants utilisent l'IA de manière occasionnelle ou fréquente, contre 34 % des enseignants. Cependant, 88 % des enseignants pensent que leurs étudiants utilisent l'IA, ce qui pourrait indiquer une surestimation des usages. Les usages identifiés incluent la recherche d'informations et la rédaction de textes, bien que ces réponses ne puissent pas être cumulées dans les choix proposés.
Analyse Critique
Une analyse plus approfondie révèle que les enseignants peinent à percevoir les bénéfices de l'IA pour l'apprentissage, contrairement aux étudiants. La question de savoir si l'IA améliore les notes sans développer les compétences reste débattue. Est-ce un dopage académique ou une opportunité pour un apprentissage plus efficace ?
Acceptabilité et Éthique
L'enquête révèle que beaucoup d'étudiants jugent acceptable d'utiliser l'IA pour rédiger leurs devoirs, et même un quart des enseignants partagent cet avis. Cela pose des questions éthiques cruciales : copier-coller est-il tricher ? Utiliser l'IA sous supervision ou pour des traductions est-il acceptable ? La réponse n'est pas simple et nécessite un débat ouvert.
Propositions et Solutions
Pour encadrer ces usages, plusieurs solutions sont proposées. Plutôt que d'interdire l'IA, il est suggéré de fixer des règles pour une utilisation responsable. Des innovations pédagogiques peuvent également être explorées, comme la création de situations de concurrence professionnelle ou l'utilisation de détecteurs d'IA.
Conclusion
En conclusion, bien que l'étude présente des limites, elle souligne un besoin urgent de régulation. Une charte institutionnelle pourrait fournir un cadre pour une utilisation éthique.
Ouvrez la porte ou prenez un mur (Agile Tour Genève 2024)Laurent Speyser
(Conférence dessinée)
Vous êtes certainement à l’origine, ou impliqué, dans un changement au sein de votre organisation. Et peut être que cela ne se passe pas aussi bien qu’attendu…
Depuis plusieurs années, je fais régulièrement le constat de l’échec de l’adoption de l’Agilité, et plus globalement de grands changements, dans les organisations. Je vais tenter de vous expliquer pourquoi ils suscitent peu d'adhésion, peu d’engagement, et ils ne tiennent pas dans le temps.
Heureusement, il existe un autre chemin. Pour l'emprunter il s'agira de cultiver l'invitation, l'intelligence collective , la mécanique des jeux, les rites de passages, .... afin que l'agilité prenne racine.
Vous repartirez de cette conférence en ayant pris du recul sur le changement tel qu‘il est généralement opéré aujourd’hui, et en ayant découvert (ou redécouvert) le seul guide valable à suivre, à mon sens, pour un changement authentique, durable, et respectueux des individus! Et en bonus, 2 ou 3 trucs pratiques!
Le Comptoir OCTO - Équipes infra et prod, ne ratez pas l'embarquement pour l'...OCTO Technology
par Claude Camus (Coach agile d'organisation @OCTO Technology) et Gilles Masy (Organizational Coach @OCTO Technology)
Les équipes infrastructure, sécurité, production, ou cloud, doivent consacrer du temps à la modernisation de leurs outils (automatisation, cloud, etc) et de leurs pratiques (DevOps, SRE, etc). Dans le même temps, elles doivent répondre à une avalanche croissante de demandes, tout en maintenant un niveau de qualité de service optimal.
Habitué des environnements développeurs, les transformations agiles négligent les particularités des équipes OPS. Lors de ce comptoir, nous vous partagerons notre proposition de valeur de l'agilité@OPS, qui embarquera vos équipes OPS en Classe Business (Agility), et leur fera dire : "nous ne reviendrons pas en arrière".
2. Plan du jour
Pointeurs, références et copies d’objets : la
suite
Pointer to members
Surcharge d’opérateur
Création dynamique d’objets
Dynamic binding
RTTI
Cours semaine 2 jour 1 Cours C++ 2
3. Cours semaine 2 jour 1 Cours C++ 3
Pointeurs…
Dans le cours précédent, nous avons parlé :
Des pointeurs, un type de base en C et C++ !
Des passages par références (avec les pointeurs)
et des passage par valeurs (avec des copies des
valeurs)
Des copies d’objets pour que ceux-ci puissent
être passés par valeur (copy-contructor)
C++ offre encore une possibilité de
travailler avec les pointeurs dans les classes
4. Cours semaine 2 jour 1 Cours C++ 4
Pointeurs… (2)
Un classe est une structure qui définit un
ensemble :
de variables, généralement privées,
De méthodes ou de signatures de méthodes, qui
peuvent être publiques, protégées ou privées
Un pointeur permet de désigner des
variables, il permet également de désigner
des fonctions
5. Cours semaine 2 jour 1 Cours C++ 5
Pointeurs… (3)
int i = 0; // une donnée entière
int* pi = &i; // un pointeur sur une donnée entière
void f( int i ) // une fonction
{
…
}
void (*pf)(); // un pointeur sur une fonction
pf = f;
(*fp)();
6. Cours semaine 2 jour 1 Cours C++ 6
Pointeurs… (4)
En combinant toutes ces possibilités, il
devient envisageable de définir des
pointeurs à l’intérieur même d’une classe
Mais il est impossible de trouver l’adresse
d’une variable ou d’une fonction dans une
classe. L’opération est possible lorsque l’on
dispose d’un objet, c’est à dire de l’instance
d’une classe
7. Cours semaine 2 jour 1 Cours C++ 7
Pointeurs… (5)
Il est cependant possible de prévoir
l’opération à l’aide des pointeurs vers
membres (pointer to member)
Un member représente tant une variable qu’une
fonction
Data member
Member function
De plus, une variable peut être un pointeur !
8. Cours semaine 2 jour 1 Cours C++ 8
Pointeurs… (6)
class Test
{
public: int i;
};
void main()
{
Test vt, *pt = &vt;
vt.i;
pt->i;
}
9. Cours semaine 2 jour 1 Cours C++ 9
Pointeurs… (7)
Nous venons de définir des pointeurs sur des
variables d’instances, puisque nous en avons créé
avant les accès
Pour créer des pointeurs vers membres, il faut
considérer la classe lors de sa définition et non pas
après son instantiation
Dans ce cas, il faut considérer l’adresse d’une
variable dans la structure de la classe, c’est à dire
le déplacement par rapport au début du bloc
mémoire stockant la structure
10. Cours semaine 2 jour 1 Cours C++ 10
Pointeurs… (8)
#include <iostream>
using namespace std;
class Test {
public: int i, j, k;
void print() { cout << i << " " << j << " " << k << endl; }
};
void main () {
Test t, *pt = &t;
int Test::*pvmi = &Test::i; // def et init
pt->*pvmi = 23;
pvmi = &Test::j; // re init
pt->*pvmi = 24;
pvmi = &Test::k; // re init
pt->*pvmi = 25;
pt->print();
}
11. Cours semaine 2 jour 1 Cours C++ 11
Pointeurs… (9)
Test::i permet de connaître l’importance du
déplacement à effectuer pour accèder à la position
de i dans la structure de Test
Autrement dit, Test ne représente pas un espace de
nommage mais plutôt une prédéfinition de
l’empilement des cases mémoire telles qu’elles
seront définies dans le tas au moment d’une
instantiation
On peut ainsi obtenir une distance depuis la position de
départ
12. Cours semaine 2 jour 1 Cours C++ 12
Surcharge d’opérateurs
Nous avons vu qu’il était possible d’utiliser
plusieurs fois un même nom de méthode à
condition de changer la liste des arguments
Surcharge de fonctions
Il est également possible de changer la
définition d’une méthode héritée d’une
classe mère
Polymorphisme
Nous approfondissons demain…
13. Cours semaine 2 jour 1 Cours C++ 13
Surcharge d’opérateurs (2)
En C++, il est également possible de
redéfinir les opérateurs de base au même
titre que les fonctions héritées
Il est ainsi possible de redéfinir des opérateurs
tels que +, -
Certains opérateurs sont en effet représentés
par ces fonctions
14. Cours semaine 2 jour 1 Cours C++ 14
Surcharge d’opérateurs (3)
Différences avec les fonctions
Les opérateurs n’utilisent pas de parenthèses pour
marquer le début et la fin de la liste des arguments
Les arguments peuvent être soit unaires, soit binaires
Un opérateur s’applique à un objet ou il s’applique sur deux
objets (celui à droite et celui à gauche de l’opérateur)
Les opérateurs peuvent s’appliquer à l’objet lui-même
mais généralement ils renvoient un nouvel objet
15. Cours semaine 2 jour 1 Cours C++ 15
Surcharge d’opérateurs (4)
Différences avec les fonctions (suite)
Conséquence de l’unarité et de la
binarité, l’opérateur peut être placé
devant l’objet, entre deux objets mais
également après un objet
In fine, la représentation syntaxique de
l’opérateur sera remplacé par un appel
de fonction, comme pour les types de
base
16. Cours semaine 2 jour 1 Cours C++ 16
Surcharge d’opérateurs (5)
Très heureusement (…), il n’est pas
possible de changer le sens des opérateurs
sur les types de base
Imaginez les problèmes dans ce cas !
La définition de la fonction correspondant à
l’opérateur est marquée par un mot clé :
operator
Exemple : operator+
17. Cours semaine 2 jour 1 Cours C++ 17
Surcharge d’opérateurs (6)
#include <iostream>
using namespace std;
class MyInt {
public:
int i;
MyInt( int ii ) : i( ii ) {}
MyInt operator+( MyInt& v ) {
cout << "operator+" << endl;
return MyInt( i + v.i );
}
MyInt& operator+=( MyInt& v ) {
cout << "operator+=" << endl;
i += v.i;
return *this;
}
};
18. Cours semaine 2 jour 1 Cours C++ 18
Surcharge d’opérateurs (7)
void main()
{
cout << "opérateurs sur le type de base int" << endl;
int i = 1, j = 2, k = 3;
k += i + j;
cout << "k = " << k << endl;
cout << "opérateurs sur le type MyInt" << endl;
MyInt mii( 1 ), mij( 2 ), mik( 3 );
mik += mii + mij;
cout << "mik = " << mik.i << endl;
}
19. Cours semaine 2 jour 1 Cours C++ 19
Surcharge d’opérateurs (8)
Avant de surcharger l’opérateur, il faut se
renseigner sur la véritable signature de
l’opération
Les choses ne sont pas toujours ce qu’elles
semblent être
Exemple : l’opérateur unaire ++ permet de
faire une incrémentation mais les résultats
dépendent de la place de l’opérateur
Incrémentation préfixée ou postfixée
20. Cours semaine 2 jour 1 Cours C++ 20
Surcharge d’opérateurs (9)
…
class MyInt {
public:
int i;
…
MyInt operator++() { // pre
cout << "++MyInt" << endl;
i++;
return *this;
}
MyInt operator++( int ) { // post, notez le int
cout << "MyInt++" << endl;
MyInt preval( i );
i++; //testez aussi i += 2 !
return preval;
}
};
22. Cours semaine 2 jour 1 Cours C++ 22
Surcharge d’opérateurs (11)
Dans le cas précédent, pour permettre de
distinguer entre l’opération ++ préfixée et
l’opération ++ postfixée, il a fallu rajouter
un argument entier
Cet argument ne sert à rien dans le corps de la
fonction et il n’a donc pas de nom
Il sert uniquement à distinguer les deux cas
Le compilateur vous fera des commentaires
dans les cas douteux !
23. Cours semaine 2 jour 1 Cours C++ 23
Surcharge d’opérateurs (12)
Nous venons de voir les surcharges
d’opérateurs unaires, il est également
possible de réaliser des surcharges
d’opérateurs binaires
Les opérateurs binaires prennent en compte
l’instance courante plus l’instance d’un autre
objet
Un exemple précédent présentait
l’operator+
24. Cours semaine 2 jour 1 Cours C++ 24
Surcharge d’opérateurs (13)
…
class MyInt {
…
MyInt operator+( MyInt& v )
{
cout << "operator+" << endl;
return MyInt( i + v.i );
}
…
MyInt operator-( MyInt& v )
{
cout << "operator- avec " << v.i << endl;
return MyInt( i - v.i );
}
};
25. Cours semaine 2 jour 1 Cours C++ 25
Surcharge d’opérateurs (14)
void main()
{
…
mil = mij + mii;
cout << "mil (mij + mii) = " << mil.i << endl;
mil = mij - mii;
cout << "mil (mij - mii) = " << mil.i << endl;
}
26. Cours semaine 2 jour 1 Cours C++ 26
Surcharge d’opérateurs (15)
Un opérateur binaire particulier est
l’affectation, =, qu’il est également possible
de redéfinir !
Bien évidemment, cette possibilité peut poser
de gros problèmes de lecture aux développeurs
non avertis
Redéfinir l’affectation, c’est prendre de gros
risques !
27. Cours semaine 2 jour 1 Cours C++ 27
Surcharge d’opérateurs (16)
…
class MyInt {
…
MyInt operator=( MyInt& v )
{
if( this == &v )
{
cout << "operator= sur le même" << endl;
return *this;
}
cout << "operator= sur différents" << endl;
i = 2 * (v.i);
return *this;
}
};
28. Cours semaine 2 jour 1 Cours C++ 28
Surcharge d’opérateurs (17)
void main()
{
…
cout << endl << "operator+ avec mil = " << mil.i << endl << endl;
//mil = MyInt( 1 ); // décommentez après la première exécution
mil = mil;
cout << "mil (mil = mil) = " << mil.i << endl;
MyInt* pmil = &mil;
mil = *pmil;
cout << "mil (mil = *pmil) = " << mil.i << endl;
mil = mii;
cout << "mil (mil = mii) = " << mil.i << endl;
mil = mii = mik;
cout << "mil (mil = mii = mik) = " << mil.i << endl;
}
29. Cours semaine 2 jour 1 Cours C++ 29
Surcharge d’opérateurs (18)
void main()
{
…
// encore plus de sport avec le copy-constructor
cout << endl << "avec le copy constructor" << endl << endl;
MyInt mim = MyInt( 10 );
cout << "mim = " << mim.i << endl;
MyInt mio = mim; // X(X&)
cout << "mio = " << mio.i << endl;
mio = mim; // pas X(X&)
cout << "mio = " << mio.i << endl;
cout << endl;
}
30. Cours semaine 2 jour 1 Cours C++ 30
Surcharge d’opérateurs (19)
Remarques :
Passer les arguments en constantes dans les
fonctions associées aux opérateurs peut être une
bonne chose
Cela évite les effets de bord
Cela n’est pas forcément vrai pour l’affectation !
Le type retourné n’est pas forcément celui de la
classe
Les opérateurs logiques retournent au pire des
entiers, normalement des booléens, s’ils existent
31. Cours semaine 2 jour 1 Cours C++ 31
Surcharge d’opérateurs (20)
L’opérateur d’égalité peut être défini de
manière automatique par le système pour
réaliser des conversions de type
(automatiques elles aussi)
Il peut essayer de trouver seul un chemin pour
effectuer un appel de fonction
32. Cours semaine 2 jour 1 Cours C++ 32
Surcharge d’opérateurs (21)
…
class MyInt { … };
class MyOtherInt
{
public:
MyOtherInt( const MyInt& )
{}
};
void f( MyOtherInt x )
{
cout << endl << "f( MyOtherInt ) : appel" << endl << endl;
}
33. Cours semaine 2 jour 1 Cours C++ 33
Surcharge d’opérateurs (22)
void main()
{
…
// la fonction f n’est pas définie pour MyInt !
f( mil );
// pourtant, cela va marcher…
}
34. Cours semaine 2 jour 1 Cours C++ 34
Surcharge d’opérateurs (23)
Le compilateur a trouvé un chemin, non
explicite, permettant de transformer un
MyInt en un MyOtherInt
La fonction f a besoin d’un MyOtherInt
Il existe un constructeur de MyOtherInt qui
prend un MyInt en argument
Le compilateur modifie l’appel de fonction et
réalise la conversion
Il réalise une conversion de type de même nature
que celles qui sont effectuées dans les affectations
35. Cours semaine 2 jour 1 Cours C++ 35
Surcharge d’opérateurs (24)
Il est possible de restreindre ce mécanisme
et d’interdire la conversion dynamique de
type
Le constructeur doit posséder le qualificatif
explicit
Désormais, c’est le programmeur qui doit
assurer la conversion de type
36. Cours semaine 2 jour 1 Cours C++ 36
Surcharge d’opérateurs (25)
…
class MyInt { … };
class MyOtherInt
{
public:
explicit MyOtherInt( const MyInt& ) {}
};
void f( MyOtherInt x )
{
cout << endl << "f( MyOtherInt ) : appel" << endl << endl;
}
37. Cours semaine 2 jour 1 Cours C++ 37
Surcharge d’opérateurs (26)
void main()
{
…
f( mil ); // ne peut plus être compilé
f( MyOtherInt( mil ) ); // OK
}
38. Cours semaine 2 jour 1 Cours C++ 38
Surcharge d’opérateurs (27)
Il existe cependant une autre manière de
faire :
Il est possible de définir un opérateur de
construction d’une instance d’une classe dans
une autre classe (!)
Un constructeur d’une classe devient ainsi une
fonction (et même un opérateur) dans une autre
classe
39. Cours semaine 2 jour 1 Cours C++ 39
Surcharge d’opérateurs (28)
…
class MyInt;
class MyOtherInt {
public:
explicit MyOtherInt() {}
explicit MyOtherInt( const MyInt& ){}
};
class MyInt {
…
operator MyOtherInt(){ return MyOtherInt(); }
};
void f( MyOtherInt x )
{
cout << endl << "f( MyOtherInt ) : appel" << endl << endl;
}
40. Cours semaine 2 jour 1 Cours C++ 40
Surcharge d’opérateurs (29)
void main()
{
…
f( mil ); // OK
f( MyOtherInt( mil ) ); // OK
}
41. Cours semaine 2 jour 1 Cours C++ 41
Surcharge d’opérateurs (30)
La technique des opérateurs de construction
d’autres types a cependant des limites
Il se peut que les chemins soient multiples
Dans ce cas, le compilateur ne peut pas
déterminer seul lequel il doit suivre
Il est possible d’avoir les mêmes problèmes
avec l’héritage multiple, que nous verrons
plus tard…
42. Cours semaine 2 jour 1 Cours C++ 42
Surcharge d’opérateurs (31)
#include <iostream>
using namespace std;
class Pomme {};
class Poire {};
class Scoubidou {
public:
operator Pomme() const;
operator Poire() const;
};
void mange( Pomme p ) { cout << "mangez des pommes" << endl; }
void mange( Poire p ) { cout << "mangez des poires" << endl; }
void main(){
Scoubidou s;
mange( s ); // ambiguous reference
}
43. Cours semaine 2 jour 1 Cours C++ 43
Surcharge d’opérateurs (32)
La surcharge d’opérateurs peut s’appliquer
dans des cas encore plus exotiques que
l’affectation
Possibilité de créer un opérateur , (virgule)
Possibilité de redéfinir l’opérateur ->
Très risqué aussi…
Possibilité de redéfinir ->*
Pour les pointeurs sur membres
Remarque : impossible pour .* et pour .
44. Cours semaine 2 jour 1 Cours C++ 44
Surcharge d’opérateurs (33)
#include <iostream>
using namespace std;
class Test
{
public:
Test& operator,( Test& )
{
cout << "Test : operator," << endl;
return *this;
}
};
void main()
{
Test t1, t2;
t1, t2; // quelle lisibilité !
}
45. Cours semaine 2 jour 1 Cours C++ 45
Surcharge d’opérateurs (34)
La surcharge d’opérateurs peut servir dans
certains cas
Il ne s’agit après tout que d’une sorte de
polymorphisme
Certains cas de surcharge d’opérateurs ont
des applications beaucoup plus pratiques
Cela permet d’obtenir des classes dont on dirait
presque qu’elles sont d’origine !
46. Cours semaine 2 jour 1 Cours C++ 46
Surcharge d’opérateurs (35)
…
#include <sstream> // string streams
…
class MyInt {
…
friend ostream& operator<<( ostream& os, MyInt& v )
{
os << v.i ;
return os;
}
friend istream& operator>>( istream& is, MyInt& v )
{
is >> v.i;
return is;
}
};
47. Cours semaine 2 jour 1 Cours C++ 47
Surcharge d’opérateurs (36)
void main()
{
…
// jusquà présent, obligé d’accèder au data member (public)
cout << "mil = " << mil.i << endl;
// désormais, MyInt est traité normalement
// en conséquence, le data member int i peut devenir privé
cout << endl << "mil par operator<< " << mil << endl;
cin >> mil;
cout << endl << "mil par operator<< " << mil << endl;
}
48. Cours semaine 2 jour 1 Cours C++ 48
Surcharge d’opérateurs (37)
La mention friend est obligatoire car
l’opérateur surchargé ne traite pas
uniquement MyInt mais également ostream
et istream
En fait, nous définissons ici une surcharge des
opérateurs << et >> dans leurs classes
respectives
49. Cours semaine 2 jour 1 Cours C++ 49
Création dynamique d’objets
Jusqu’à présent, nous avons vu différentes
manière de créer des objets à partir de la
définition d’une classe
La manière la plus naturelle est l’appel du
constructeur
Il est possible d’appeler le copy-constructor
De manière indirecte, il est possible d’appeler
le constructeur de l’instance d’une classe dans
une autre classe
50. Cours semaine 2 jour 1 Cours C++ 50
Création dynamique d’objets (2)
C++ héritant de C, les mécanismes de
réservation explicites de la mémoire
existent encore
malloc (allocation) et free (libération) en C
new et delete en C++
New et delete sont des opérateurs en C++ et
non des fonction : il n’y a pas de
parenthèses !
Exemple : MyInt* mii = new MyInt( 1 );
51. Cours semaine 2 jour 1 Cours C++ 51
Création dynamique d’objets (3)
L’appel de new correspond en fait à l’appel
du constructeur de la classe avec les
paramètres donnés
Comme pour le malloc de C, new renvoie
un pointeur sur la structure nouvellement
réservée et initialisée
1) réservation de la mémoire
2) construction avec les paramètres
3) retour du pointeur
52. Cours semaine 2 jour 1 Cours C++ 52
Création dynamique d’objets (4)
#include <iostream>
using namespace std;
class Test {
int i;
public:
Test( int v ) : i( v ) { cout << "constructeur" << endl; }
~Test() { cout << "destructeur" << endl; }
friend ostream& operator<<( ostream& os, Test* t ) {
return os << "Test avec la valeur " << t->i << endl;
}
};
void main() {
Test* t1 = new Test( 40 );
cout << t1;
delete t1;
Test t2 = Test( 20 );
cout << &t2;
}
53. Cours semaine 2 jour 1 Cours C++ 53
Création dynamique d’objets (5)
La différence entre une instance définie par
valeur et une instance définie par référence
permet de voir l’application de new et
delete
Il est également possible de définir des
tableaux d’objets par l’intermédiaire du new
Il y a alors réservation pour un tableau d’objets
et une itération sur le constructeur pour
initialiser toute la zone mémoire
54. Cours semaine 2 jour 1 Cours C++ 54
Création dynamique d’objets (6)
#include <iostream>
using namespace std;
class Test {
int i;
public:
Test() : i( 0 ) { cout << "constructeur" << endl; }
Test( int v ) : i( v ) { cout << "constructeur" << endl; }
~Test() { cout << "destructeur" << endl; }
friend ostream& operator<<( ostream& os, Test* t )
{
return os << "Test avec la valeur " << t->i << endl;
}
friend ostream& operator<<( ostream& os, Test t )
{
return os << "Test avec la valeur " << t.i << endl;
}
};
55. Cours semaine 2 jour 1 Cours C++ 55
Création dynamique d’objets (7)
void main()
{
…
cout << "t3" << endl;
Test* t3 = new Test[ 3 ];
cout << "t3" << t3[ 1 ];
delete []t3;
cout << "t4" << endl;
Test* t4 = new Test[ 4 ];
cout << "t4[ 0 ] " << t4[ 0 ];
cout << "t4[ 3 ] " << t4[ 3 ];
cout << "t4[ 1 ] " << t4[ 1 ];
delete [ 2 ]t4; // compatibilité avec l'ancien C++
cout << "t4[ 1 ] " << t4[ 1 ]; // ne marche pas (plus ?)
cout << "t4[ 3 ] " << t4[ 3 ]; // ne marche pas non plus
}
56. Cours semaine 2 jour 1 Cours C++ 56
Création dynamique d’objets (8)
Puisque new et delete sont des opérateurs, il
est possible de les surcharger
Comme les autres…
Les signatures standard de ces deux
opérateurs, définis au niveau global, sont :
void* operator new( size_t sz );
aussi : void* operator new( size_t sz, void* loc );
void operator delete( void* m );
57. Cours semaine 2 jour 1 Cours C++ 57
Création dynamique d’objets (9)
…
class Test {
…
void* operator new( size_t sz ) {
cout << "new " << sz << endl;
return ::new char[ sz ];
}
void operator delete( void* p ) {
::delete []p;
}
void* operator new[]( size_t sz ) {
cout << "new[] " << sz << endl;
return ::new char[ sz ];
}
void operator delete[]( void* p ) {
::delete []p;
}
};
58. Cours semaine 2 jour 1 Cours C++ 58
Création dynamique d’objets (10)
void main()
{
cout << "ta" << endl;
Test* ta = new Test( 24 );
cout << "ta " << ta;
delete ta;
cout << "tb" << endl;
Test* tb = new Test[ 24 ];
cout << "tb " << tb[ 8 ];
delete []tb;
}
59. Cours semaine 2 jour 1 Cours C++ 59
Dynamic binding
Lors du développement d’un système
orienté objet, il est fréquent d’avoir besoin
d’un ADT mais pas nécessairement de
connaître son implémentation
C’est le but d’un ADT après tout…
Un développeur peut également avoir
besoin d’un algorithme sans avoir besoin
des détails
Pour réaliser un tri par exemple
60. Cours semaine 2 jour 1 Cours C++ 60
Dynamic binding (2)
Dans les cas mentionnés, il peut être
préférable de retarder le choix d’une
implémentation le plus longtemps possible
La décision n’est prise que lorsque qu’un
ensemble d’informations est disponible pendant
le traitement
Dans ces cas, il peut être intéressant de
mettre en place un système d’appel
dynamique, utilisé à l’exécution et non à la
compilation
61. Cours semaine 2 jour 1 Cours C++ 61
Dynamic binding (3)
Le mécanisme utilisé s’appelle le dynamic
binding (liaison dynamique)
Ce n’est pas une création dynamique d’objet
(on parle alors de dynamic linking)
Il s’agit d’une variante moins puissante des
pointers to members (member functions) mais
cette variante est plus compréhensible
62. Cours semaine 2 jour 1 Cours C++ 62
Dynamic binding (4)
Le dynamic binding repose sur la possibilité
de tout de même appeler des fonctions
virtuelles, c’est à dire des fonctions dont on
ne possède que la signature
Nous reviendrons sur l’héritage demain…
63. Cours semaine 2 jour 1 Cours C++ 63
Dynamic binding (5)
Le dynamic binding améliore la flexibilité
et l’extensibilité
Flexibilité : il permet de recombiner des
composants existants dans des configurations
différentes
Extensibilité : il facilite l’intégration de
nouveaux composants dans un système existant
64. Cours semaine 2 jour 1 Cours C++ 64
Dynamic binding (6)
// signature de la classe mère
class Mere
{
public: virtual int vfonc( void );
};
// dans le code, on utilise un pointeur sur la classe Mere
Mere *mp = /* pointeur vers la classe fille */
mp->vfonc();
65. Cours semaine 2 jour 1 Cours C++ 65
Dynamic binding (7)
La classe mère possède une fonction
virtuelle qui sera implémentée de manière
différente dans les classes filles
Il est cependant possible de l’utiliser
Rappelez vous de la fonction seDéplacer() sur
les Mammifères…
66. Cours semaine 2 jour 1 Cours C++ 66
Dynamic binding (8)
// signature de la classe fille (qui hérite de la mère)
class Fille : public Mere
{
public: int vfonc( void );
};
// pointeur sur la classe Mere contenant un pointeur
// vers une instance de la classe Fille
Fille f;
mp = &f;
mp->vfonc();
67. Cours semaine 2 jour 1 Cours C++ 67
Dynamic binding (9)
Problèmes posés dans ce cas par les
mécanismes d’héritage
Le dynamic binding peut être utilisé pour les
fonctions publiques (utilisation de l’extérieur)
Il est possible que des fonctions appelées par la
fonction considérée soient implémentées de
manière différente dans la classe mère et la
classe fille
68. Cours semaine 2 jour 1 Cours C++ 68
Dynamic binding (10)
Ces désavantages sont contournés par le
static binding
La liaison est faite pendant la compilation
Aucune flexibilité puisqu’aucun choix ne peut
être fait pendant l’exécution
Cela a été fait statiquement, « syntaxiquement »
Le static binding est aussi plus rapide : le type
de l’objet par lequel on appelle la fonction est
connu
69. Cours semaine 2 jour 1 Cours C++ 69
Dynamic binding (11)
Pour le dynamic binding, il faut identifier le
type de l’objet pendant l’exécution pour
savoir où se trouve la méthode à appeler
effectivement
L’identification de type pendant l’exécution
s’appelle le RunTime Type Identification, RTTI
Après la RTTI, il est possible d’envoyer le bon
message à la bonne instance pour exécuter la
bonne méthode
70. Cours semaine 2 jour 1 Cours C++ 70
Dynamic binding (12)
Le fait de retrouver, à partir d’un objet
général, le type spécifique de l’instance
courante et d’exécuter la bonne méthode
correspond également à du downcasting
Pour analogie, dans un diagramme de classes
UML, pour retrouver la classe fille à partir de la
classe mère générale, il faut parcourir
l’arborescence vers le bas
71. Cours semaine 2 jour 1 Cours C++ 71
Dynamic binding (13)
Le dynamic binding est un mécanisme
véritablement objet
Même s’il est aussi facilement relié aux ADT
Le static binding est un mécanisme
typiquement associé aux langages de
troisième génération (avec appel de
procédures et de fonctions)