Função de amigo C++ e classes de amigo
Função de amigo C++ e classes de amigo
Neste tutorial, aprenderemos a criar funções de amigos e classes de amigos 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 quebram essa regra e nos permitem acessar funções-membro de fora da classe.
Da mesma forma, há uma classe de amigos também, que aprenderemos mais tarde neste tutorial.
Função de amigo em C++
Uma função de amigo pode acessar o privado e protegido dados de uma classe. Declaramos uma função de amigo usando o
friend
palavra-chave dentro do corpo da classe.
class className {
... .. ...
friend returnType functionName(arguments);
... .. ...
}
Exemplo 1:Funcionamento da função amigo
// C++ program to demonstrate the working of friend function
#include <iostream>
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;
}
Saída
Distance: 5
Aqui,
addFive()
é uma função de amigo que pode acessar tanto privado e público membros de dados. Embora este exemplo nos dê uma ideia sobre o conceito de uma função de amigo, ele não mostra nenhum uso significativo.
Um uso mais significativo seria operar em objetos de duas classes diferentes. É aí que 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 <iostream>
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;
}
Saída
Sum: 13
Neste programa,
ClassA
e ClassB
declararam add()
como uma função de amigo. Assim, esta função pode acessar privado dados de ambas as classes. Uma coisa a notar aqui é a função de amigo dentro de
ClassA
está usando o ClassB
. No entanto, não definimos ClassB
neste ponto.
// inside classA
friend int add(ClassA, ClassB);
Para que isso funcione, precisamos de uma declaração de encaminhamento de
ClassB
em nosso programa.
// forward declaration
class ClassB;
classe de amigo em C++
Também podemos usar uma classe de amigo em C++ usando o
friend
palavra-chave. Por exemplo,
class ClassB;
class ClassA {
// ClassB is a friend class of ClassA
friend class ClassB;
... .. ...
}
class ClassB {
... .. ...
}
Quando uma classe é declarada como classe amiga, todas as funções-membro da classe amiga tornam-se funções amigas.
Desde
ClassB
é uma classe de amigos, podemos acessar todos os membros de ClassA
de dentro de ClassB
. No entanto, não podemos acessar membros de
ClassB
de dentro de ClassA
. É porque a relação de amigo em C++ é apenas concedida, não tomada. Exemplo 3:classe de amigo C++
// C++ program to demonstrate the working of friend class
#include <iostream>
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;
}
Saída
Sum: 13
Aqui,
ClassB
é uma classe de amigo de ClassA
. Então, ClassB
tem acesso aos membros de classA
. Em
ClassB
, criamos uma função add()
que retorna a soma de numA e numB . Desde
ClassB
é uma classe amiga, podemos criar objetos de ClassA
dentro de ClassB
. Linguagem C
- Classe e objeto C#
- Classe abstrata e método C#
- C# Classe Parcial e Método Parcial
- Classe e método selados em C#
- Classes e objetos C++
- Diferença entre estrutura e classe:explicada com exemplo de C++
- Java - Objeto e Classes
- Classes de armazenamento em C++
- Data e hora do C++
- Sobrecarga de C++ (operador e função)