简单的讲 :把类外部的类或函数声明为友元类和友元函数,使其能直接访问类中的私有成员。
格式: friend 类 或 函数 声明
//此语句可以放在类中的任意位置,与访问权限保留字无关。
需要注意几个方面:
1.友元关系是不可以传递的。
比方说你是我的友元而Joe是你的友元,但这并不意味着Joe是我的友元。
2.友元关系不能继承。
3.友元关系不是互通。
把class A设置为class B的友元并不会使得class B成为class A的友元,也许你愿意把你的秘密告诉我,但是,这并不意味着我愿意把我的秘密告诉你。
--------------------------------------------------------------------------------
“友元关系既不继承,也不传递”是什么意思?
[Recently added the "not reciprocal" item thanks to Karel Roose (on 4/01). Click here to go to the next FAQ in the "chain" of recent changes.]
仅仅因为我承认对你的友情,允许你访问我,并不自动地允许你的孩子访问我,并不自动地允许你的朋友访问我,并不自动地允许我访问你。
我不见得信任我朋友的孩子。友元的特权不被继承。友元的派生类不一定是友元。如果 Fred 类声明Base类是友元,那么Base类的派生类不会自动地被赋予对于Fred的对象的访问特权。
我不见得信任我朋友的朋友。友元的特权不被传递。友元的友元不一定是友元。如果Fred类声明Wilma类是友元,并且Wilma类声明Betty类是友元,那么Betty类不会自动地被赋予对于Fred的对象的访问特权。
你不见得仅仅因为我声称你是我的朋友就信任我。友元的特权不是自反的。如果Fred类声明Wilma类是友元,则Wilma对象拥有访问Fred对象的特权,但Fred对象不会自动地拥有对Wilma对象的访问特权。
--------------------------------------------------------------------------------
具体的用法详细见下面的示例:
#include < iostream >
using namespace std;
class Radius
{
friend class Circle; // 声明Circle为Radius的友元类
friend void Show_r(Radius & n); // 声明Show_r为友元函数
public :
Radius( int x)
{
r = x;
}
~ Radius()
{
}
private :
int r;
};
void Show_r(Radius & n)
{
cout << " 圆的半径为: " << n.r << endl; // 调用Radius对象的私有成员变量r
}
class Circle
{
public :
Circle()
{
}
~ Circle()
{
}
double area(Radius a)
{
s = a.r * a.r * 3.1415926 ; // 调用Radius对象的私有成员变量r
return s;
}
private :
double s;
};
int main( int argc, char * argv[])
{
Radius objRadius( 9 );
Circle objCircle;
Show_r(objRadius);
cout << " 面积为: " << objCircle.area(objRadius) << endl;
system( " PAUSE " );
return EXIT_SUCCESS;
}
本文转自:http://www.cppblog.com/hktk/archive/2009/09/21/96866.html