C++ 友元

C++友元

1. 成员函数做友元 (有大坑)

翻译:假设有A,B两类,A中的成员函数成为了B的友元,该函数就能访问B的私有属性。

 

首先声明定义A,B两个类 , 这里的先后顺序是有讲究的,必须要先声明被访问私有属性的类,此处为B;然后声明+定义私有属性访问者A。

class B;
class A
{
public:
   A(); //A构造函数的定义要放到B类定义的后面
   void visit();
   B* b; //B类此时还是不完全类,可以声明但不能实例化
}

接着定义B

class B
{
   friend void A::visit(); //核心代码
   
public:
   B(){ //B的构造函数最好写一下,方便后面检测
       m_Name = "zhangsan";
       m_Age = 18;
  };
   stirng m_Name;
private:
   int m_Age;
}

此时才能定义A的构造函数

A::A()          
{
   B b; //此时的B才是完整的,可以实例化了
}

接着补上成员函数visit的定义

void A::visit(){
   cout << B->m_Name << endl;
   cout << B->m_Age << endl;
}

最后写个main函数测试一下

int main()
{
   A a;
   a.visit();
   
   return 0;
}

 

本次主要讨论的是A类创建B类,且A中有成员函数为B的友元的情况,除了友元外还涉及到两类创建先后的问题。

类是可以提前声明的,但只声明未定义的类还不完整,此时只能用指针指向它或者引用它,不能实例化。

友元函数要访问类中的属性前也要保证该类已经被定义了,不然函数会找不到该属性。

 

2. 全局函数做友元

先定义一个全局类,再定义一个全局函数,最后在类中写个友元声明就可以了

class A
{
   friend void visit(A *a); //核心代码
public:
   string m_Name;
private:
   m_Age;
}

void visit(A *a){
   cout << a->m_Name << endl;
   cout << a->m_Age << endl;
}

 

3. 类做友元

和1相似,只是把成员函数换成全局类

class B;
class A
{
public:
   A(); //A构造函数的定义要放到B类定义的后面
   void visit();
   B* b; //B类此时还是不完全类,可以声明但不能实例化
}

class B
{
   friend class A; //核心代码
   
public:
   B(){ //B的构造函数最好写一下,方便后面检测
       m_Name = "zhangsan";
       m_Age = 18;
  };
   stirng m_Name;
private:
   int m_Age;
}

A::A()
{
   B b; //此时的B才是完整的,可以实例化了
}

void A::visit(){
   cout << B->m_Name << endl;
   cout << B->m_Age << endl;
}

 

 

posted @ 2021-10-26 17:06  临卓  阅读(64)  评论(0编辑  收藏  举报