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

Vector (vector)++ Tutoriales básicos

Vector (vector)++ Palabras clave e identificador

Vector (vector)++ función

Vector (vector)++ Retorno de referencia

Vector (vector)++ Cadena

Vector (vector)++ Enumeración (enum)

Vector (vector)++ Sobrecarga de operadores

Vector (vector)++ Gestión de memoria

Vector (vector)++ Plantilla

Vector (vector)++ Map (contenedor)

Vector (vector)++ <cmath>

amigo función y clase amiga ++se crean funciones amigas y clases amigas en C

OOPuno de los conceptos importantes es la ocultación de datos, es decirfunción no miembrono puede acceder a los datos privados o protegidos del objeto.

Pero, a veces, esta restricción puede obligar a los programadores a escribir código largo y complejo. Por lo tanto, C ++El lenguaje de programación tiene un mecanismo que permite acceder a datos privados o protegidos desde funciones no miembro.

Esto se realiza utilizando funciones amigas y clases amigas.

Vector (vector) ++las funciones amigas

Si se define la función como una función amiga, se puede usarfunciónpara acceder a los datos privados y protegidos de la clase.

Al usar la palabra claveamigo, el compilador sabe que la función dada es una función amiga.

Para acceder a los datos, debe declarar la función amiga utilizando la palabra clave friend dentro de la clase (puede estar en cualquier lugar de la clase, ya sea en la parte privada o pública).

Vector (vector) ++declaración de funciones amigas

clase nombreDeLaClase
{
    ... .. ...
    amigo return_type nombreDeLaFuncion argumento/s);
    ... .. ...
}

Ahora, puede definir una función amiga como una función común que accede a los datos de la clase. No se utiliza ninguna palabra clave en la definición de amigo.

clase nombreDeLaClase
{
    ... .. ...
    amigo return_type nombreDeLaFuncion argumento/s);
    ... .. ...
}
return_type functionName(argument/s)
{
    ... .. ...
    // Se puede acceder a los datos privados y protegidos de className desde esta posición
     //Porque esta función es una función amiga de className.
    ... .. ...
}

示例1: Funcionamiento de la función amiga

/* Vector (vector) ++Este programa demuestra el funcionamiento de las funciones amigas.*/
#include <iostream>
using namespace std;
class Distance
{
    private:
        int meter;
    public:
        Distance(): meter(0) { }
        //Función amiga
        friend int addFive(Distance);
};
// Definición de la función amiga
int addFive(Distance d)
{
    //Acceder a datos privados desde una función no miembro
    d.meter += 5;
    return d.meter;
}
int main()
{
    Distance D;
    cout << "Distancia: " << addFive(D);
    return 0;
}

Resultados de salida

Distancia: 5

Aquí, la función amiga addFive() se declara en la clase Distance. Por lo tanto, se puede acceder a los datos privados desde esta función.

Aunque este ejemplo te da una idea sobre el concepto de función amiga, no muestra ningún uso significativo.

Cuando necesites operar con objetos de dos clases diferentes, habrá un uso más significativo. En ese momento, las funciones amigas serán muy útiles.

Puedes operar con objetos de dos clases diferentes sin usar una función amiga, pero este programa sería muy largo, complejo y difícil de entender.

示例2: Añadir dos miembros de clases diferentes utilizando una función amiga

#include <iostream>
using namespace std;
// Declaración previa
class B;
class A {
    private:
      int numA;
    public:
      A(): numA(12) { }
      //Funciones amigas de C++
      friend int add(A, B);
};
class B {
    private:
       int numB;
    public:
       B(): numB(1) { }
       // Funciones amigas de C++
       friend int add(A, B);
};
//La función add() es una función amiga de las clases A y B
//Acceder a las variables miembro numA y numB
int add(A objectA, B objectB)
{
   return (objectA.numA + objectB.numB);
}
int main()
{
    A objectA;
    B objectB;
    cout << "Suma: " << add(objectA, objectB);
    return 0;
}

Resultados de salida

Suma: 13

En este programa, las clases A y B han declarado a add() como una función amiga. Por lo tanto, esta función puede acceder a los datos privados de estas dos clases.

Aquí, la función add() suma los datos privados numA y numB de dos objetos objectS y object, y los devuelve a la función main.

为了使这个程序正常工作,应该像上面的实例中所示的那样,对一个类B进行前置声明。

这是因为使用以下代码在class A中引用了class B的友元函数:friend int add(A,B);

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

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

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

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

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

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

如何实现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 de ejecución:
Construcción de la clase A
Construcción de la clase B2a =12
Construcción de la clase B2a =12
0 b =
La clase B se destruye

La clase A se destruye

La forma de hacer que dos clases sean amigas es declarar friend class B en la clase A y declarar friend class A en la clase B;Atención: