Maison  >  Article  >  développement back-end  >  Comment le mécanisme ami des fonctions C++ brise-t-il l’encapsulation ?

Comment le mécanisme ami des fonctions C++ brise-t-il l’encapsulation ?

WBOY
WBOYoriginal
2024-04-11 15:51:01882parcourir

En C++, le mécanisme ami rompt l'encapsulation et permet aux fonctions ou classes d'accéder aux membres privés d'autres classes. En utilisant le mot-clé ami, vous pouvez déclarer une fonction comme amie d'une classe, vous permettant d'accéder à ses données et méthodes privées. Le mécanisme ami est souvent utilisé pour résoudre les dépendances cycliques entre les classes, par exemple en permettant aux constructeurs de devenir amis les uns des autres et d'accéder aux objets d'initialisation des membres privés des uns et des autres. Il convient de noter que le mécanisme ami réduira l'encapsulation, il doit donc être utilisé avec prudence et seules les fonctions ou classes réellement nécessaires sont désignées comme amis.

C++ 函数的友元机制如何打破封装性?

Mécanisme ami de la fonction C++ : un outil puissant pour rompre l'encapsulation

Introduction

Le mécanisme ami est un mécanisme en C++ qui rompt l'encapsulation. Il permet à une fonction ou à une classe d'accéder à d'autres classes ou membres privés. de la fonction. Ceci est utile dans certaines situations, par exemple lorsqu'il s'agit de dépendances circulaires entre classes ou lorsque vous devez accéder à des membres spécifiques d'autres classes.

Usage

Pour déclarer une fonction comme ami d'une classe, vous pouvez utiliser le mot-clé friend. Par exemple :

class MyClass {
private:
    int private_member;
public:
    friend void myFriendFunction(MyClass& obj);
};

void myFriendFunction(MyClass& obj) {
    // 可以访问 MyClass 类的私有成员 private_member
    std::cout << obj.private_member << std::endl;
}

Cas pratique : Dépendances circulaires

Considérons l'exemple suivant, où deux classes dépendent l'une de l'autre :

class A {
private:
    std::vector<B*> b_objects;
};

class B {
private:
    A* a_object;
};

Si les dépendances circulaires ne sont pas autorisées, les deux classes ne peuvent pas être initialisées car les membres privés du les classes se réfèrent les unes aux autres. Le mécanisme ami peut résoudre ce problème en faisant du constructeur de la classe un ami de l'autre partie, permettant ainsi l'accès aux membres privés de l'autre partie.

class A {
private:
    std::vector<B*> b_objects;
    friend class B; // 允许 B 类访问 A 的私有成员
};

class B {
private:
    A* a_object;
    friend class A; // 允许 A 类访问 B 的私有成员
};

Remarque :

  • Le mécanisme ami est un mécanisme qui brise l'encapsulation, il doit donc être utilisé avec prudence.
  • Les fonctions Friends peuvent accéder à tous les membres privés de la classe spécifiée, y compris les données et les méthodes.
  • Lors de la définition des amis, assurez-vous que seules les fonctions ou classes réellement nécessaires sont désignées comme amis.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn