当前位置:   article > 正文

掘根宝典之C++友元(友元函数,友元类,友元成员函数)

掘根宝典之C++友元(友元函数,友元类,友元成员函数)

什么是友元

生活中你的家有客厅(public),有你的卧室(private)

客厅所有来的客人都可以进去,但是你的卧室是私有的,也就是说只有你能进去

但是呢,你也可以让A进去,不过实现这个的关键是让A称为你的好朋友。

让A成为你的好朋友的这个过程就是友元

我们都知道,在类外我们是无法直接访问类对象的私有数据的,只能通过类的公有方法来访问,有的时候这又显得有点严格,在这种情况下,C++提供了另外一种形式的访问权限:友元

类里有公有部分(public)和私有部分(private)

类外部可以直接访问公有部分,但是私有部分是私有的,只能在类里被直接访问

但是呢你可以让普通全局函数直接访问私有部分,关键就是让该全局函数成为该类的朋友,即友元函数。

友元的作用

友元的目的 就是让一个函数或者类 访问另一个类中的私有成员

为了实现友元,C++引入friend这个关键字

友元有3种:友元函数,友元类,友元成员函数。

全局函数做友元

我们可以让普通的全局函数成为友元函数

第一步就是在将其声明(注意是声明)放在类声明里,并在原型声明前加关键字friend,这也叫友元声明,格式如下

firend 返回类型 函数名 (参数列表);

这句话的作用就像告诉编译器这个函数是我这个类的好朋友,可以访问我这个类的私有数据

友元声明可以位于public,private,protected部分,其所在的位置无关紧要

我们要注意啊,友元是朋友哦,所以不是自家人,不用限定的名称来定义

第二步就是在类外定义该全局函数,格式如下

  1. 返回类型 函数名 (参数列表) //注意不用写friend
  2. {
  3. 函数体
  4. }

这样子就大功告成了

我们看个例子

  1. #include<iostream>
  2. using namespace std;
  3. class AA
  4. {//友元声明
  5. friend void A(AA a);//告诉编译器A函数是AA类的好朋友,可以访问AA的私有成员
  6. private:
  7. int a_;
  8. public:
  9. AA(int a)
  10. {
  11. a_ = a;
  12. }
  13. ~AA(){}
  14. };
  15. void A(AA a)//友元函数
  16. {
  17. cout << a.a_<< endl;
  18. }
  19. int main()
  20. {
  21. AA a = { 3 };
  22. A(a);
  23. }

结果是3.

类作友元

类作友元的步骤和友元函数差不多

第一步先准备好我们的好朋友(友元类),即先声明友元类

第一步就是在将友元类声明(注意是声明)放在类声明里,并在原型声明前加关键字friend,这也叫友元声明,格式如下

firend class 友元类名;

这句话的作用就像告诉编译器声明的这个类是我这个类的好朋友,可以访问我这个类的私有数据

友元声明可以位于public,private,protected部分,其所在的位置无关紧要

这样子就大功告成了

看个例子

  1. #include<iostream>
  2. using namespace std;
  3. class BB
  4. {//友元声明
  5. friend class AA;//告诉编译器AA类是BB类的好朋友,可以访问BB类的私有数据
  6. private:
  7. int a;
  8. public:
  9. BB(int a_)
  10. {
  11. a = a_;
  12. }
  13. };
  14. class AA
  15. {
  16. public:
  17. void visit(BB t)
  18. {
  19. cout << t.a << endl;
  20. }
  21. };
  22. int main()
  23. {
  24. BB e = { 2 };
  25. AA w;
  26. w.visit(e);//结果是2
  27. }

成员函数作友元

第一步就是在将其声明(注意是声明)放在类声明里,并在原型声明前加关键字friend,这也叫友元声明,格式如下

firend 返回类型 类名::函数名 (参数列表);

这句话的作用就像告诉编译器这个函数是我这个类的好朋友,可以访问我这个类的私有数据

友元声明可以位于public,private,protected部分,其所在的位置无关紧要

第二步就是在类外定义该全局函数,格式如下

  1. 返回类型 类名::函数名 (参数列表) //注意不用写friend
  2. {
  3. 函数体
  4. }

我的建议是等到两个类声明都写完之后再去给两个类的函数进行定义 

这样子就大功告成了

  1. #include<iostream>
  2. using namespace std;
  3. class AA;//先声明类
  4. class BB
  5. {
  6. public:
  7. void B1(AA t);
  8. void B2(AA t);
  9. };
  10. class AA
  11. {//声明引用
  12. friend void BB::B1(AA t);//告诉编译器BB类里的B1函数是AA类的好朋友,可以访问AA类的私有数据
  13. private:
  14. int a_;
  15. public:
  16. AA(int a)
  17. {
  18. a_ = a;
  19. }
  20. };
  21. void BB::B1(AA t)
  22. {
  23. cout << t.a_<< endl;//这是可以的
  24. }
  25. void BB::B2(AA t)
  26. {
  27. cout < t.a_ << endl;//这是不行的
  28. }
  29. int main()
  30. {
  31. AA r = { 2 };
  32. BB t;
  33. t.B1(r);//这是可以的
  34. t.B2(r);//这是不行的
  35. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/84936
推荐阅读
相关标签
  

闽ICP备14008679号