今天闲来无事,温习了一下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("飞机模型");
}
};
不过友元可不是双向的,而是单向的,这好比小明虽然觉得小刚是朋友,愿意分享自己的玩具给小刚,可小刚不这么想,在他心里有可能并不把小明当朋友,所以当小明想玩一下小刚的玩具的时候,有可能遭到小刚的拒绝,甚至被小刚暴打一顿都有可能。(我看过不少小孩都是不爱和别人分享自己的玩具)
所以朋友这东西和友元一样,都是一厢情愿的,你把别人当朋友,可别人谁拿你当盆菜啊,所以交友需谨慎!^_^
原文地址:http://9425336.blog.51cto.com/9415336/1557647