/* IFT1166 - démonstration #7 - exercice 15 05-novembre -2005 v1.02 M.Lokbani MàJ pour A05 11-octobre -2003 v1.01 M.Lokbani gcc3.2 + comments 05-octobre -1999 v1.00 M.Lokbani énoncé & correction contact: lokbani@iro.umontreal.ca Le but de cet exercice est de vous pratiquer les fonctions membres, et plus particulièrement les fonctions membres statiques. Copyright (C) 1999-2005 Université de Montréal Département d'informatique et de Recherche Opérationnelle Mohamed Lokbani -- Tous Droits Réservés -- All Rights Reserved -- */ #include #include using namespace std; /* Les points à mentionner: 1) on ne peut pas trouver d'initialisation de membres dans une partie déclarative => On initialise un membre static 2) une fonction static ne peut accéder à des membres non static, car elle est appelable sans pour autant qu'il y ait d'objet créé 3) une fonction dont le code est directement mis dans la déclaration de la classe est inline sauf si le compilateur en décide autrement (code trop long, etc)! */ // ceci est la déclaration (devrait apparaître dans un fichier d'entête (.h)) class partage { int a; // ceci est une "erreur" car l'initialisation doit se faire par une instruction // spécifique (voir plus bas) // static int b=100; static int b; public : int d; // static int c=200; // erreur idem pour les mêmes raisons static int c; // C'est une erreur, une fonction statique ne peut qu'accéder aux membres statiques // ce qui n'est pas ici le cas de a // static void init(int i, int j,int k) {a=i; b=j; c=k;} // Enlever le membre a, sinon le déclarer static static void init(int j,int k) {b=j; c=k;} void afficher(); }; // Ceci est la définition de la classe // initialisations (dans la partie définition (.cc)) int partage::b = 100; // voila comment on doit initialiser une variable static d'une classe int partage::c = 200; /* Remarque: certains compilateurs acceptent cependant l'initialisation directe dans la classe ... cependant c'est hors norme, non-ansi etc. ............. il faudra respecter l'initialisation comme celle décrite dans le cours et dans cet exemple. */ //void partage:afficher() { // :: pas : (erreur de syntaxe) void partage::afficher() { // La variable a n'est pas statique, et mieux encore, il n'a même pas été initialise!!!! TRES DANGEUREUX! cout << "La variable statique a : " << a << endl; cout << "La variable b : " << b << endl; cout << "La variable statique c : " << c << endl; } int main(void) { partage x,y; x.init(1,1); // il manque un argument (ou alors on corrige dans la classe, ce que nous avons fait) x.afficher(); y.init(2,2); // il manque un argument (ou alors on corrige dans la classe, ce que nous avons fait) y.afficher(); x.afficher(); partage::c++; // on ne peut pas accéder a un membre prive // partage::a++; // Ne marche que parce que c est static => x.c cout << "La variable statique c vaut: " << partage::c << endl; cout << x.c << " == " << y.c << endl; // Ne marche pas car c'est non static => auquel d accéder (de quel objet)? // cout << "La variable statique c vaut: " << partage::d << endl; // Celle-ci non plus car elle est privée (en plus d'être non static) // cout << "La variable statique a vaut: " << partage::a << endl; return 0; } /* Constatez le danger de ne pas avoir initialisé la valeur de a, a : 2293672 >demo7exo15sol La variable statique a : 2293672 La variable b : 1 La variable statique c : 1 La variable statique a : 0 La variable b : 2 La variable statique c : 2 La variable statique a : 2293672 La variable b : 2 La variable statique c : 2 La variable statique c vaut: 3 3 == 3 >Exit code: 0 */