[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}
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的派生类也可以访问那个类的所有数据成员。非传递!
我没有什么雄心壮志,我只想给自己和关心自己的家人和朋友一个交代,仅此而已。