C++友元

在c++中,友元有三种实现方式:全局函数做友元;类做友元;成员函数做友元;
友元就是给某些类或者函数提高一种权限去访问到你想去访问类的属性。就是你的卧室一般只有好朋友才可以进去一样。C++面向真实世界对象,抽象出的程序设计思想。

1、全局函数做友元

友元函数是可以直接访问类的私有成员的非成员函数。它是定义在类外的普通函数,它不属于任何类,但需要在类的定义中加以声明,声明时只需在友元的名称前加上关键字friend,其格式如下:
friend 类型 函数名(形式参数);

//房子类
class House
{
    //全局函数做友元
friend  void Goodfriend(House * h);
 public :
     House()
     {
         this->Bedroom="卧室";
         this->Livingroom="客厅";
     }

 private :
    string Bedroom;//卧室,私有属性,类外无法访问
 public :
   string Livingroom;//客厅,公有属性,类外可以访问

};
//全局友元函数
void Goodfriend(House * h)
{
    cout<<"your friends are visiting your  "<< h->Bedroom<<endl;
    cout<<"your friends are visiting your  "<< h->Livingroom<<endl;


}

2、类做友元


友元类的所有成员函数都是另一个类的友元函数,都可以访问另一个类中的隐藏信息(包括私有成员和保护成员)。
当希望一个类可以存取另一个类的私有成员时,可以将该类声明为另一类的友元类。定义友元类的语句格式如下:
** friend class 类名;**
其中:friend和class是关键字,类名必须是程序中的一个已定义过的类。

class Goodgay;
class Building
{
 friend Goodgay;
 public :
     Building();

 private :
    string Bedroom;//卧室,私有属性,类外无法访问
 public :
   string Livingroom;//客厅,公有属性,类外可以访问
};

class Goodgay
{
public :
    void visit();//类外进行初始化函数体
    Goodgay();
    ~Goodgay()
    {
        cout<<"析构函数已经调用"<<endl;
        if(building!=NULL)
          {
          delete building;
          building=NULL;
          }
    }

private :
    Building * building;//Building 指针

};

//Goodgay作用域下面的参观函数,对Building属性进行参观处理
void Goodgay::visit()
{
    cout<<"your friends are visiting your  "<< building->Bedroom<<endl;
    cout<<"your friends are visiting your  "<< building->Livingroom<<endl;

}
//Goodgay的构造函数进行开辟Building的指针,指向Building类
Goodgay::Goodgay()
{

    building=new Building;
}
//Building作用域下面的构造函数,对其属性进行初始化
Building::Building()
{
     this->Bedroom="卧室";
     this->Livingroom="客厅";
}

3、成员函数做友元

使用类中的某个函数作为友元。基本过程与全局函数类似。格式如下
** friend class(类名)::成员函数**

//成员函数作为友元
class My_Building;

class My_Goodgay
{
public :
    void visit1();//visit1函数作为友元函数
    void visit2();//visit2作为普通函数
    My_Goodgay();


private :
    My_Building *  my_building;//Building 指针

};

class My_Building
{

friend  void My_Goodgay::visit1();

 public :
     My_Building();

 private :
    string Bedroom;//卧室,私有属性,类外无法访问
 public :
   string Livingroom;//客厅,公有属性,类外可以访问
};


//Goodgay作用域下面的参观函数,对Building属性进行参观处理
void My_Goodgay::visit1()
{
    cout<<"your friends are visiting your  "<<  my_building->Bedroom<<endl;
    cout<<"your friends are visiting your  "<<  my_building->Livingroom<<endl;

}
void My_Goodgay::visit2()
{
    //cout<<"your friends are visiting your  "<<   my_building->Bedroom<<endl;
    cout<<"your friends are visiting your  "<<   my_building->Livingroom<<endl;

}
//Building作用域下面的构造函数,对其属性进行初始化
My_Building::My_Building()
{
     this->Bedroom="卧室";
     this->Livingroom="客厅";
}
//Goodgay的构造函数进行开辟Building的指针,指向Building类
My_Goodgay::My_Goodgay()
{

    my_building=new My_Building;
}

4、测试结果

void test1()
{
    House a;
    Goodfriend(&a);
}

void test2()
{

    Goodgay gg;
    gg.visit();
}


void test3()
{

    My_Goodgay ggg;
    ggg.visit1();
    ggg.visit2();
}

int main()
{

   test1();
   cout<<"类做友元的例子"<<endl;
   test2();
   cout<<"成员函数做友元"<<endl;
   test3();
    return 0;

}

测试结果

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

书中藏着宇宙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值