English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Neste artigo, você aprenderá sobre funções amigas e classes amigas no C ++criar funções amigas e classes amigas no OOP e usá-las eficazmente no programa.
OOPum dos conceitos importantes é a ocultação de dados, que éfunção não-membronão pode acessar dados privados ou protegidos do objeto.
No entanto, às vezes essa restrição pode forçar os programadores a escrever código extenso e complexo. Portanto, C ++A programação embute um mecanismo que permite acessar dados privados ou protegidos de funções não-membros.
Isso é feito usando função amiga e classe amiga.
Se você definir a função como uma função amiga, você pode usarfunçãopara acessar dados privados e protegidos da classe.
ao usar a palavra-chavefriend, o compilador sabe que a função fornecida é uma função amiga.
Para acessar os dados, você deve declarar a função amiga com a palavra-chave friend no interior da classe (pode ser em qualquer lugar da classe interna, pode ser na parte privada ou pública).
class class_name { ... .. ... friend return_type function_name(argument)/s); ... .. ... }
Agora, você pode definir uma função amiga como uma função comum para acessar os dados da classe. Não há nenhuma palavra-chave usada na definição de friend.
class className { ... .. ... friend return_type functionName(argument)/s); ... .. ... } return_type functionName(argument/s) { ... .. ... // Pode-se acessar os dados privados e protegidos de className a partir dessa posição //Porque essa função é amiga da className. ... .. ... }
/* Vector ( Vetor ) ++O programa demonstra o funcionamento da função amiga.*/ #include <iostream> using namespace std; class Distance { private: int meter; public: Distance(): meter(0) { } //Função amiga friend int addFive(Distance); ; // Definição da função amiga int addFive(Distance d) { //Acesso a dados privados de não membro função d.meter += 5; return d.meter; } int main() { Distance D; cout << "Distância: \t" << addFive(D); return 0; }
Resultados de saída
Distância: 5
Aqui, a função amiga addFive() é declarada na classe Distance. Portanto, pode-se acessar os dados privados dessa função.
Embora este exemplo forneça ideias sobre o conceito de função amiga, não mostra nenhum uso significativo.
Quando precisar operar objetos de classes diferentes, haverá um uso mais significativo. Nessa época, a função amiga será muito útil.
Você pode operar objetos de classes diferentes sem usar função amiga, mas o programa ficará muito longo, complexo e difícil de entender.
#include <iostream> using namespace std; // Pré-declaração class B; class A { private: int numA; public: A(): numA(12) { } //Função Amiga em C++ friend int add(A, B); ; class B { private: int numB; public: B(): numB(1) { } // Função Amiga em C++ friend int add(A, B); ; //A função add() é uma função amiga das classes A e B //Acesso às variáveis de membro numA e numB int add(A objectA, B objectB) { return (objectA.numA + objectB.numB); } int main() { A objectA; B objectB; cout << "Soma: \t" << add(objectA, objectB); return 0; }
Resultados de saída
Soma: 13
Neste programa, as classes A e B já declararam a função add() como função amiga. Portanto, esta função pode acessar os dados privados dessas classes.
Aqui, a função add() adiciona os dados privados numA e numB de dois objetos objectS e object e retorna ao função main.
为了使这个程序正常工作,应该像上面的实例中所示的那样,对一个类B进行前置声明。
这是因为使用以下代码在class A中引用了class B的友元函数:friend int add(A,B);
类似地,像一个友元函数一样,一个类也可以使用关键字friend成为另一个类的友元类。例如:
... .. ... class B; class A { // class B 是 class A的友元类 friend class B; ... .. ... } class B { ... .. ... }
当一个类成为另一个类的friend类(友元类)时,这就意味着这个类的所有成员函数都是另一个类的友元函数。
在这个程序中,B类的所有成员函数都是A类的朋友函数,因此B类的任何成员函数都可以访问A类的私有和受保护的数据,但是A类的成员函数不能访问B类的数据。
如何实现class A与B互为友元,即A可以访问B的私有,B也可以访问A的私有呢?案例如下:
#include <iostream> using namespace std; //必须提前声明class B不然编译会报错 class B; class A{ private: int a; public: friend class B; A(){ cout << "类A被构造" << endl; a =; 20; } ~A(){ cout << "类A被析构" << endl; } void show(B &b); ; class B{ private: int b; public: friend class A; B(){ cout << "类B的构造" << endl; b =; 12; } ~B(){ cout << "类B被析构" << endl; } void show(A &a){ cout << "a=" << a.a; cout << "b=" << b << endl; } ; //函数不能放在class A中,否则会编译报错 void A::show(B &b){ cout << "a=" << a; cout << "b=" << b.b << endl; } int main(){ A a; B b; a.show(b); b.show(a); return 0; }}
Resultados da Execução: Construção da classe A Construção da classe B2a =12 Construção da classe B2a =12 0 b = A classe B é destruída
A classe A é destruída
A maneira de ser classes amigas é declarar friend class B; na classe A; e declarar friend class A; na classe B;Atenção: