Fonctions et classes amies en C++ - friend

26 Sep 2019 26 Sep 2019 20000 vues ESSADDOUKI Mostafa 3 min de lecture
Introduction et syntaxe de base
1 Introduction au langage C++ 2 Entrée-sortie en C++ - cin et cout 3 Inférence de type avec le mot-clé auto en C++ 4 Classe std::string et les chaînes de caractères en C++ 5 Les structures conditionnelles (if et switch) en C++ (C++17 et C++20) 6 Les boucles en C++ (C++17 et C++20) 7 La gestion des fichiers en C++
Pointeurs et fonctions
8 Introduction aux pointeurs en C++ - Déclaration et interêts 9 Les références en C++ - déclaration et interêts 10 Les tableaux en C++ - Déclaration et interêts 11 Introduction aux fonctions en C++ 12 Passer des arguments à une fonction en C++ 13 Déclarer un paramètre const en C++ 14 Les fonctions Lambda en C++ 15 Fonctions utiles (Mathématiques et caractères) en C++
Programmation OO
16 Classes et objets en C++ 17 Spécificateurs d'accès en C++ 18 Constructeurs et destructeur d'une classe en C++ 19 Fonctions membres en C++ 20 Membres statiques d'une classe en C++ 21 Fonctions en ligne en C++ - inline 22 Fonctions et classes amies en C++ - friend 23 Surcharge des fonctions en C++ 24 Surcharge des opérateurs en C++ 25 Héritage en C++ 26 La gestion d'exceptions en C++ : déclaration, utilisation et personnalisation 27 fonctions et classes templates en C++ 28 Les nouveautés C++20 pour améliorer les templates en C++
Structures de données
29 Introduction aux structures de données 30 Les structures en C++ et la différence avec les structures en C 31 Les listes chaînées en C++ 32 Les piles en C++ 33 File d'attente en C++ 34 Arbre binaire de recherche : définition et mise en oeuvre en C++
La bibliothèque standard (STL)
35 Introduction à la bibliothèque de Template Standard STL 36 Les itérateurs en C++ - définition, déclaration et exemples 37 La classe array en C++ (bibliothèque STL) <array> 38 La classe vector de la bibliothèque STL <vector> 39 La classe deque en C++ ( Bibliothèque STL) 40 La classe list en C++ (bibliothèque STL) <list> 41 La classe stack (Pile) en C++ (bibliothèque STL) <stack> 42 La classe queue (File d'attente) en C++ (bibliothèque STL) <queue> 43 La file d'attente prioritaire (classe priority_queue) - Bibliothèque STL 44 Les ensembles en C++ (Classe set <set> - Bibliothèque STL) 45 Les dictionnaires en C++ : Classe map (Bibliothèque STL) 46 Introduction aux algorithmes de la bibliothèque STL (programmation compétitive) 47 Tri et méthodes associées en C++ - Bibliothèque STL 48 Recherche dichotomique et méthodes associées en C++ - Bibliothèque STL 49 Appliquer un prédicat ou une fonction aux éléments d'une séquence en C++ - Bibliothèque STL 50 Recherche dans une séquence et méthodes associées en C++ - Bibliothèque STL

L'un des concepts importants de la POO est la dissimulation de données : une fonction non membre ne peut pas accéder aux données privées ou protégées d'un objet. Mais parfois, cette restriction force le programmeur à écrire des codes longs et complexes.

En C++, le mécanisme friend permet d'accorder un accès privilégié à des fonctions ou classes extérieures, sans rompre l'encapsulation globale.

Fonction amie

Fonction amie

Une fonction amie est définie en dehors de la portée d'une classe, mais elle a le droit d'accéder à tous ses membres privés et protégés. Elle est déclarée dans la classe avec le mot-clé friend.

   
Syntaxe C++
class nomClasse {
    ...
    friend type_retour nomFonction(liste des paramètres);
    ...
};

type_retour nomFonction(liste des paramètres) {
    // Accès aux membres privés/protégés de nomClasse autorisé ici
}

  Exemple n°1 — Fonction amie simple

#include <iostream>
using namespace std;

class Voiture {
private:
    int Id;
    double Vitesse;
public:
    Voiture();
    friend void rouler(Voiture, double);
};

Voiture::Voiture() {
    Id = 1;
    Vitesse = 240;
}

void rouler(Voiture v, double vitesse) {
    v.Vitesse += vitesse;
    cout << "la vitesse de v est " << v.Vitesse << endl;
}

int main() {
    Voiture v1;
    rouler(v1, 24);
    return 0;
}
Sortie
la vitesse de v est 264

  Exemple n°2 — Fonction amie partagée entre deux classes

Une utilisation plus significative consiste à opérer sur des objets de deux classes différentes. Ici, la fonction addition est amie des deux classes A et B.

Déclaration anticipée

Lorsque la classe A référence la classe B dans une déclaration friend, la classe B doit avoir été déclarée à l'avance (forward declaration) avant la définition de A.

#include <iostream>
using namespace std;

class B; // déclaration anticipée de B

class A {
private:
    int nombre;
public:
    A(int n) : nombre(n) {}
    friend void addition(A, B);
};

class B {
private:
    int val;
public:
    B(int n) : val(n) {}
    friend void addition(A, B);
};

void addition(A a, B b) {
    int res = a.nombre + b.val;
    cout << "le résultat est " << res << endl;
}

int main() {
    A a(24);
    B b(10);
    addition(a, b);
    return 0;
}
Sortie
le résultat est 34

Classe amie

Classe amie

Une classe amie est une classe dont toutes les fonctions membres ont accès aux membres privés et protégés de la classe qui la déclare amie. On utilise le mot-clé friend class.

class B;
class A {
    ...
    friend class B;
};
class B {
    // toutes les méthodes de B peuvent accéder aux membres privés de A
};

Points importants à retenir

PropriétéComportement
RéciprocitéL'amitié n'est pas réciproque : si A est amie de B, B n'est pas automatiquement amie de A
HéritageL'amitié n'est pas héritée : une sous-classe ne reçoit pas les droits d'amitié de sa classe parent
UsageÀ utiliser avec parcimonie : trop de fonctions amies affaiblit l'encapsulation

Discussion (0)

Soyez le premier à laisser un commentaire !

Laisser un commentaire

Votre commentaire sera visible après modération.