Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Industrial programming >> C Sprache

C++ Friend-Funktionen und Friend-Klassen: Zugriffskontrolle meistern

C++ Friend-Funktionen und Friend-Klassen: Zugriffskontrolle meistern

Dieses Tutorial demonstriert, wie man Friend-Funktionen und Friend-Klassen in C++ deklariert und verwendet, komplett mit klaren Beispielen.

Datenverbergung ist ein Eckpfeiler der objektorientierten Programmierung und verhindert, dass externer Code direkt auf die privaten Mitglieder einer Klasse zugreift. Protected-Mitglieder sind nur für abgeleitete Klassen sichtbar und bleiben für die Außenwelt unzugänglich.

Betrachten Sie das folgende Beispiel:

class MyClass { private: int member1; }; int main() { MyClass obj; // Fehler! Kann nicht von hier aus auf private Mitglieder zugreifen. obj.member1 = 5; }

Trotz dieser Einschränkung bietet C++ einen Mechanismus namens Friend-Funktionen, der die übliche Zugriffskontrolle umgehen und auf die privaten und geschützten Daten einer Klasse operieren kann.

Eine Friend-Klasse ist ein ähnliches Konzept, das einer gesamten Klasse erlaubt, als Friend zu agieren. Beide Features sind mächtige Werkzeuge, wenn sie umsichtig eingesetzt werden, und erhöhen die Kapselung, ohne die Flexibilität zu beeinträchtigen.


Friend-Funktion in C++

Eine Friend-Funktion kann die privaten und geschützten Mitglieder einer Klasse lesen und modifizieren. Sie wird mit dem friend-Schlüsselwort innerhalb der Klassendefinition deklariert.

class ClassName { // ... friend returnType functionName(arguments); // ... }

Beispiel 1: Grundlegende Friend-Funktion

// C++ Programm zur Demonstration der Funktionsweise von Friend-Funktionen #include <iostream> using namespace std; class Distance { private: int meter; // Friend-Funktion friend int addFive(Distance); public: Distance() : meter(0) {} }; // Friend-Funktionsdefinition int addFive(Distance d) { // Zugriff auf private Mitglieder aus der Friend-Funktion d.meter += 5; return d.meter; } int main() { Distance D; cout << "Distanz: " << addFive(D); return 0; }

Ausgabe

Distanz: 5

Die Funktion addFive() demonstriert, dass eine Friend-Funktion frei auf das private meter-Feld zugreifen kann. Obwohl dieses Beispiel einfach ist, veranschaulicht es die Kernidee von Friend-Funktionen.


Beispiel 2: Operation auf zwei Klassen

// Mitglieder zweier verschiedener Klassen mit Friend-Funktionen addieren #include <iostream> using namespace std; // Vorwärtsdeklaration class ClassB; class ClassA { public: // Konstruktor zur Initialisierung von numA auf 12 ClassA() : numA(12) {} private: int numA; // Friend-Funktionsdeklaration friend int add(ClassA, ClassB); }; class ClassB { public: // Konstruktor zur Initialisierung von numB auf 1 ClassB() : numB(1) {} private: int numB; // Friend-Funktionsdeklaration friend int add(ClassA, ClassB); }; // Zugriff auf Mitglieder beider Klassen int add(ClassA objectA, ClassB objectB) { return (objectA.numA + objectB.numB); } int main() { ClassA objectA; ClassB objectB; cout << "Summe: " << add(objectA, objectB); return 0; }

Ausgabe

Summe: 13

In diesem Programm deklarieren sowohl ClassA als auch ClassB die Funktion add() als Friend. Dies gewährt der Funktion Zugriff auf die privaten Daten beider Klassen, was die Summe von numA und numB ermöglicht.

Beachten Sie, dass die Friend-Deklaration in ClassA ClassB referenziert, bevor es definiert ist. Eine Vorwärtsdeklaration class ClassB; löst diese Abhängigkeit.


Friend-Klasse in C++

Die Deklaration einer gesamten Klasse als Friend gibt all ihren Mitgliedsfunktionen Zugriff auf die privaten und geschützten Mitglieder der Host-Klasse. Die Syntax ist unkompliziert:

class ClassB; class ClassA { // ClassB ist eine Friend-Klasse von ClassA friend class ClassB; // ... } class ClassB { // ... }

Da ClassB ein Friend von ClassA ist, kann jede Methode innerhalb von ClassB frei ClassA's private Daten lesen oder modifizieren. Das Gegenteil gilt nicht; ClassA kann nicht auf ClassB's private Mitglieder zugreifen, es sei denn, es deklariert ClassB als Friend.


Beispiel 3: Friend-Klasse in Aktion

// C++ Programm zur Demonstration der Funktionsweise von Friend-Klassen #include <iostream> using namespace std; // Vorwärtsdeklaration class ClassB; class ClassA { private: int numA; // Friend-Klassen-Deklaration friend class ClassB; public: // Konstruktor zur Initialisierung von numA auf 12 ClassA() : numA(12) {} }; class ClassB { private: int numB; public: // Konstruktor zur Initialisierung von numB auf 1 ClassB() : numB(1) {} // Mitgliedsfunktion zum Addieren von numA aus ClassA und numB aus ClassB int add() { ClassA objectA; return objectA.numA + numB; } }; int main() { ClassB objectB; cout << "Summe: " << objectB.add(); return 0; }

Ausgabe

Summe: 13

Die add() Methode in ClassB kann auf ClassA's privates Mitglied numA zugreifen, da ClassA ClassB als Friend deklariert hat. Dieses Beispiel zeigt, wie Friend-Klassen enge Kooperation ermöglichen, während die Kapselung gewahrt bleibt.

Insgesamt sind Friend-Funktionen und Friend-Klassen wertvolle Werkzeuge in C++, wenn Sie kontrollierten Zugriff über Klassengrenzen hinweg benötigen. Verwenden Sie sie sparsam und nur, wenn das Design von solchen Ausnahmen zu den üblichen Zugriffsregeln profitiert.


C Sprache

  1. C# Klassen & Objekte: Fundamente für robustes OOP
  2. C# Abstrakte Klassen & Methoden meistern: Praktischer Leitfaden
  3. C# Partielle Klassen und Methoden verstehen
  4. Versiegelte Klassen und Methoden in C# meistern
  5. C++ Klassen & Objekte: Praktischer Leitfaden zur objektorientierten Programmierung
  6. C++ Struct vs. Class: Wichtige Unterschiede, Syntax und beste Anwendungsfälle
  7. Java meistern: Objekte, Klassen und Kern-OOP-Konzepte verstehen
  8. C++ Speicherklassen: Scope, Lifetime & Verwendung
  9. C++ Datum & Zeit: Umfassender Leitfaden
  10. C++ Overloading: Funktionen & Operatoren erklärt