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

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

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

 9#include <iostream>
10using namespace std;
11
12class A;
13class B
14{
15public:
16    void BFunc(A&);
17}
;
18class C
19{
20public:
21    void CFunc(A&);
22}
;
23class A
24{
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)
38    {
39        a = x;
40        b = y;
41    }

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

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

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

63int main()
64{
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的派生类也可以访问那个类的所有数据成员。非传递!

posted on 2009-06-11 11:13  笔记  阅读(365)  评论(0编辑  收藏  举报

导航