Maison développement back-end C++ 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 ?

Apr 11, 2024 pm 03:51 PM
c++ 封装性 Mécanisme ami fonctionnel

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;
}
Copier après la connexion

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;
};
Copier après la connexion

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 的私有成员
};
Copier après la connexion

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 de ce site Web
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

Article chaud

Repo: Comment relancer ses coéquipiers
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD
R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
1 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Article chaud

Repo: Comment relancer ses coéquipiers
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD
R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
1 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Tags d'article chaud

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Conception sécurisée de structures de données en programmation simultanée C++ ? Conception sécurisée de structures de données en programmation simultanée C++ ? Jun 05, 2024 am 11:00 AM

Conception sécurisée de structures de données en programmation simultanée C++ ?

La disposition des objets C++ est alignée sur la mémoire pour optimiser l'efficacité de l'utilisation de la mémoire La disposition des objets C++ est alignée sur la mémoire pour optimiser l'efficacité de l'utilisation de la mémoire Jun 05, 2024 pm 01:02 PM

La disposition des objets C++ est alignée sur la mémoire pour optimiser l'efficacité de l'utilisation de la mémoire

Comment implémenter un comparateur personnalisé en C++ STL ? Comment implémenter un comparateur personnalisé en C++ STL ? Jun 05, 2024 am 11:50 AM

Comment implémenter un comparateur personnalisé en C++ STL ?

Comment implémenter le Strategy Design Pattern en C++ ? Comment implémenter le Strategy Design Pattern en C++ ? Jun 06, 2024 pm 04:16 PM

Comment implémenter le Strategy Design Pattern en C++ ?

Similitudes et différences entre Golang et C++ Similitudes et différences entre Golang et C++ Jun 05, 2024 pm 06:12 PM

Similitudes et différences entre Golang et C++

Comment copier un conteneur STL C++ ? Comment copier un conteneur STL C++ ? Jun 05, 2024 am 11:51 AM

Comment copier un conteneur STL C++ ?

Quels sont les principes d'implémentation sous-jacents des pointeurs intelligents C++ ? Quels sont les principes d'implémentation sous-jacents des pointeurs intelligents C++ ? Jun 05, 2024 pm 01:17 PM

Quels sont les principes d'implémentation sous-jacents des pointeurs intelligents C++ ?

Comment implémenter une programmation multithread C++ basée sur le modèle Actor ? Comment implémenter une programmation multithread C++ basée sur le modèle Actor ? Jun 05, 2024 am 11:49 AM

Comment implémenter une programmation multithread C++ basée sur le modèle Actor ?

See all articles