标签:c style class blog code java
有时候我们需要用一个普通的函数直接的调用类A的成员变量,或者类B的成员函数需要直接调用类A的成员变量,来实现数据的共享。这个时候,为了减少系统的开销,提高程序执行的效率,我们就需要使用“友元函数”的概率。即“友元”的目的是为了方便实现数据的共享。它的优点是:使得程序简洁、直观、高效,缺点是:破坏了类的封装性。因此,只有在迫不得已的情况下为了简化程序设计才使用友元。
友元函数大体上可以分为三类:1)普通函数最为类的友元函数使用;2)友元类:类B的所有成员函数都是类A的友元;3)类B的成员函数作为类A的友元函数。
1)普通函数最为类的友元函数使用:在类Test的定义中声明普通函数disp()为其友元函数,那么函数disp()就可以使用类Test的成员变量。具体代码实现如下:
1 #include <iostream> 2 3 using namespace std; 4 5 class Test{ 6 public: 7 Test() 8 { 9 a = 1; 10 b = 2; 11 } 12 friend void disp(Test v); 13 private: 14 int a; 15 int b; 16 }; 17 18 void disp(Test v) 19 { 20 cout<<v.a<<" "<<v.b<<endl; 21 } 22 23 24 void main() 25 { 26 Test v; 27 disp(v); 28 }
2)友元类:类B的所有成员函数都是类A的友元,提供了两个类共享同一数据的手段。具体演示代码如下:
1 #include <iostream> 2 3 using namespace std; 4 5 class TestB; 6 class TestA{ 7 public: 8 TestA() 9 { 10 a = 1; 11 b = 2; 12 } 13 private: 14 int a; 15 int b; 16 friend TestB; 17 }; 18 19 class TestB{ 20 public: 21 void disp(TestA a) 22 { 23 cout<<a.a<<" "<<a.b<<endl; 24 } 25 }; 26 27 28 29 void main() 30 { 31 TestB b_demo; 32 TestA a_demo; 33 b_demo.disp(a_demo); 34 }
3)类B的成员函数作为类A的友元函数。具体演示代码如下:
1 #include <iostream> 2 3 using namespace std; 4 5 class TestA; 6 7 class TestB{ 8 public: 9 void disp(TestA a); 10 }; 11 12 class TestA{ 13 public: 14 TestA() 15 { 16 a = 1; 17 b = 2; 18 } 19 friend void TestB::disp(TestA a); 20 private: 21 int a; 22 int b; 23 24 }; 25 26 void TestB::disp(TestA a) 27 { 28 cout<<a.a<<" "<<a.b<<endl; 29 } 30 31 void main() 32 { 33 TestB b_demo; 34 TestA a_demo; 35 b_demo.disp(a_demo); 36 }
标签:c style class blog code java
原文地址:http://www.cnblogs.com/panlonyin/p/3777426.html