• 在类外可以访问公用成员,只有本类中的函数可以访问本类的私有成员
    • 友元(friend)可以访问与其有好友关系的类中的私有成员
    • 友元包括友元函数和友元类

    1.友元函数

    • 如果在本类以外的其他地方定义了一个函数,在类体中可

    以用friend对其进行声明,此函数就称为本类的友元函数

    • 友元函数可以访问这个类中的私有成员

      1. //将普通函数声明为友元函数
      2. #include <iostream>
      3. using namespace std;
      4. class Time
      5. {
      6. public:
      7. Time(int,int,int);
      8. friend void display(Time &); //声明display函数为Time类的友元函数
      9. private: //以下数据是私有数据成员
      10. int hour;
      11. int minute;
      12. int sec;
      13. };
      14. Time Time(int h,int m,int s) //构造函数,给hour,minute,sec赋初值
      15. {
      16. hour=h;
      17. minute=m;
      18. sec=s;
      19. }
      20. void display(Time& t) //友元函数,形参t是Time类对象的引用
      21. {cout<<t.hour<<″:″<<t.minute<<″:″<<t.sec<<endl;}
      22. int main( )
      23. {
      24. Time t1(10,13,56);
      25. display(t1);
      26. //调用display函数,实参t1是Time类对象
      27. return 0;
      28. }
    • 注意friend函数在引用私有数据成员时,必须加上对象名,不能写成

      1. cout<<hour<<″:″<<minute<<″:″<<sec<<endl;

      因为display函数不是Time类的成员函数,不能默认引用Time类的数据
      成员,必须指定要访问的对象

    2.友元成员函数

    • friend函数也可以是另一个类中的成员函数
      1. //友元成员函数的简单应用
      2. #include <iostream>
      3. using namespace std;
      4. class Date; //对Date类的提前引用声明
      5. class Time //定义Time类
      6. {
      7. public:
      8. Time(int,int,int);
      9. void display(Date &); //display是成员函数,形参是Date类对象的引用
      10. private:
      11. int hour;
      12. int minute;
      13. int sec;
      14. };
      15. class Date //声明Date类
      16. {
      17. public:
      18. Date(int,int,int);
      19. friend void Time display(Date &); //声明Time中的display函数为友元
      20. 成员函数
      21. private:
      22. int month;
      23. int day;
      24. int year;
      25. };
      26. Time Time(int h,int m,int s) //类Time的构造函数
      27. {
      28. hour=h;
      29. minute=m;
      30. sec=s;
      31. }
      32. void Time display(Date &d) //输出年、月、日和时、分、秒
      33. {cout<<d.month<<″/″<<d.day<<″/″<<d.year<<endl;
      34. //引用Date类对象中的私有数据
      35. cout<<hour<<″:″<<minute<<″:″<<sec<<endl;
      36. //引用本类对象中的私有数据
      37. }
      38. Date Date(int m,int d,int y) //类Date的构造函数
      39. {
      40. month=m;
      41. day=d;
      42. year=y;
      43. }
      44. int main( )
      45. {
      46. Time t1(10,13,56); //定义Time类对象t1
      47. Date d1(12,25,2004); //定义Date类对象d1
      48. t1.display(d1); //调用t1中的display函数,实参是Date类对象d1
      49. return 0;
      50. }

    3.友元类

    • 可以将一个类(例如B类)声明为另一个类(例如A类)的“朋友”。这时B类就是A类的友元类。
    • 友元类B中的所有函数都是A类的友元函数,可以访问A类中的所有成员