[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>
10
using namespace std;
11
12
class A;
13
class B
14
{
15
public:
16
void BFunc(A&);
17
};
18
class C
19
{
20
public:
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
33
private:
34
int a;
35
int b;
36
public:
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.113
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 B14
{15
public:16
void BFunc(A&);17
};18
class C19
{20
public:21
void CFunc(A&);22
};23
class A24
{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

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


浙公网安备 33010602011771号