[C++ rudiment]关于类的友元

 1 ExpandedBlockStart.gif ContractedBlock.gif /**/ /*
 2    Written By WangBin @09.6.11
 3    Just for the understanding of the friend in C++
 4*/

 5 ExpandedBlockStart.gifContractedBlock.gif /**/ /*
 6    再注:为了能在友元函数中访问并设置类的私有数据成员,一个类的友元函数一般将该类的引用作为函数参数
 7    友元关系是单方向的,不具有交换性和传递性,使用友元虽然可以简化编程,但却破坏了类的封装性,应谨慎使用才是
 8*/

 9 #include  < iostream >
10 using   namespace  std;
11
12 class  A;
13 class  B
14 ExpandedBlockStart.gifContractedBlock.gif {
15public:
16    void BFunc(A&);
17}
;
18 class  C
19 ExpandedBlockStart.gifContractedBlock.gif {
20public:
21    void CFunc(A&);
22}
;
23 class  A
24 ExpandedBlockStart.gifContractedBlock.gif {
25    //一般习惯于把一个类的所有友元函数放在类声明的开始或者结尾处
26    //声明一个普通函数为类A的友元函数,此函数可以访问类A的所有成员(包括私有成员)
27    friend void display(A&); 
28    //声明一个类的成员函数为类B的友元函数,此函数可以访问A的所有成员(包括私有成员)
29    friend void B::BFunc(A&);   
30    //声明类C是类A的友元类,类C中的成员函数都可以访问A的所有成员(包括私有成员)
31    friend C;
32
33private:
34    int a;
35    int b;
36public:
37    A(int x = 0,int y = 0)
38ExpandedSubBlockStart.gifContractedSubBlock.gif    {
39        a = x;
40        b = y;
41    }

42}
;
43 void  display(A &  e)
44 ExpandedBlockStart.gifContractedBlock.gif {
45    cout<<"display()"<<endl;
46    //访问A的私有成员
47    cout<<"a = "<<e.a<<","<<"b = "<<e.b<<endl;
48}

49 void  B::BFunc(A &  e)
50 ExpandedBlockStart.gifContractedBlock.gif {
51    cout<<"B::BFunc()"<<endl;
52    //修改A的私有成员
53    e.a = 10;
54    cout<<"a = "<<e.a<<","<<"b = "<<e.b<<endl;
55}

56 void  C::CFunc(A &  e)
57 ExpandedBlockStart.gifContractedBlock.gif {
58    cout<<"C::CFunc()"<<endl;
59    //修改A的私有成员
60    e.b = 20;
61    cout<<"a = "<<e.a<<","<<"b = "<<e.b<<endl;
62}

63 int  main()
64 ExpandedBlockStart.gifContractedBlock.gif {
65    A a1(2,3);
66    display(a1);
67    B b1;
68    b1.BFunc(a1);
69    C c1;
70    c1.CFunc(a1);
71    return 0;
72}

OutPut:

上面已经说过了,友元是单方向性的和非传递的,一个类设置基类A为友元,并不代表基类A的派生类也可以访问那个类的所有数据成员。非传递!

转载于:https://www.cnblogs.com/krisdy/archive/2009/06/11/1501207.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值