前面提到过,在类的封装中,私有的成员变量和成员函数无法在类外访问,但是总有那么一些情况需要给类外的对象赋予一定的访问权限。比如在家里面,客厅是公共访问权限,而每个人的卧室是私有访问权限,对大多数人来说不可访问,但是自己的好朋友可以。同样的道理,在C++中实现这种功能需要借助友元的机制。简单来说就是如果某个类外的对象需要访问类内的私有成员,在类内声明为友元类型即可。

在本例中,首先构造了一个 house 类,需要在类内声明全局函数 Friend 为友元方能访问类内的私有成员:

  1. class house
  2. {
  3. friend void Friend(house& p_house); // friend 是友元的关键字
  4. public:
  5. string livingroom;
  6. private:
  7. string bedroom;
  8. public:
  9. house() // 定义构造函数给成员变量赋值
  10. {
  11. livingroom = "客厅";
  12. bedroom = "卧室";
  13. }
  14. };
  15. void Friend(house& p_house)
  16. {
  17. // 可以在类外正常访问类内的公有成员
  18. cout << "Friend 正在访问:" << p_house.livingroom << endl;
  19. // 将Friend函数声明为友元方可访问私有成员
  20. cout << "Friend 正在访问:" << p_house.bedroom << endl;
  21. }
  22. int main(void)
  23. {
  24. house p; // 实例化house对象
  25. Friend(p); // 调用友元函数Friend
  26. }

输出结果如下所示:

  1. Friend 正在访问:客厅
  2. Friend 正在访问:卧室

想象一下,如果你某天需要出远门,需要一个朋友定期去你家里面进行打扫,这个时候你就需要给他一定的权限让他能够访问到家里面的任何地方。其实类做友元跟函数做友元一样,如下例所示:

  1. class house{
  2. // 将 friend_house 类声明为house的友元后,该类实例化的对象能够访问 house 类对象的所有成员
  3. friend class friend_house;
  4. public:
  5. string livingroom;
  6. private:
  7. string bedroom;
  8. public:
  9. house() // 定义构造函数给成员变量赋值
  10. {
  11. livingroom = "客厅";
  12. bedroom = "卧室";
  13. }
  14. void show() // 显示类内的变量内容
  15. {
  16. cout << "livingroom:" << livingroom << endl;
  17. cout << "bedroom:" << bedroom << endl;
  18. }
  19. };
  20. class friend_house{
  21. public:
  22. void visit(house& p_House)
  23. {
  24. cout << "friend 正在访问:" << p_House.livingroom << endl;
  25. // 将类friend_house 声明为house的友元后,不仅可以访问house的公有成员,也能访问私有成员
  26. cout << "friend 正在访问:" << p_House.bedroom << endl;
  27. p_House.livingroom = "整理后的客厅"; // 由于传进来的参数是引用类型,可以修改原来house对象的值
  28. p_House.bedroom = "整理后的卧室";
  29. }
  30. };
  31. int main(void)
  32. {
  33. house p; // 实例化house对象
  34. friend_house p_friend; //
  35. p_friend.visit(p); // 访问并修改house类对象p的成员
  36. p.show();
  37. }

输出结果如下:

  1. friend 正在访问:客厅
  2. friend 正在访问:卧室
  3. livingroom:整理后的客厅
  4. bedroom:整理后的卧室

其实无论什么做友元都是一样的目的,只是友元的声明格式不同,比如:

  1. 全局函数的声明:friend void Friend(house& p_house); // friend 是友元的关键字
  2. 友元类的声明:friend class friend_house;
  3. 成员函数的声明:friend void goodGay::visit1();
  1. class Building;
  2. class goodGay
  3. {
  4. public:
  5. goodGay();
  6. void visit1();
  7. void visit2();
  8. private:
  9. Building * building;
  10. };
  11. //类内声明,类外实现;
  12. class Building
  13. {
  14. //让成员函数visit1做友元函数:
  15. friend void goodGay::visit1();
  16. public:
  17. Building();
  18. public:
  19. string m_sittingroom; //客厅
  20. private:
  21. string m_bedroom; //卧室
  22. };
  23. Building::Building()
  24. {
  25. this->m_bedroom = "卧室";
  26. this->m_sittingroom = "客厅";
  27. }
  28. goodGay::goodGay()
  29. {
  30. building = new Building;
  31. }
  32. void goodGay::visit1()
  33. {
  34. cout << "基友正在" << this->building->m_sittingroom << endl;
  35. //要访问私有属性的元素;
  36. //在Building 类中定义友元类:friend class goodGay;
  37. cout << "基友正在" << this->building->m_bedroom << endl;
  38. }
  39. void goodGay::visit2()
  40. {
  41. cout << "基友正在" << this->building->m_sittingroom << endl;
  42. //要访问私有属性的元素;
  43. //在Building 类中定义友元类:friend class goodGay;
  44. //cout << "基友正在" << this->building->m_bedroom << endl;
  45. }
  46. int main()
  47. {
  48. goodGay g1;
  49. g1.visit1();
  50. return 1;
  51. }

输出结果为:

  1. 基友正在客厅
  2. 基友正在卧室

版权声明:本文为zhaozhibo原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/zhaozhibo/p/14971820.html