C++中的 友元

目录

1 友元

1.1 概念

1.2 分类

1.2.1 全局函数做友元

1.2.2 类做友元

1.2.3 成员函数做友元


1 友元

1.1 概念

在C++的类中,有些私有属性想要类外的特殊函数或者类进行访问,就用到友元

1.2 分类

1.2.1 全局函数做友元

创建home类与测试函数test01;类中加上私有属性bed_room并赋值为卧室,加上公共属性sitting_room并赋值为客厅,尝试打印输出

 class home
 {
 public:
   home()
   {
     sitting_room = "客厅";
     bed_room = "卧室";
   }
 ​
 public:
   string sitting_room;
 private:
   string bed_room;
 };
 void test01(home room)
 {
   cout << "正在访问->" << room.sitting_room << endl;
 }

img

不过,若是想访问bed_room;会发现不可访问,因为卧室是私有属性img

这时,就可以用到友元,将函数名整个放到类中,并在最前面加上friend

img

由此便可以访问私有属性bed_room

img

1.2.2 类做友元

首先创建Guy类和Room类,Guy类中有函数Guy和函数visit以及roomRoom类中有构造房屋函数Room以及私有房屋bed_room公共房屋sitting_room

 class Room;
 class Guy
 {
 public:
   Guy();
   void visit(); // 访问Room中的属性
   Room* room;
 };
 class Room
 {
 public:
   Room();
   string sitting_room;
 private:
   string bed_room;
 };
 Room::Room()
 {
   bed_room = "卧室";
   sitting_room = "客厅";
 }
 Guy::Guy()
 {
   room = new Room; // 创建屋子对象
 }
 void Guy::visit()
 {
   cout << "正在访问" << room->sitting_room << endl;
   cout << "正在访问" << room->bed_room << endl;
 }
 void test()
 {
   Guy f;
   f.visit();
 }

test中使用Guy函数创建对象f创建时调用Guy函数,会new一个Room出来,又调用了Room函数,初始化了sitting_room和bed_room),再使用对象f调用函数visitvisit函数则会访问sitting_room

img

尝试访问私有权限bed_room

img

私有权限,目前不能访问

同样的,将整个类名放在类中,并在前面加上friend表明其可以访问Room私有属性

img

1.2.3 成员函数做友元

同样的,与上面三相同的创建代码

 class Room;
 class Guy
 {
 public:
   Guy();
   void visit();
   Room* room;
 };
 class Room
 {
   friend void Guy::visit();
 public:
   Room();
 public:
   string sitting_room;
 private:
   string bed_room;
 };
 Room::Room()
 {
   this->bed_room = "卧室";
   this->sitting_room = "客厅";
 }
 ​
 Guy::Guy()
 {
   room = new Room;
 }
 void Guy::visit()
 {
   cout << "正在访问 " << room->sitting_room << endl;
   cout << "正在访问 " << room->bed_room << endl;
 }
 void test()
 {
   Guy g;
   g.visit();
 }

此时能输出公共权限sitting_room

img

无法访问私有权限的bed_roomimg

我们将整个函数名放在类中,记得前面加friend,中间要Guy::表明是Guy的函数

img

成功访问并输出

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值