【C++】 --- 友元函数与友元类

简介: 【C++】 --- 友元函数与友元类

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

https://www.cnblogs.com/balingybj/p/4778247.html

https://www.jb51.net/article/153078.htm

相关文章
|
5天前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
28 4
|
6天前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
22 4
|
29天前
|
存储 编译器 对象存储
【C++打怪之路Lv5】-- 类和对象(下)
【C++打怪之路Lv5】-- 类和对象(下)
26 4
|
29天前
|
编译器 C语言 C++
【C++打怪之路Lv4】-- 类和对象(中)
【C++打怪之路Lv4】-- 类和对象(中)
22 4
|
29天前
|
存储 安全 C++
【C++打怪之路Lv8】-- string类
【C++打怪之路Lv8】-- string类
19 1
|
1月前
|
存储 编译器 C++
【C++类和对象(下)】——我与C++的不解之缘(五)
【C++类和对象(下)】——我与C++的不解之缘(五)
|
1月前
|
编译器 C++
【C++类和对象(中)】—— 我与C++的不解之缘(四)
【C++类和对象(中)】—— 我与C++的不解之缘(四)
|
30天前
|
存储 编译器 C语言
【C++打怪之路Lv3】-- 类和对象(上)
【C++打怪之路Lv3】-- 类和对象(上)
16 0
|
1月前
|
存储 编译器 C语言
深入计算机语言之C++:类与对象(上)
深入计算机语言之C++:类与对象(上)
|
1月前
|
存储 编译器 C语言
【C++类和对象(上)】—— 我与C++的不解之缘(三)
【C++类和对象(上)】—— 我与C++的不解之缘(三)