SlideShare una empresa de Scribd logo
1 de 8
Descargar para leer sin conexión
Chapitre IV
Les propriétés des fonctions
membres
Toutes les possibilités offertes par C++ pour les fonctions restent valables pour les fonctions
membres (surcharge, arguments par défaut, …)
Exemple 4.1
On désir munir la classe point d'un constructeur qui permet de créer le point :
: (EXP04_01.CPP)
• (0,0) si aucun argument n'est fourni
• (abs,0) si on lui fournit abs comme seul argument
• (abs,ord) si on lui fournit les deux arguments abs et ord
Pour cela, il suffit de définir le constructeur de la classe avec des paramètres par défaut
class point
{
int x; int y;
public:
point(int = 0, int = 0);
… …
}
point::point(int abs, int ord){
x = abs; y = ord;
}
Les propriétés des fonctions membres 28
Exemple 4.2
On désire maintenant que le constructeur de la classe point crée le point
: (EXP04_02.CPP)
• (abs,abs) si on lui fournit un seul argument (abs)
Dans ce cas, on ne peut pas utiliser des valeurs par défaut, il faut par suite surcharger le
constructeur :
class point
{
int x; int y;
public:
point();
point(int);
point(int,int);
… …
}
point::point() { x = 0; y = 0;}
point::point(int abs) {x = abs; y = abs;}
point::point(int abs, int ord){ x = abs; y = ord;}
IV.1 Objets transmis en argument
• Considérons une classe T et une fonction F dont l'un des paramètres est un objet de T
transmis par valeur, par adresse ou par référence. Soit U une instance de T transmis en
argument à F, alors:
1. Si F est une fonction membre de T, elle aura accès à tous les membres données
de U, sinon elle n'aura accès qu'aux membres publiques de U
2. Si la transmission de U se fait par valeur, il y a recopie des membres données de
U dans un emplacement locale à F, ce qui entraîne certaines problèmes si la
classe contient des pointeurs
Exemple 4.3
Définir une fonction qui permet de comparer deux instances de la classe point. Cette
fonction devra retourner "true" si les deux objets coïncident et "false" sinon.
: (EXP04_03.CPP)
La comparaison nécessite l'accès aux coordonnées des points, qui sont des données privés,
par suite, la fonction doit être une fonction membre de la classe
La déclaration de la fonction dans la classe sera :
bool coincide(point)
et sa définition
bool point::coincide(point pt)
{
return ( (pt.x == x) && (pt.y == y));
}
• On peut prévoir pour cette fonction une transmission par adresse ou par référence.
Les propriétés des fonctions membres 29
IV.2 Objets fournis en valeur de retour
• Etant donné une classe T et une fonction F qui a l'une des formes suivantes :
T F(arguments); // retour par valeur
T * F(arguments); // retourne l'adresse
T & F(arguments) // retourne une référence
Alors F aura accès à tous les membres de l'objet retourné si elle est une fonction
membre de T, si non elle n'aura accès qu'aux membres publics de la classe.
Exemple 4.4
On désire définir la fonction symetrique() qui permet de retourner le symétrique d'un
point.
: (EXP04_04.CPP)
Cette fonction doit être une fonction membre de la classe point, puisqu'elle doit accéder
aux coordonnées du point, qui sont des données privées. La valeur de retour sera de type
point
La déclaration de la fonction dans la classe sera :
point symetrique();
et sa définition
point point::symetrique(){
point pt;
pt.x = -x; pt.y = -y;
return pt;
}
IV.3 Le pointeur this
• Dans une fonction membre, this représente un pointeur sur l'instance ayant appelé
cette fonction
• this est un pointeur constant, c'est-à-dire qu'on ne peut le modifier.
Exemple 4.5
class point {
: (EXP04_05.CPP)
int x; int y;
public:
point(int=0, int=0);
void affiche();
};
point::point(int abs, int ord) { x = abs; y = ord;}
void point point::affiche()
{
cout << " le point : (" << this->x << "," << this->y << ")" ;
cout << " est à l'adresse " << this << endl;
}
la fonction membre affiche() de la classe point affiche les coordonnées de l'objet et de son adresse.
IV.4 Fonctions membres en ligne
• Toute fonction membre définie dans sa classe (dans la déclaration de la classe) est
considérée par le compilateur comme une fonction inline. Le mot clé inline n'est plus
utilisé.
Les propriétés des fonctions membres 30
Dans l'exemple suivant, le constructeur de la classe point est défini en ligne
class point {
int x; int y;
public:
point(int abs = 0, int ord =0){
x = abs; y = ord;}
void affiche();
};
IV.5 Fonctions membres statiques
• On distingue deux types de membres :
♦ Membres d'instance : membres associés à une instance de la classe.
♦ Membres de classe : membres associés à la classe et qui ne dépendent d'aucune
instance de la classe.
• Les membres de classe, sont aussi dits membres statiques. Ils sont déclarés avec
l'attribut static, et existent même si aucun objet de la classe n'est crée.
• Ainsi on peut définir un membre donnée statique comme on peut définir une fonction
membre statique. L'accès à ces membres se fait avec l'opérateur de résolution de
portée (::) précédé par le nom de la classe ou d'un quelconque objet de la classe
Exemple 4.6
Dans cet exemple, on prévoit dans la classe point un membre donnée statique privé
nb_obj et une fonction membre NbObj() qui retourne le nombre d'instances crées.
:
Interface: (POINT2.H)
#ifndef POINT_H
#define POINT_H
class point{
int x;
int y;
static int nb_obj;
public:
point(int = 0, int = 0);
~point();
void affiche();
static int NbObj();
};
#endif
Corps de la classe: (POINT2.CPP)
#include "point2.h"
#include <iostream> // utilisé dans affiche()
using namespace std;
//--- definition obligatoire du membre donnée statique
int point::nb_obj;
//--- constructeur
point::point(int abs, int ord){
x = abs; y = ord;
nb_obj++;
}
//--- Destructeur
point::~point(){
Les propriétés des fonctions membres 31
nb_obj--;
}
//--- affiche
void point::affiche(){
cout << "(" << x << "," << y << ")" << endl;
}
//--- definition de la fonction membre statique
int point::NbObj(){
return nb_obj;
}
Programme test: (EXP04_06.CPP)
#include "point.h"
#include <iostream>
using namespace std;
int main()
{
/ Acces à la fonction membre statique avant la création des objets
cout << "Nombre de points : " << point::NbObj() << endl;
// Appel de la fct membre statique en utilisant un objet
point a;
cout << "Nombre de points : " << a.NbObj() << endl;
return 0;
}
IV.6 Les fonctions membres constantes
• Les objets, comme les autres types de C++, peuvent être déclarés constants avec
l'attribut const. Dans ce cas, seules les fonctions membres déclarées et définies avec
l'attribut const peuvent être appelées par des objets constants.
Plus précisément :
class T {
… …
public:
…
type_a F(…); // fct membre ordinaire
type_b G(…) const; // fct membre constante
type_c K(const T); // fct avec argument constant
};
// déclarations
T u; // instante non constante
const T v; // instante constante
// appels
u.F(…) // OK
v.F(…) // erreur : instance constante
u.G(…) // OK
v.G(…) // OK
//
T w;
u.K(v) // OK
u.K(w) // OK
v.K(w) // erreur : instance constante et fct non constante
v est une instance constante, donc elle ne peut être appelée ni par F ni par K, qui ne sont pas des fonctions
constantes
Les propriétés des fonctions membres 32
Exemple 4.7
Cet exemple montre la différence entre les variables simples et les objets lors de passage
en arguments à des fonctions demandant des arguments constants et la différence d'une
fonction membre et une fonction non membre agissant sur des objets constants.
: (EXP04_07.CPP)
#include <iostream>
using namespace std;
//-----------------------------------------------------------------
class point{
int x;
int y;
public:
point(int abs = 0, int ord = 0){
x = abs; y = ord;
}
void affiche() const; // fct membre constante
bool coincide(const point); // argument constant
void deplace(int,int);
};
void point::affiche() const{
cout << "(" << x << "," << y << ")" << endl;
}
bool point::coincide(const point pt){
return ( (pt.x == x) && (pt.y == y) );
}
void point::deplace(int dx, int dy){
x =+ dx; y =+ dy;
}
//-----------------------------------------------------------------
// fonction avec argument constant de type simple
void fct(const int k) { cout << k << endl; }
// fonction avec argument constant de type classe
point sosie(const point pt) { return pt; }
//----------------------------- TEST
int main()
{
// Cas d'une fonction simple avec argument de type simple
int i = 5;
const int j = 10;
fct(i); // OK
fct(j); // OK
// ----------------------Cas des objets
point a;
const point b(5,6);
//-----Appel d'une fonction non membre
point c;
c = sosie(a); // OK
c = sosie(b); // OK
//-----Appel d'une fonction membre non constante
a.deplace(1,1);
//b.deplace(1,1); // erreur : instance constante, fonction non
constante
//-----Appel de la fonction membre constante
cout << "a = " ; a.affiche();
Les propriétés des fonctions membres 33
cout << "b = " ; b.affiche();
cout << endl;
//-----Appel de la fonction membre non constante avec paramètres
constants
// instance non constant, argument constant
cout << ( a.coincide(b) ? "coincident" : "ne coincident pas" )<< endl;
// instance non constante, argument non constant
cout << ( a.coincide(a) ? "coincident" : "ne coincident pas" )<< endl;
// instance constante, fonction non constante : ERREUR
//cout << ( b.coincide(a) ? "coincident" : "ne coincident pas" )<< endl;
return 0;
}
Les propriétés des fonctions membres 34

Más contenido relacionado

La actualidad más candente

programmation orienté objet c++
programmation orienté objet c++programmation orienté objet c++
programmation orienté objet c++coursuniv
 
Chapitre 2: String en Java
Chapitre 2:  String en JavaChapitre 2:  String en Java
Chapitre 2: String en JavaAziz Darouichi
 
Développement informatique : Algorithmique I : Récursion et arbre
Développement informatique : Algorithmique I : Récursion et arbreDéveloppement informatique : Algorithmique I : Récursion et arbre
Développement informatique : Algorithmique I : Récursion et arbreECAM Brussels Engineering School
 
Chapitre 11: Expression Lambda et Référence de méthode en Java
Chapitre 11: Expression Lambda et Référence de méthode en JavaChapitre 11: Expression Lambda et Référence de méthode en Java
Chapitre 11: Expression Lambda et Référence de méthode en JavaAziz Darouichi
 
Développer en natif avec C++11
Développer en natif avec C++11Développer en natif avec C++11
Développer en natif avec C++11Microsoft
 
Chapitre 3 elements de base de java
Chapitre 3  elements de base de javaChapitre 3  elements de base de java
Chapitre 3 elements de base de javaAmir Souissi
 
Les fonctions lambdas en C++11 et C++14
Les fonctions lambdas en C++11 et C++14Les fonctions lambdas en C++11 et C++14
Les fonctions lambdas en C++11 et C++14Aurélien Regat-Barrel
 
Corrigés exercices langage C
Corrigés exercices langage CCorrigés exercices langage C
Corrigés exercices langage Ccoursuniv
 
Chap 6 : classes et interfaces
Chap 6 : classes et interfacesChap 6 : classes et interfaces
Chap 6 : classes et interfacesAziz Darouichi
 
Python For Data Science - French Course
Python For Data Science - French CoursePython For Data Science - French Course
Python For Data Science - French CourseHaytam EL YOUSSFI
 
Chapitre4: Pointeurs et références
Chapitre4: Pointeurs et références Chapitre4: Pointeurs et références
Chapitre4: Pointeurs et références Aziz Darouichi
 

La actualidad más candente (20)

programmation orienté objet c++
programmation orienté objet c++programmation orienté objet c++
programmation orienté objet c++
 
Polymorphisme, interface et classe abstraite
Polymorphisme, interface et classe abstraitePolymorphisme, interface et classe abstraite
Polymorphisme, interface et classe abstraite
 
Chapitre 2: String en Java
Chapitre 2:  String en JavaChapitre 2:  String en Java
Chapitre 2: String en Java
 
Développement informatique : Algorithmique I : Récursion et arbre
Développement informatique : Algorithmique I : Récursion et arbreDéveloppement informatique : Algorithmique I : Récursion et arbre
Développement informatique : Algorithmique I : Récursion et arbre
 
Ch03
Ch03Ch03
Ch03
 
Chapitre 11: Expression Lambda et Référence de méthode en Java
Chapitre 11: Expression Lambda et Référence de méthode en JavaChapitre 11: Expression Lambda et Référence de méthode en Java
Chapitre 11: Expression Lambda et Référence de méthode en Java
 
Python avancé : Classe et objet
Python avancé : Classe et objetPython avancé : Classe et objet
Python avancé : Classe et objet
 
Développer en natif avec C++11
Développer en natif avec C++11Développer en natif avec C++11
Développer en natif avec C++11
 
Chap1: Cours en C++
Chap1: Cours en C++Chap1: Cours en C++
Chap1: Cours en C++
 
Memo java
Memo javaMemo java
Memo java
 
Chapitre 3 elements de base de java
Chapitre 3  elements de base de javaChapitre 3  elements de base de java
Chapitre 3 elements de base de java
 
Les fonctions lambdas en C++11 et C++14
Les fonctions lambdas en C++11 et C++14Les fonctions lambdas en C++11 et C++14
Les fonctions lambdas en C++11 et C++14
 
Corrigés exercices langage C
Corrigés exercices langage CCorrigés exercices langage C
Corrigés exercices langage C
 
Polymorphisme
PolymorphismePolymorphisme
Polymorphisme
 
Python avancé : Tuple et objet
Python avancé : Tuple et objetPython avancé : Tuple et objet
Python avancé : Tuple et objet
 
Chap 6 : classes et interfaces
Chap 6 : classes et interfacesChap 6 : classes et interfaces
Chap 6 : classes et interfaces
 
Chapitre 1 rappel
Chapitre 1   rappelChapitre 1   rappel
Chapitre 1 rappel
 
Python For Data Science - French Course
Python For Data Science - French CoursePython For Data Science - French Course
Python For Data Science - French Course
 
Composition, agrégation et immuabilité
Composition, agrégation et immuabilitéComposition, agrégation et immuabilité
Composition, agrégation et immuabilité
 
Chapitre4: Pointeurs et références
Chapitre4: Pointeurs et références Chapitre4: Pointeurs et références
Chapitre4: Pointeurs et références
 

Destacado

Destacado (20)

5 controle des couts au niveau des produits
5 controle des couts au niveau des produits5 controle des couts au niveau des produits
5 controle des couts au niveau des produits
 
Impressionnistes
ImpressionnistesImpressionnistes
Impressionnistes
 
Majorque île de golf
Majorque île de golfMajorque île de golf
Majorque île de golf
 
Pour les amateurs d'animaux
Pour les amateurs d'animaux Pour les amateurs d'animaux
Pour les amateurs d'animaux
 
Annecy
AnnecyAnnecy
Annecy
 
Programme randolus 2014
Programme randolus 2014Programme randolus 2014
Programme randolus 2014
 
Imposition des plus values des particuliers 19.02.14
Imposition des plus values des particuliers 19.02.14Imposition des plus values des particuliers 19.02.14
Imposition des plus values des particuliers 19.02.14
 
2 raccordements entre les systèmes
2 raccordements entre les systèmes2 raccordements entre les systèmes
2 raccordements entre les systèmes
 
ImáGenes De Cuba Guillermo
ImáGenes De Cuba   GuillermoImáGenes De Cuba   Guillermo
ImáGenes De Cuba Guillermo
 
Tener y retener
Tener y retenerTener y retener
Tener y retener
 
Livre blanc "Dématérialisation fiscale des factures"
Livre blanc "Dématérialisation fiscale des factures"Livre blanc "Dématérialisation fiscale des factures"
Livre blanc "Dématérialisation fiscale des factures"
 
Les bananes =_mg
Les bananes =_mgLes bananes =_mg
Les bananes =_mg
 
Cicatriz
CicatrizCicatriz
Cicatriz
 
Planeta Tierra
Planeta TierraPlaneta Tierra
Planeta Tierra
 
EDUCTOUR9 - Diapo S. Carion
EDUCTOUR9 - Diapo S. CarionEDUCTOUR9 - Diapo S. Carion
EDUCTOUR9 - Diapo S. Carion
 
Jesucristo
JesucristoJesucristo
Jesucristo
 
E L C A N A S T O D E C A R B O N
E L C A N A S T O D E C A R B O NE L C A N A S T O D E C A R B O N
E L C A N A S T O D E C A R B O N
 
Malaguea salerosa
Malaguea salerosaMalaguea salerosa
Malaguea salerosa
 
Bullet Time Effect
Bullet Time EffectBullet Time Effect
Bullet Time Effect
 
Arena Verde Hielo
Arena Verde HieloArena Verde Hielo
Arena Verde Hielo
 

Similar a Ch04

Chap 2--POO avec JAVA.pdf
Chap 2--POO avec JAVA.pdfChap 2--POO avec JAVA.pdf
Chap 2--POO avec JAVA.pdframadanmahdi
 
02 Spécificité du C++ COURS SYS SYSSSSSS
02 Spécificité du C++  COURS SYS SYSSSSSS02 Spécificité du C++  COURS SYS SYSSSSSS
02 Spécificité du C++ COURS SYS SYSSSSSSAyoubElmrabet6
 
Cours de C++ / Tronc commun deuxième année ISIMA
Cours de C++ / Tronc commun deuxième année ISIMACours de C++ / Tronc commun deuxième année ISIMA
Cours de C++ / Tronc commun deuxième année ISIMALoic Yon
 
IMPLEMENTATION EN PYTHON DES CONVENTIONS ALGORITHMIQUES (2022-2023)
IMPLEMENTATION EN PYTHON DES CONVENTIONS ALGORITHMIQUES  (2022-2023)IMPLEMENTATION EN PYTHON DES CONVENTIONS ALGORITHMIQUES  (2022-2023)
IMPLEMENTATION EN PYTHON DES CONVENTIONS ALGORITHMIQUES (2022-2023)Tunisie collège
 
Memojava 100604104941-phpapp02
Memojava 100604104941-phpapp02Memojava 100604104941-phpapp02
Memojava 100604104941-phpapp02Rahma Boufalgha
 
Cours C Avancé chapitre 2 et chapitre.pdf
Cours C Avancé  chapitre 2 et chapitre.pdfCours C Avancé  chapitre 2 et chapitre.pdf
Cours C Avancé chapitre 2 et chapitre.pdfc79024186
 
chapitre4-HeritageetPolymorphisme.pdf
chapitre4-HeritageetPolymorphisme.pdfchapitre4-HeritageetPolymorphisme.pdf
chapitre4-HeritageetPolymorphisme.pdfMoez Moezm
 
Boosted Java to Native Interface (JNI)
Boosted Java to Native Interface (JNI)Boosted Java to Native Interface (JNI)
Boosted Java to Native Interface (JNI)Innobec
 
System c eniso_jan_fev_07
System c eniso_jan_fev_07System c eniso_jan_fev_07
System c eniso_jan_fev_07haythem_2015
 

Similar a Ch04 (20)

POO-chapitre3.pptx
POO-chapitre3.pptxPOO-chapitre3.pptx
POO-chapitre3.pptx
 
Ch06
Ch06Ch06
Ch06
 
Chap 2--POO avec JAVA.pdf
Chap 2--POO avec JAVA.pdfChap 2--POO avec JAVA.pdf
Chap 2--POO avec JAVA.pdf
 
POO-chapitre2.pptx
POO-chapitre2.pptxPOO-chapitre2.pptx
POO-chapitre2.pptx
 
Ch08
Ch08Ch08
Ch08
 
Ch10
Ch10Ch10
Ch10
 
02 Spécificité du C++ COURS SYS SYSSSSSS
02 Spécificité du C++  COURS SYS SYSSSSSS02 Spécificité du C++  COURS SYS SYSSSSSS
02 Spécificité du C++ COURS SYS SYSSSSSS
 
Cours de C++ / Tronc commun deuxième année ISIMA
Cours de C++ / Tronc commun deuxième année ISIMACours de C++ / Tronc commun deuxième année ISIMA
Cours de C++ / Tronc commun deuxième année ISIMA
 
Ch09
Ch09Ch09
Ch09
 
C++ 11/14
C++ 11/14C++ 11/14
C++ 11/14
 
Ch07
Ch07Ch07
Ch07
 
Change mind about JS
Change mind about JSChange mind about JS
Change mind about JS
 
IMPLEMENTATION EN PYTHON DES CONVENTIONS ALGORITHMIQUES (2022-2023)
IMPLEMENTATION EN PYTHON DES CONVENTIONS ALGORITHMIQUES  (2022-2023)IMPLEMENTATION EN PYTHON DES CONVENTIONS ALGORITHMIQUES  (2022-2023)
IMPLEMENTATION EN PYTHON DES CONVENTIONS ALGORITHMIQUES (2022-2023)
 
Memojava 100604104941-phpapp02
Memojava 100604104941-phpapp02Memojava 100604104941-phpapp02
Memojava 100604104941-phpapp02
 
Part1
Part1Part1
Part1
 
Cours C Avancé chapitre 2 et chapitre.pdf
Cours C Avancé  chapitre 2 et chapitre.pdfCours C Avancé  chapitre 2 et chapitre.pdf
Cours C Avancé chapitre 2 et chapitre.pdf
 
POO-chapitre6.pptx
POO-chapitre6.pptxPOO-chapitre6.pptx
POO-chapitre6.pptx
 
chapitre4-HeritageetPolymorphisme.pdf
chapitre4-HeritageetPolymorphisme.pdfchapitre4-HeritageetPolymorphisme.pdf
chapitre4-HeritageetPolymorphisme.pdf
 
Boosted Java to Native Interface (JNI)
Boosted Java to Native Interface (JNI)Boosted Java to Native Interface (JNI)
Boosted Java to Native Interface (JNI)
 
System c eniso_jan_fev_07
System c eniso_jan_fev_07System c eniso_jan_fev_07
System c eniso_jan_fev_07
 

Más de yarsenv47

Más de yarsenv47 (10)

Js cours
 Js cours Js cours
Js cours
 
Algevre de bool
Algevre de boolAlgevre de bool
Algevre de bool
 
Numeration et codage_de_linfo
Numeration et codage_de_linfoNumeration et codage_de_linfo
Numeration et codage_de_linfo
 
S3 cours architectureord
S3 cours architectureordS3 cours architectureord
S3 cours architectureord
 
Ch13
Ch13Ch13
Ch13
 
Ch12
Ch12Ch12
Ch12
 
Ch11
Ch11Ch11
Ch11
 
Ch05
Ch05Ch05
Ch05
 
Ch02
Ch02Ch02
Ch02
 
Language C++ Ch01
Language C++ Ch01 Language C++ Ch01
Language C++ Ch01
 

Ch04

  • 1. Chapitre IV Les propriétés des fonctions membres Toutes les possibilités offertes par C++ pour les fonctions restent valables pour les fonctions membres (surcharge, arguments par défaut, …) Exemple 4.1 On désir munir la classe point d'un constructeur qui permet de créer le point : : (EXP04_01.CPP) • (0,0) si aucun argument n'est fourni • (abs,0) si on lui fournit abs comme seul argument • (abs,ord) si on lui fournit les deux arguments abs et ord Pour cela, il suffit de définir le constructeur de la classe avec des paramètres par défaut class point { int x; int y; public: point(int = 0, int = 0); … … } point::point(int abs, int ord){ x = abs; y = ord; }
  • 2. Les propriétés des fonctions membres 28 Exemple 4.2 On désire maintenant que le constructeur de la classe point crée le point : (EXP04_02.CPP) • (abs,abs) si on lui fournit un seul argument (abs) Dans ce cas, on ne peut pas utiliser des valeurs par défaut, il faut par suite surcharger le constructeur : class point { int x; int y; public: point(); point(int); point(int,int); … … } point::point() { x = 0; y = 0;} point::point(int abs) {x = abs; y = abs;} point::point(int abs, int ord){ x = abs; y = ord;} IV.1 Objets transmis en argument • Considérons une classe T et une fonction F dont l'un des paramètres est un objet de T transmis par valeur, par adresse ou par référence. Soit U une instance de T transmis en argument à F, alors: 1. Si F est une fonction membre de T, elle aura accès à tous les membres données de U, sinon elle n'aura accès qu'aux membres publiques de U 2. Si la transmission de U se fait par valeur, il y a recopie des membres données de U dans un emplacement locale à F, ce qui entraîne certaines problèmes si la classe contient des pointeurs Exemple 4.3 Définir une fonction qui permet de comparer deux instances de la classe point. Cette fonction devra retourner "true" si les deux objets coïncident et "false" sinon. : (EXP04_03.CPP) La comparaison nécessite l'accès aux coordonnées des points, qui sont des données privés, par suite, la fonction doit être une fonction membre de la classe La déclaration de la fonction dans la classe sera : bool coincide(point) et sa définition bool point::coincide(point pt) { return ( (pt.x == x) && (pt.y == y)); } • On peut prévoir pour cette fonction une transmission par adresse ou par référence.
  • 3. Les propriétés des fonctions membres 29 IV.2 Objets fournis en valeur de retour • Etant donné une classe T et une fonction F qui a l'une des formes suivantes : T F(arguments); // retour par valeur T * F(arguments); // retourne l'adresse T & F(arguments) // retourne une référence Alors F aura accès à tous les membres de l'objet retourné si elle est une fonction membre de T, si non elle n'aura accès qu'aux membres publics de la classe. Exemple 4.4 On désire définir la fonction symetrique() qui permet de retourner le symétrique d'un point. : (EXP04_04.CPP) Cette fonction doit être une fonction membre de la classe point, puisqu'elle doit accéder aux coordonnées du point, qui sont des données privées. La valeur de retour sera de type point La déclaration de la fonction dans la classe sera : point symetrique(); et sa définition point point::symetrique(){ point pt; pt.x = -x; pt.y = -y; return pt; } IV.3 Le pointeur this • Dans une fonction membre, this représente un pointeur sur l'instance ayant appelé cette fonction • this est un pointeur constant, c'est-à-dire qu'on ne peut le modifier. Exemple 4.5 class point { : (EXP04_05.CPP) int x; int y; public: point(int=0, int=0); void affiche(); }; point::point(int abs, int ord) { x = abs; y = ord;} void point point::affiche() { cout << " le point : (" << this->x << "," << this->y << ")" ; cout << " est à l'adresse " << this << endl; } la fonction membre affiche() de la classe point affiche les coordonnées de l'objet et de son adresse. IV.4 Fonctions membres en ligne • Toute fonction membre définie dans sa classe (dans la déclaration de la classe) est considérée par le compilateur comme une fonction inline. Le mot clé inline n'est plus utilisé.
  • 4. Les propriétés des fonctions membres 30 Dans l'exemple suivant, le constructeur de la classe point est défini en ligne class point { int x; int y; public: point(int abs = 0, int ord =0){ x = abs; y = ord;} void affiche(); }; IV.5 Fonctions membres statiques • On distingue deux types de membres : ♦ Membres d'instance : membres associés à une instance de la classe. ♦ Membres de classe : membres associés à la classe et qui ne dépendent d'aucune instance de la classe. • Les membres de classe, sont aussi dits membres statiques. Ils sont déclarés avec l'attribut static, et existent même si aucun objet de la classe n'est crée. • Ainsi on peut définir un membre donnée statique comme on peut définir une fonction membre statique. L'accès à ces membres se fait avec l'opérateur de résolution de portée (::) précédé par le nom de la classe ou d'un quelconque objet de la classe Exemple 4.6 Dans cet exemple, on prévoit dans la classe point un membre donnée statique privé nb_obj et une fonction membre NbObj() qui retourne le nombre d'instances crées. : Interface: (POINT2.H) #ifndef POINT_H #define POINT_H class point{ int x; int y; static int nb_obj; public: point(int = 0, int = 0); ~point(); void affiche(); static int NbObj(); }; #endif Corps de la classe: (POINT2.CPP) #include "point2.h" #include <iostream> // utilisé dans affiche() using namespace std; //--- definition obligatoire du membre donnée statique int point::nb_obj; //--- constructeur point::point(int abs, int ord){ x = abs; y = ord; nb_obj++; } //--- Destructeur point::~point(){
  • 5. Les propriétés des fonctions membres 31 nb_obj--; } //--- affiche void point::affiche(){ cout << "(" << x << "," << y << ")" << endl; } //--- definition de la fonction membre statique int point::NbObj(){ return nb_obj; } Programme test: (EXP04_06.CPP) #include "point.h" #include <iostream> using namespace std; int main() { / Acces à la fonction membre statique avant la création des objets cout << "Nombre de points : " << point::NbObj() << endl; // Appel de la fct membre statique en utilisant un objet point a; cout << "Nombre de points : " << a.NbObj() << endl; return 0; } IV.6 Les fonctions membres constantes • Les objets, comme les autres types de C++, peuvent être déclarés constants avec l'attribut const. Dans ce cas, seules les fonctions membres déclarées et définies avec l'attribut const peuvent être appelées par des objets constants. Plus précisément : class T { … … public: … type_a F(…); // fct membre ordinaire type_b G(…) const; // fct membre constante type_c K(const T); // fct avec argument constant }; // déclarations T u; // instante non constante const T v; // instante constante // appels u.F(…) // OK v.F(…) // erreur : instance constante u.G(…) // OK v.G(…) // OK // T w; u.K(v) // OK u.K(w) // OK v.K(w) // erreur : instance constante et fct non constante v est une instance constante, donc elle ne peut être appelée ni par F ni par K, qui ne sont pas des fonctions constantes
  • 6. Les propriétés des fonctions membres 32 Exemple 4.7 Cet exemple montre la différence entre les variables simples et les objets lors de passage en arguments à des fonctions demandant des arguments constants et la différence d'une fonction membre et une fonction non membre agissant sur des objets constants. : (EXP04_07.CPP) #include <iostream> using namespace std; //----------------------------------------------------------------- class point{ int x; int y; public: point(int abs = 0, int ord = 0){ x = abs; y = ord; } void affiche() const; // fct membre constante bool coincide(const point); // argument constant void deplace(int,int); }; void point::affiche() const{ cout << "(" << x << "," << y << ")" << endl; } bool point::coincide(const point pt){ return ( (pt.x == x) && (pt.y == y) ); } void point::deplace(int dx, int dy){ x =+ dx; y =+ dy; } //----------------------------------------------------------------- // fonction avec argument constant de type simple void fct(const int k) { cout << k << endl; } // fonction avec argument constant de type classe point sosie(const point pt) { return pt; } //----------------------------- TEST int main() { // Cas d'une fonction simple avec argument de type simple int i = 5; const int j = 10; fct(i); // OK fct(j); // OK // ----------------------Cas des objets point a; const point b(5,6); //-----Appel d'une fonction non membre point c; c = sosie(a); // OK c = sosie(b); // OK //-----Appel d'une fonction membre non constante a.deplace(1,1); //b.deplace(1,1); // erreur : instance constante, fonction non constante //-----Appel de la fonction membre constante cout << "a = " ; a.affiche();
  • 7. Les propriétés des fonctions membres 33 cout << "b = " ; b.affiche(); cout << endl; //-----Appel de la fonction membre non constante avec paramètres constants // instance non constant, argument constant cout << ( a.coincide(b) ? "coincident" : "ne coincident pas" )<< endl; // instance non constante, argument non constant cout << ( a.coincide(a) ? "coincident" : "ne coincident pas" )<< endl; // instance constante, fonction non constante : ERREUR //cout << ( b.coincide(a) ? "coincident" : "ne coincident pas" )<< endl; return 0; }
  • 8. Les propriétés des fonctions membres 34