今天闲来无事,温习了一下C++的友元函数和友元类。这里记录一下心得,加深一下自己的印象。

  首先我们得了解一下什么叫友元函数,所谓友元函数首先它得是一个函数(废话)。其次,这个函数必须被某个类显式的声明为自己的友元函数。

  举一个例子:1 class A

              2  {

              3   friend void setX(A &,int);//申明setX为友元函数

              4 

              5    public:

              6      A():x(0){}//初始化x为0

              7    private:

              8      int x;

              9   };

              10

              11  void setX(A &a,int b)

              12  {

              13    a.x=b;

              14  }

              15

              16 int main()

              17 {

              18   A a;

              19   int b=10;

              20   setX(a,b);

              21   return 0;

              22  }

  整个程序很简单,首先创建一个类A,接着在创建一个赋值函数setX,然后在main中执行给a的私有变量x赋值的操作,然后返回0结束程序。类A中有一个共有的构造方法和一个私有成员变量x。在第3行还申明了一个友元函数setX(A &,int),声明友元函数的方法就是在返回值前加上friend关键字.

  setX这个函数是在类外实现的,这个函数的功能也很简单,就是给对象a的私有成员变量x赋值.我们知道,类的私有成员只有自己内部的函数可以访问,在类外部无法直接访问,但setX已经被类A声明为友元函数了,这样,函数setX就可通过a对象直接访问它的私有变量x。

  我们子所以使用友元函数,目的就在于可以在外部使用某个类的私有成员变量或是方法。而友元类和友元函数也是一个意思,只需要在类A中申明某个类是它的友元类即可。这样友元类中的方法就可以调用类A中的私有变量和方法了。

  比方说小明有一个飞机模型,这个模型是小明私有的,只有小明自己能玩,其他人不能玩。此时小明就相当于类A,模型就相当于私有变量x。可能小明觉得小刚是他的好朋友,所以小刚也可以玩他的飞机模型。写成代码大概是这个样子:

              class 小明

              {

                 friend 小刚;

                 private:

                   play("飞机模型");//私有方法

               };     

              class 小刚

               {

                 play()

                 {

                   小明.play("飞机模型");

                  }

                };

   不过友元可不是双向的,而是单向的,这好比小明虽然觉得小刚是朋友,愿意分享自己的玩具给小刚,可小刚不这么想,在他心里有可能并不把小明当朋友,所以当小明想玩一下小刚的玩具的时候,有可能遭到小刚的拒绝,甚至被小刚暴打一顿都有可能。(我看过不少小孩都是不爱和别人分享自己的玩具)

   所以朋友这东西和友元一样,都是一厢情愿的,你把别人当朋友,可别人谁拿你当盆菜啊,所以交友需谨慎!^_^