English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Vector ( Vetor )++ Tutorial Básico

Vector ( Vetor )++ Controle de fluxo

Vector ( Vetor )++ função

Vector ( Vetor )++ Array & string

Vector ( Vetor )++ Estrutura de dados

Vector ( Vetor )++ Classe & objeto

Vector ( Vetor )++ Ponteiro

Vector ( Vetor )++ Herança

Vector ( Vetor )++ Tutorial STL

Vector ( Vetor )++ manual de referência

Vector ( Vetor )++ função amiga e classe amiga

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.

Vector ( Vetor ) ++função amiga dentro

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).

Vector ( Vetor ) ++declaração de função amiga dentro

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.
    ... .. ...
}

示例1:Funcionamento da função amiga

/* 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.

示例2:Usar função amiga para adicionar membros de classes diferentes

#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);

Vector ( Vetor ) ++编程中的友元类(friend class)

类似地,像一个友元函数一样,一个类也可以使用关键字friend成为另一个类的友元类。例如:

... .. ...
class B;
class A
{
   // class B 是 class A的友元类
   friend class B;
   ... .. ...
}
class B
{
   ... .. ...
}

当一个类成为另一个类的friend类(友元类)时,这就意味着这个类的所有成员函数都是另一个类的友元函数。

在这个程序中,B类的所有成员函数都是A类的朋友函数,因此B类的任何成员函数都可以访问A类的私有和受保护的数据,但是A类的成员函数不能访问B类的数据。

Vector ( Vetor ) ++编程中如何互为友元类

如何实现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: