首页 > 其他分享 >类和对象——友元

类和对象——友元

时间:2022-11-11 15:59:02浏览次数:32  
标签:友元 Building GoodFriend 对象 void BedRoom SittingRoom 函数

作用:让一个函数或者类,去访问另一个类中的私有成员

关键字:friend

三种实现方法:

  ● 全局函数做友元

  ● 类做友元

  ● 成员函数做友元


1.全局函数做友元

例子:

 1 #include <iostream>
 2 #include <string>
 3 using namespace std;
 4 
 5 class Building{
 6     //允许通过void goodFriend()这个函数访问Building类的私有成员
 7     //缺少这段,void goodFriend()这个函数就不能访问Building类的私有成员
 8     //这段只需要写在类的顶端,不需要设置权限
 9     friend void goodFriend(Building *building); 
10 public:
11     Building(){
12         m_SittingRoom = "客厅";
13         m_BedRoom = "卧室";
14     }
15 
16 public:
17     string m_SittingRoom;
18 private:
19     string m_BedRoom;
20 };
21 
22 //全局函数void goodFriend(Building *building)
23 void goodFriend(Building *building){
24     cout << "全局函数正在访问:" << building->m_SittingRoom << endl;
25     cout << "全局函数正在访问:" << building->m_BedRoom << endl;
26 }
27 
28 void test01(){
29     Building building;
30     goodFriend(&building);
31 }
32 
33 int main(){
34     test01();
35     system("pause");
36     return 0;
37 }

2.类做友元

例子(此处采用类内声明函数,类外定义成员函数的方法):

 1 #include <iostream>
 2 #include <string>
 3 using namespace std;
 4 
 5 class Building; //声明类
 6 /////////////////
 7 class GoodFriend{
 8 public:
 9     GoodFriend();
10     void visit();  //用于访问Building中的属性
11     Building * building;
12 };
13 /////////////////
14 class Building{
15     friend class GoodFriend;
16 public:
17     Building(); //类内声明成员函数
18 public:
19     string m_SittingRoom;
20 private:
21     string m_BedRoom;
22 };
23 ////////////////////////
24 //类外写成员函数
25 Building::Building(){
26     m_SittingRoom = "客厅";
27     m_BedRoom = "卧室";
28 }
29 GoodFriend::GoodFriend(){
30     building = new Building;    //building指针指向新开辟的堆区
31 }
32 void GoodFriend::visit(){
33     cout << "好朋友正在访问:" << building->m_SittingRoom << endl;
34     cout << "好朋友正在访问:" << building->m_BedRoom << endl;
35 }
36 ///////////////////////////
37 void test01(){
38     GoodFriend gg;
39     gg.visit();
40 }
41 
42 int main(){
43     test01();
44     system("pause");
45     return 0;
46 }

3.成员函数做友元

例子(此处采用类内声明函数,类外定义成员函数的方法):

 1 #include <iostream>
 2 #include <string>
 3 using namespace std;
 4 
 5 class Building; //声明
 6 
 7 class GoodFriend{
 8 public:
 9     GoodFriend();
10     void visit();   //可以访问Building中的私有成员
11     void visit2();  //不可以访问Building中的私有成员
12     Building * building;
13 };
14 
15 class Building{
16     //确实了作用域GoodFriend,那么visit就是全局变量下的函数
17     friend void GoodFriend::visit();    //告诉编译器GoodFriend类下的函数visit可以访问本类的私有成员
18 public:
19     Building(); //构造函数
20 
21 public:
22     string m_SittingRoom;
23 private:
24     string m_BedRoom;
25 };
26 
27 //类外实现成员函数
28 Building::Building(){   //赋初值
29     m_SittingRoom = "客厅";
30     m_BedRoom = "卧室";
31 }
32 GoodFriend::GoodFriend(){
33     building = new Building;    //创建一个新的堆区让building这个指针指向它
34 }
35 
36 void GoodFriend::visit(){
37     cout << "visit正在访问:" << building->m_SittingRoom << endl;
38     cout << "visit正在访问:" << building->m_BedRoom << endl;
39 }
40 void GoodFriend::visit2(){
41     cout << "visit2正在访问:" << building->m_SittingRoom << endl;
42     //cout << "visit正在访问:" << building->m_BedRoom << endl;
43 }
44 
45 /////////////////////////////////
46 void test01(){
47     GoodFriend gg;
48     gg.visit();
49     gg.visit2();
50 }
51 int main(){
52     test01();
53     system("pause");
54     return 0;
55 }

 

标签:友元,Building,GoodFriend,对象,void,BedRoom,SittingRoom,函数
From: https://www.cnblogs.com/MorningMaple/p/16875492.html

相关文章

  • Spring 集成 MyBatis-将对象交给spring管理。
    Spring集成MyBatis​ 将MyBatis与Spring进行整合,主要解决的问题就是将SqlSessionFactory对象交由Spring来管理。所以,该整合,只需要将SqlSessionFactory的对......
  • Intent之对象传递(Serializable传递对象和对象集合)
    Android中Intent传递类对象提供了两种方式一种是 通过实现Serializable接口传递对象,一种是通过实现Parcelable接口传递对象。要求被传递的对象必须实现上述2种接口中的一种......
  • Intent传递对象——Serializable和Parcelable区别
    前两篇文章讨论了Serializable和Parcelable实现Intent之间传递对象和对象数组的方式,两种方法实现上相似,效果一致,怎么选择用哪种方法实现呢?Intent在不同的组件中传递对象数据......
  • 快速批量删除 Salesforce ApexLogs 或者其他对象
    实际开发中,有时候ApexLog会超出限制,系统就会提示,由于Salesforce不支持下面这种方式delete[SELECTIdFROMApexLog];这时如果想删除这些数据,有两种界面化方式:在......
  • 【Java】内存区域与对象创建
    这块内容是java很基础的部分,涉及到JVM的设计原理,很久以前就看到过,这次需要区分线程私有和共享基本java的运行时数据区可以分为五大块:程序计数器,为线程私有,每一个线程都有一......
  • 学习笔记-Frida构造数组,对象,Map和类参数
    Frida构造数组,对象,Map和类参数数组/(字符串)对象数组/gson/Java.array对象/多态,强转Java.cast接口interface,Java.register枚举,泛型,List,Map,Set,迭代打印重要思路:开......
  • XMLDOM对象方法:Document对象方法
    abort方法作  用 abort方法取消一个进行中的异步下载基本语法 xmlDocument.abort();说  明 如果这个方法在异步下载时被呼叫,所有的解析动作会停止,而且在内存中的......
  • 10.Series对象的创建
    如何创建Series对象pd.Series(data,index=index)1.importpandasaspddata=['李光地','张红云','王鹏']#data翻译为数据,给变量赋值s=pd.Series(data=dat......
  • 15.面向对象
    面向对象面向对象(ObjectOrientedProgramming)几乎是目前所有主流语言所必备的特点。什么是面向对象呢?回答这个问题,需要先明白另一个问题:什么是对象?什么是对象程序的本......
  • Unity 判断UI对象是否在屏幕内,并且把对象移进屏幕
    publicstaticboolJudgmentUiInScreen(GameObjectobj){RectTransformrect=obj.GetComponent<RectTransform>();RectTransformuiRoot=r......