生活中你的家有客厅(Public),有你的卧室(Private)
客厅所有来的客人都可以进去,但是你的卧室是私有的,也就是说只有你能进去
但是呢,你也可以允许你的好闺蜜好基友进去。
在程序里,有些私有属性 也想让类外特殊的一些函数或者类进行访问,就需要用到友元的技术
友元的目的就是让一个函数或者类 访问另一个类中私有成员
友元的关键字为 friend
友元的三种实现

  • 全局函数做友元
  • 类做友元
  • 成员函数做友元

    全局函数做友元

    ```cpp

include

include

using namespace std;

class Test { friend void g_fun1(); public: //全局函数做友元 Test() {//构造函数初始化 m_patV = 1; m_pubV = 2; } int m_pubV;//外部可以访问到这个publicVariable private: int m_patV;//外部不可以访问到这个privateVariable }; //定义一个全局函数 void g_fun1() { Test t; cout << “accessing a public variable “ << t.m_pubV << endl; cout << “accessing a private variable “ << t.m_patV << endl; //若全局函数不是友元,则无法访问私有成员属性 } void main() { g_fun1(); system(“pause”); }

  1. <a name="deaYk"></a>
  2. ## 类做友元
  3. <a name="tkZfR"></a>
  4. ### 类外进行成员函数的声明
  5. 在类内声明,在类外实现成员函数,成员函数可以是构造函数或析构函数
  6. ```cpp
  7. #include <iostream>
  8. #include <string>
  9. using namespace std;
  10. class House {
  11. House();//可声明可不声明
  12. public:
  13. string m_SittingRoom;
  14. private:
  15. string m_BedRoom;
  16. };
  17. class Person {
  18. public:
  19. string m_name;
  20. string m_age;
  21. House* myHouse;
  22. };
  23. House::House() {//构造函数可在类外调用
  24. m_BedRoom = "卧室名称被构造";
  25. m_SittingRoom = "起居室名称被构造";
  26. }
  27. House::~House() {//析构函数也可在类外调用,同理复制函数也可以在类外调用
  28. m_BedRoom = "卧室名称被析构";
  29. m_SittingRoom = "起居室名称被析构";
  30. }
  31. Person::Person() :m_age("18"), m_name("John") {//初始化列表同样可以在类外实现
  32. }
  33. void main() {
  34. system("pause");
  35. }
  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4. class Building;
  5. class TrustedC
  6. {
  7. public:
  8. TrustedC();
  9. void visit();
  10. private:
  11. Building* building;
  12. };
  13. class Building
  14. {
  15. //告诉编译器 Trusted类是Building类的好朋友,可以访问到Building类中私有内容
  16. friend class TrustedC;
  17. public:
  18. Building();
  19. public:
  20. string m_SittingRoom; //客厅
  21. private:
  22. string m_BedRoom;//卧室
  23. };
  24. Building::Building()
  25. {
  26. this->m_SittingRoom = "客厅";
  27. this->m_BedRoom = "卧室";
  28. }
  29. TrustedC::TrustedC()
  30. {
  31. building = new Building;
  32. }
  33. void TrustedC::visit()
  34. {
  35. cout << "友元类正在访问" << building->m_SittingRoom << endl;
  36. cout << "友元类正在访问" << building->m_BedRoom << endl;
  37. }
  38. void test01()
  39. {
  40. TrustedC gg;
  41. gg.visit();
  42. }
  43. int main() {
  44. test01();
  45. system("pause");
  46. return 0;
  47. }

成员函数做友元

实例中进行实例化,暂不展开