1、友元函数
友元函数是可以直接访问类的私有成员的非成员函数。它是定义在类外的普通函数,它不属于任何类,但需要在类的定义中加以声明,声明时只需在友元的名称前加上关键字friend,其格式如下:
friend 类型 函数名(形式参数);
友元函数的声明可以放在类的私有部分,也可以放在公有部分,它们是没有区别的,都说明是该类的一个友元函数。
一个函数可以是多个类的友元函数,只需要在各个类中分别声明。
友元函数的调用与一般函数的调用方式和原理一致。
1. #include <iostream> 2. #include <cstring> 3. 4. using namespace std; 5. 6. class Student 7. { 8. private: 9. int age; 10. char sex; 11. int score; 12. public: 13. Student(int age, char sex, int score); 14. //声明友元函数 15. friend void display_information(Student &Stu); 16. }; 17. Student::Student(int age, char sex, int score) 18. { 19. this->age = age; 20. this->sex = sex; 21. this->score = score; 22. } 23. //注意,友元函数不是类Student的成员,但可以访问类中的私有成员变量 24. void display_information(Student &Stu) 25. { 26. cout << Stu.age << endl; 27. cout << Stu.sex << endl; 28. cout << Stu.score << endl; 29. } 30. int main(void) 31. { 32. Student STU1(24, 'N', 86); 33. display_information(STU1); 34. return 0; 35. }
2、友元类
类A是类B的友元类,则A就可以访问B的所有成员(成员函数,数据成员)。(类A,类B无继承关系)
a)目的:使用单个声明使A类的所有函数成为类B的友元
它提供一种类之间合作的一种方式,使类Y的对象可以具有类X和类Y的功能
具体来说:
前提:A是B的友元--->A中成员函数可以访问B中有所有成员,包括私有成员和公有成员--老忘)
则:在A中,借助类B,可以直接使用~B . 私有变量~的形式访问私有变量
b)语法:声明位置:公有私有均可,常写为私有(把类看成一个变量)
声明: friend + 类名---不是对象啊
1. #include <iostream> 2. using namespace std; 3. 4. class Point { 5. friend class Line; 6. public: 7. void fun(); 8. private: 9. int x; 10. protected: 11. int y; 12. }; 13. 14. void Point::fun() 15. { 16. this->x = 100; 17. this->y = 120; 18. } 19. 20. class Line { 21. public: 22. void printXY(); 23. 24. private: 25. Point t; 26. }; 27. 28. void Line::printXY() 29. { 30. t.fun(); 31. cout << t.x << " " << t.y << endl; 32. } 33. 34. int main() 35. { 36. Line test; 37. test.printXY(); 38. system("pause"); 39. return 0; 40. }
3、友成员函数:使类B中的成员函数成为类A的友元函数,这样类B的该成员函数就可以访问类A的所有成员(成员函数、数据成员)了
1. #include <iostream> 2. using namespace std; 3. 4. class Point;//在此必须对Point进行声明,如不声明将会导致第5行(void fun(Point t);)“Point”报错(无法识别的标识符) 5. 6. class Line { 7. public: 8. void fun(Point t); 9. }; 10. class Point { 11. public: 12. friend void Line::fun(Point t); 13. Point() {} 14. void print() 15. { 16. cout << this->x << endl; 17. cout << this->y << endl; 18. } 19. private: 20. int x; 21. protected: 22. int y; 23. }; 24. 25. void Line::fun(Point t)//应在此定义fun函数 26. { 27. t.x = 120; 28. t.y = 130; 29. t.print(); 30. } 31. 32. int main() 33. { 34. Point test; 35. Line LL; 36. LL.fun(test); 37. system("pause"); 38. return 0; 39. }
4、友元函数和类的成员函数的区别:成员函数有this指针,而友元函数没有this指针。
使用友元类时注意:
(1) 友元关系不能被继承。
(2) 友元关系是单向的,不具有交换性。若类B是类A的友元,类A不一定是类B的友元,要看在类中是否有相应的声明。
(3) 友元关系不具有传递性。若类B是类A的友元,类C是B的友元,类C不一定是类A的友元,同样要看类中是否有相应的申明
参考blog:
https://blog.csdn.net/fanyun_01/article/details/79122916