C++中友元类和友元函数的示例讲解

简单的讲 :把类外部的类或函数声明为友元类和友元函数,使其能直接访问类中的私有成员。

格式: 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  < cstdlib >
#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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值