`
isolated
  • 浏览: 50615 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

聊聊C++中的友元关系

阅读更多

 在封装中C++类数据成员大多情况是private属性;但是如果接口采用多参数实现肯定影响程序效率;然而这时候如果外界需要频繁访问这些私有成员,就不得不需要一个既安全又理想的“后门”--友元关系;

  C++中提供三种友元关系的实现方式,友元函数、友元成员函数、友元类。

  友元函数:既将一个普通的函数在一个类中说明为一个friend属性;其定义(大多数会访问该类的成员)应在类后;

  友元成员函数:既然是成员函数,那么肯定这个函数属于某个类,对了就是因为这个函数是另外一个类的成员函数,有时候因为我们想用一个类通过一个接口去访问另外一个类的信息,然而这个信息只能是被它授权的类才能访问;那么也需要用friend去实现;这个概念只是在声明的时候稍有变化;

  友元类:友元类声明会将整个类说明成为另一个类的友元关系;和之前两种的区别是集体和个人的区别;友元类的所有成员函数都可以是另一个类的友元函数;

  值得注意的是友元关系是单向的,有点像我们恋爱中出现的单相思 O(∩_∩)O,单向关系就是说如果A被说明成B的友元关系,那么只能说A是B的友元,并不代表B是A的友元;其次在多数情况下友元关系的函数都会访问它被说明中类的成员,这时候应该将函数定义在类的后面;

  下面给一个简单的例程代码;

  1 #include <iostream>

  2

  3 using namespace std;

  4

  5 class B;

  6

  7 class A{

  8     private:

  9         int x;

  10     public:

  11         A();

  12         void display(B &);

  13 };

  14

  15 class C;

  16

  17 class B{

  18     private:

  19         int y;

  20         int z;

  21     public:

  22         B();

  23         B(int, int);

  24     friend void A::display(B &);//友元成员函数

  25     friend void display(B &);//友元函数

  26     friend class C;//友元类

  27 };

  28

  29 class C{

  30     private:

  31         int sum;

  32         void calc(B &);

  33     public:

  34         C();

  35         void display(B &);

  36 };

  37

  38 //必须在友元关系的类后进行定义

  39 void display(B &v)//友元函数

  40 {

  41     cout << v.y << " " << v.z << endl;

  42 }

  43

  44 A::A()

  45 {

  46     this->x = 0;

  47 }

  48

  49 void A::display(B &v)//友元成员函数

  50 {

  51     this->x = v.y + v.z;

  52     cout << this->x << endl;

  53 }

  54

  55 B::B()

  56 {

  57     this->y = 0;

  58     this->z = 0;

  59 }

  60

  61 B::B(int y, int z)

  62 {

  63     this->y = y;

  64     this->z = z;

  65 }

  66

  67 C::C()

  68 {

  69     sum = 0;

  70 }

  71

  72 void C::display(B &v)

  73 {

  74     this->calc(v);

  75     cout << sum << " = " << v.y << " + " << v.z << endl;

  76 }

  77

  78 void C::calc(B &v)

  79 {

  80     sum = v.y + v.z;

  81 }

  82

  83 int main()

  84 {

  85     A a;

  86     B b(2, 3);

  87     display(b);

  88     a.display(b);

  89     C c;

  90     c.display(b);

  91

  92     return 0;

  93 }

  94


本文转自 ☆★ 包罗万象网 ★☆ - http://www.baoluowanxiang.com 转载请注明出处,侵权必究!
原文链接:http://www.baoluowanxiang.com/a/program/c/2010/0906/1451.html

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics