友元分为友元函数和友元类两种

友元函数

一个类的友元函数可以访问该类的私有成员

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. class car;//提前声明car类,便于之后的使用
  4. class driver
  5. {
  6. public:
  7. void ModifyCar(car*);
  8. };
  9. class car
  10. {
  11. private:
  12. int price;
  13. public:
  14. car(int);
  15. friend void driver::ModifyCar(car *);//声明友元函数
  16. void getCar(void);
  17. ~car(void);
  18. };
  19. void driver::ModifyCar(car *pCar)
  20. {
  21. pCar->price+=1000;
  22. cout<<"Friend Called"<<endl;
  23. }
  24. car::car(int x)
  25. {
  26. price=x;
  27. cout<<"Constructor Called"<<endl;
  28. }
  29. void car::getCar(void)
  30. {
  31. cout<<price<<endl;
  32. }
  33. car::~car(void)
  34. {
  35. cout<<"Destructor Called"<<endl;
  36. }
  37. int main(void)
  38. {
  39. car c(5000);//初始化对象,构造函数调用
  40. c=9000;//类型转换生成临时对象,构造函数析构函数都调用
  41. driver d;
  42. d.ModifyCar(&c);//ModifyCar虽然是driver类的成员函数,由于之前将其声明为了car类的友元
  43. c.getCar(); //现在通过它也可以访问car类的私有成员
  44. return 0;
  45. }
  46. /*
  47. Constructor Called
  48. Constructor Called
  49. Destructor Called
  50. Friend Called
  51. 10000
  52. Destructor Called
  53. */

友元类

如果A是B的友元类,则A的成员函数可以访问B的私有成员

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. class car
  4. {
  5. private:
  6. int price;
  7. public:
  8. car(int);
  9. friend class driver;
  10. };
  11. class driver
  12. {
  13. public:
  14. void ModifyCar(car*);
  15. void GetCar(const car&);
  16. };
  17. car::car(int x)
  18. {
  19. price=x;
  20. }
  21. void driver::ModifyCar(car *pCar)
  22. {
  23. pCar->price+=1000;
  24. }
  25. void driver::GetCar(const car &qCar)
  26. {
  27. cout<<qCar.price<<endl;
  28. }
  29. int main(void)
  30. {
  31. car C(9000);
  32. driver d;
  33. d.ModifyCar(&C);
  34. d.GetCar(C);//10000
  35. return 0;
  36. }

注意:友元类之间的关系不能传递,不能继承