C++学习笔记(十六):友元

问题的提出:

我们已知道类具备封装和信息隐 藏的特性。只有类的成员函数才能访问类的私有成员,程式中的其他函数是无法访问私有成员的。非成员函数能够访问类中的公有成员,但是假如将数据成员都定义 为公有的,这又破坏了隐藏的特性。另外,应该看到在某些情况下,特别是在对某些成员函数多次调用时,由于参数传递,类型检查和安全性检查等都需要时间开 销,而影响程式的运行效率。

友元是一种定义在类外部的普通函数,但他需要在类体内进行说 明,为了和该类的成员函数加以区别,在说明时前面加以关键字friend。友元不是成员函数,但是他能够访问类中的私有成员。友元的作用在于提高程式的运 行效率,但是,他破坏了类的封装性和隐藏性,使得非成员函数能够访问类的私有成员。

C++中提供三种友元关系的实现方式,友元函数、友元成员函数、友元类。

友元函数:
既将一个普通的函数在一个类中说明为一个friend属性;其定义(大多数会访问该类的成员)应在类后;

友元成员函数:
既然是成员函数,那么肯定这个函数属于某个类,对了就是因为这个函数是另外一个类的成员函数,有时候因为我们想用一个类通过一个接口去访问另外一个类的信息,然而这个信息只能是被它授权的类才能访问;那么也需要用friend去实现;这个概念只是在声明的时候稍有变化;

友元类:
友元类声明会将整个类说明成为另一个类的友元关系;和之前两种的区别是集体和个人的区别;友元类的所有成员函数都可以是另一个类的友元函数;

 

示例:

 1 using namespace std;
 2 
 3 class B;
 4 
 5 class A{
 6     private:
 7         int x;
 8     public:
 9         A();
10         void display(B &);
11 };
12 
13 class C;
14 
15 class B{
16     private:
17         int y;
18         int z;
19     public:
20         B();
21         B(int, int);
22     friend void A::display(B &);//友元成员函数
23     friend void display(B &);//友元函数
24     friend class C;//友元类
25 };
26 
27 class C{
28     private:
29         int sum;
30         void calc(B &);
31     public:
32         C();
33         void display(B &);
34 };
35 
36 //必须在友元关系的类后进行定义
37 void display(B &v)//友元函数
38 {
39     cout << v.y << " " << v.z << endl;
40 }
41 
42 A::A()
43 {
44     this->x = 0;
45 }
46 
47 void A::display(B &v)//友元成员函数
48 {
49     this->x = v.y + v.z;
50     cout << this->x << endl;
51 }
52 
53 B::B()
54 {
55     this->y = 0;
56     this->z = 0;
57 }
58 
59 B::B(int y, int z)
60 {
61     this->y = y;
62     this->z = z;
63 }
64 
65 C::C()
66 {
67     sum = 0;
68 }
69 
70 void C::display(B &v)
71 {
72     this->calc(v);
73     cout << sum << " = " << v.y << " + " << v.z << endl;
74 }
75 
76 void C::calc(B &v)
77 {
78     sum = v.y + v.z;
79 }
80 
81 int main()
82 {
83     A a;
84     B b(2, 3);
85     display(b);
86     a.display(b);
87     C c;
88     c.display(b);
89     
90     return 0;
91 }

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。