(3) Funciones de amigos y clases de amigos

1. El
concepto de amigo : a través de amigos, la encapsulación de la clase se rompe y se puede acceder a todos los miembros de la clase.

Categoría: función de amigo, clase de amigo

2.
Concepto de función de amigo :

  1. La función de amigo es una función ordinaria, que no pertenece a la clase, pero la relación de amigo debe indicarse en la clase.

  2. La función de amigo puede acceder a todos los miembros de la clase, pero la clase no puede acceder a los datos internos de la función de amigo.

formato

  • Cuando se puede declarar una función de amigo en una clase, se debe agregar la palabra clave amigo
  • Las funciones amigas se pueden declarar fuera de la clase y definir fuera de la clase. Necesito agregar la palabra clave amigo
class Cperson
{
    
    
private:
int age;
public:
friend void setPersonAge(Cperson& p,int age);
};
void setPersonAge(Cperson& p,int age) // 函数在类外声明和定义
{
    
    
p.age=age;
}
int main()
{
    
    
Cperson person;
setPersonAge(person,18);
}
class Cperson
{
    
    
private:
int age;
public:
friend void setPersonAge(Cperson& p,int age) // 友元函数在类内定义
{
    
    
p.age=age;
}
};

void setPersonAge(Cperson& p,int age)int main()
{
    
    
Cperson person;
setPersonAge(person,18);
}

Tres, Tomomoto

  • La clase de amigo no es miembro de la clase y no tiene este puntero.

  • Cuando una clase A se convierte en una clase amiga de otra clase B, la clase A puede acceder a todos los miembros de la clase B

Hay dos formas de clases de amigos:
hacer que toda la clase sea un amigo,
hacer que cierta parte de la función en la clase sea un amigo.

Haz amigos de toda la clase

class Cb;        // 声明类
class Ca
{
    
    
private:
int num;
public:
friend class Cb; // 使整个类成为Ca的友元,则Cb所有的成员都可以访问Ca的所有成员
};

class Cb
{
    
    
public:
void setCaNum(Ca& a);
void Func();
};

Hacer una cierta parte de la función en los amigos de la clase.

class Cb;                       // 声明类
class Ca
{
    
    
private:
int num;
public:
friend void Cb::setCaNum(Ca& a);// 只有Cb的setCaNum成为Ca的友元
};

class Cb
{
    
    
public:
void setCaNum(Ca& a);
void Func();
};

La relación de amistad no se puede heredar.
Inserte la descripción de la imagen aquí
4. Las características de la amistad

  • Unidireccional: los amigos pueden acceder a las clases, pero las clases no pueden acceder a los amigos.

  • No transitividad: A es amigo de B, C es amigo de A, pero C no es amigo de B

  • Sin herencia: hay una introducción en la clase de amigo anterior.
    Inserte la descripción de la imagen aquí
    Cinco, la relación entre la declaración del amigo y el alcance

  • Cuando use un amigo, considere la declaración y el alcance de su amigo, consulte el siguiente código

class X
{
    
    
public:
friend void f(){
    
    }    // 友元函数在类内定义
X() {
    
     f(); }           // 错误,f()函数在下面才声明,此处检测不到
void g();
void h();
};
void X::g(){
    
     return f(); } // 错误,此时f()函数还没有被声明
void f();                  // 声明函数
void X::h(){
    
     return f(); } // 正确,检测到f()函数被声明

Supongo que te gusta

Origin blog.csdn.net/qq_40329851/article/details/114275054
Recomendado
Clasificación