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 >
10 using namespace std;
11
12 class A;
13 class B
14 {
15public:
16 void BFunc(A&);
17} ;
18 class C
19 {
20public:
21 void CFunc(A&);
22} ;
23 class 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} ;
43 void display(A & e)
44 {
45 cout<<"display()"<<endl;
46 //访问A的私有成员
47 cout<<"a = "<<e.a<<","<<"b = "<<e.b<<endl;
48}
49 void 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}
56 void 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}
63 int 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}
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 >
10 using namespace std;
11
12 class A;
13 class B
14 {
15public:
16 void BFunc(A&);
17} ;
18 class C
19 {
20public:
21 void CFunc(A&);
22} ;
23 class 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} ;
43 void display(A & e)
44 {
45 cout<<"display()"<<endl;
46 //访问A的私有成员
47 cout<<"a = "<<e.a<<","<<"b = "<<e.b<<endl;
48}
49 void 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}
56 void 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}
63 int 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的派生类也可以访问那个类的所有数据成员。非传递!