• C++零碎记录(七)


    13. 友元

    13.1 友元简介

    ① 生活中你的家有客厅(Public),有你的卧室(Private),客厅所有来的客人都可以进去,但是你的卧室是私有的,也就是说只有你能进去,但是呢,你也可以允许你的好闺蜜进去。

    ② 在程序里,有些私有属性,也想让类外特殊的一些函数或者类进行访问,就需要用到友元的技术。

    ③ 友元的目的就是让一个函数或者类访问另一个类中私有成员。

    ④ 友元的关键字为 friend。

    ⑤ 友元的三种实现:

    1. 全局函数做友元。
    2. 类做友元。
    3. 成员函数做友元。
    1. #include
    2. using namespace std;
    3. //建筑物类
    4. class Buiding
    5. {
    6. //goodfriend全局函数是Buiding类好朋友,可以访问Buiding中私有成员
    7. friend void goodfriend(Buiding* buiding);
    8. public:
    9. Buiding() //构造函数 赋初值
    10. {
    11. m_SittingRoom = "客厅";
    12. m_BedRoom = "卧室";
    13. }
    14. public:
    15. string m_SittingRoom; //客厅
    16. private:
    17. string m_BedRoom;
    18. };
    19. //全局函数
    20. void goodfriend(Buiding *buiding)
    21. {
    22. cout << "好基友全局函数 正在访问:" << buiding->m_SittingRoom << endl;
    23. cout << "好基友全局函数 正在访问:" << buiding->m_BedRoom << endl;
    24. }
    25. void test01()
    26. {
    27. Buiding building;
    28. goodfriend(&building);
    29. }
    30. int main()
    31. {
    32. test01();
    33. system("pause");
    34. return 0;
    35. }

    运行结果:

    • 好基友全局函数 正在访问:客厅
    • 好基友全局函数 正在访问:卧室
    • 请按任意键继续. . .

    13.2 友元类

    1. #include
    2. using namespace std;
    3. //类做友元
    4. class Building; //声明
    5. class GoodGay
    6. {
    7. public:
    8. GoodGay();
    9. void visit(); //参观函数 访问Building中的属性
    10. Building* building;
    11. };
    12. class Building
    13. {
    14. //GoodGay类是本类的好朋友,可以访问本类的私有成员
    15. friend class GoodGay;
    16. public:
    17. Building();
    18. public:
    19. string m_SittingRoom; //客厅
    20. private:
    21. string m_BedRoom; //卧室
    22. };
    23. //类外写成员函数,写类名的作用域
    24. //Building构造函数
    25. Building::Building()
    26. {
    27. m_SittingRoom = "客厅";
    28. m_BedRoom = "卧室";
    29. }
    30. //GoodGay构造函数
    31. GoodGay::GoodGay()
    32. {
    33. //创建建筑物对象
    34. building = new Building; //这里会调用Building的构造函数
    35. //new是创建什么样的数据类型,就返回什么样的数据类型的指针
    36. }
    37. void GoodGay::visit()
    38. {
    39. cout << "好基友类正在访问:" << building->m_SittingRoom << endl;
    40. cout << "好基友类正在访问:" << building->m_BedRoom << endl;
    41. }
    42. void test01()
    43. {
    44. GoodGay gg; //创建一个GoodGay的对象,会调用GoodGay构造函数,会创建一个building,然后调用building构造函数
    45. gg.visit();
    46. }
    47. int main()
    48. {
    49. test01();
    50. system("pause");
    51. return 0;
    52. }

    运行结果:

    • 好基友类正在访问:客厅
    • 好基友类正在访问:卧室
    • 请按任意键继续. . .

    13.3 成员函数做友元

    1. #include
    2. using namespace std;
    3. class Building;
    4. class GoodGay
    5. {
    6. public:
    7. GoodGay();
    8. void visit(); //让visit函数可以访问Building中私有成员
    9. void visit2(); //让visit2函数不可以访问Buildinng中私有成员
    10. Building* building;
    11. };
    12. class Building
    13. {
    14. //告诉编译器,GoodGay类下的visit成员函数作为本类的好朋友,可以访问私有成员
    15. friend void GoodGay::visit();
    16. public:
    17. Building();
    18. public:
    19. string m_SittingRoom; //客厅
    20. private:
    21. string m_BedRoom; //卧室
    22. };
    23. // 类外实现构造函数
    24. Building::Building()
    25. {
    26. m_SittingRoom = "客厅";
    27. m_BedRoom = "卧室";
    28. }
    29. GoodGay::GoodGay()
    30. {
    31. building = new Building;
    32. }
    33. // 类外实现成员函数
    34. void GoodGay::visit()
    35. {
    36. cout << "visit 函数正在访问" << building->m_SittingRoom << endl;
    37. cout << "visit 函数正在访问" << building->m_BedRoom << endl;
    38. }
    39. void GoodGay::visit2()
    40. {
    41. cout << "visit2 函数正在访问" << building->m_SittingRoom << endl;
    42. //cout << "visit 函数正在访问" << building->m_BedRoom << endl;
    43. }
    44. void test01()
    45. {
    46. GoodGay gg;
    47. gg.visit();
    48. gg.visit2();
    49. }
    50. int main()
    51. {
    52. test01();
    53. system("pause");
    54. return 0;
    55. }

    运行结果:

    • visit 函数正在访问客厅
    • visit 函数正在访问卧室
    • visit2 函数正在访问客厅
    • 请按任意键继续. . .

    链接:https://www.zhihu.com/question/437657370/answer/1692846096
     

  • 相关阅读:
    (CVPR 2019)Associatively Segmenting Instances and Semantics in Point Clouds
    Haproxy
    复杂微纳结构制造需求旺盛 微纳3D打印市场发展前景广阔
    Vue中extend基本用法
    vue项目|在弹窗中引入uchart图表子组件不显示
    CMake中add_executable的使用
    Springboot 打印接口耗时
    STM32 HAL库F103系列之DAC实验(一)
    1.K3s+Rainbond之在线安装
    如何快速用一条命令配置好本地yum源(6/7/8版本)
  • 原文地址:https://blog.csdn.net/qq18218628646/article/details/132733407