Funções e classes de amigo C ++ (com exemplos)

Neste tutorial, aprenderemos a criar funções e classes de amigo em C ++ com a ajuda de exemplos.

A ocultação de dados é um conceito fundamental da programação orientada a objetos. Ele restringe o acesso de membros privados de fora da classe.

Da mesma forma, membros protegidos só podem ser acessados ​​por classes derivadas e são inacessíveis de fora. Por exemplo,

 class MyClass ( private: int member1; ) int main() ( MyClass obj; // Error! Cannot access private members from here. obj.member1 = 5; )

No entanto, há um recurso em C ++ chamado funções de amigo que quebra essa regra e nos permite acessar funções de membro de fora da classe.

Da mesma forma, também existe uma classe de amigo , que aprenderemos mais tarde neste tutorial.

Função amigo em C ++

Uma função de amigo pode acessar os dados privados e protegidos de uma classe. Declaramos uma função de amigo usando a friendpalavra - chave dentro do corpo da classe.

 class className (… friend returnType functionName(arguments);… )

Exemplo 1: Trabalho de função de amigo

 // C++ program to demonstrate the working of friend function #include using namespace std; class Distance ( private: int meter; // friend function friend int addFive(Distance); public: Distance() : meter(0) () ); // friend function definition int addFive(Distance d) ( //accessing private members from the friend function d.meter += 5; return d.meter; ) int main() ( Distance D; cout << "Distance: " << addFive(D); return 0; )

Resultado

 Distância: 5

Aqui, addFive()está uma função de amigo que pode acessar membros de dados privados e públicos .

Embora este exemplo nos dê uma ideia sobre o conceito de função de amigo, ele não mostra nenhum uso significativo.

Um uso mais significativo seria operar em objetos de duas classes diferentes. É quando a função de amigo pode ser muito útil.

Exemplo 2: adicionar membros de duas classes diferentes

 // Add members of two different classes using friend functions #include using namespace std; // forward declaration class ClassB; class ClassA ( public: // constructor to initialize numA to 12 ClassA() : numA(12) () private: int numA; // friend function declaration friend int add(ClassA, ClassB); ); class ClassB ( public: // constructor to initialize numB to 1 ClassB() : numB(1) () private: int numB; // friend function declaration friend int add(ClassA, ClassB); ); // access members of both classes int add(ClassA objectA, ClassB objectB) ( return (objectA.numA + objectB.numB); ) int main() ( ClassA objectA; ClassB objectB; cout << "Sum: " << add(objectA, objectB); return 0; )

Resultado

 Soma: 13

Neste programa, ClassAe ClassBdeclarou add()a função de amigo. Assim, esta função pode acessar dados privados de ambas as classes.

Uma coisa a se notar aqui é que a função friend interna ClassAestá usando o ClassB. No entanto, não definimos ClassBneste ponto.

 // inside classA friend int add(ClassA, ClassB);

Para que isso funcione, precisamos de uma declaração de encaminhamento ClassBem nosso programa.

 // forward declaration class ClassB;

Classe amigo em C ++

Também podemos usar uma classe amiga em C ++ usando a friendpalavra - chave. Por exemplo,

 class ClassB; class ClassA ( // ClassB is a friend class of ClassA friend class ClassB;… ) class ClassB (… )

Quando uma classe é declarada classe amiga, todas as funções-membro da classe amiga tornam-se funções amiga.

Como classBé uma classe amiga, podemos acessar todos os membros de classAdentro classB.

No entanto, não podemos acessar membros de ClassBde dentro classA. É porque a relação de amizade em C ++ é apenas concedida, não aceita.

Exemplo 3: Classe C ++ friend

 // C++ program to demonstrate the working of friend class #include using namespace std; // forward declaration class ClassB; class ClassA ( private: int numA; // friend class declaration friend class ClassB; public: // constructor to initialize numA to 12 ClassA() : numA(12) () ); class ClassB ( private: int numB; public: // constructor to initialize numB to 1 ClassB() : numB(1) () // member function to add numA // from ClassA and numB from ClassB int add() ( ClassA objectA; return objectA.numA + numB; ) ); int main() ( ClassB objectB; cout << "Sum: " << objectB.add(); return 0; )

Resultado

 Soma: 13

Aqui, ClassBé um amigo da classe ClassA. Portanto, ClassBtem acesso aos membros de classA.

Em ClassB, criamos uma função add()que retorna a soma de numA e numB.

Como ClassBé uma classe amiga, podemos criar objetos de ClassAdentro de ClassB.

Artigos interessantes...