标签:style blog http color io os ar 使用 sp
此文转自C++_友元函数。
在实现类之间数据共享时,减少系统开销,提高效率。
具体来说:为了使其他类的成员函数直接访问该类的私有变量。
即:允许外面的类或函数去访问类的私有变量和保护变量,从而使两个类共享同一函数。
优点:能够提高效率,表达简单、清晰。
缺点:友元函数破环了封装机制,尽量不使用成员函数,除非不得已的情况下才使用友元函数。
1)运算符重载的某些场合需要使用友元。
2)两个类要共享数据的时候
因为友元函数没有this指针,则参数要有三种情况:
1)要访问非static成员时,需要对象做参数;--常用(友元函数常含有参数)
2)要访问static成员或全局变量时,则不需要对象做参数
3)如果做参数的对象是全局对象,则不需要对象做参数
因为友元函数是类外的函数,所以它的声明可以放在类的私有段或公有段且两者没有区别。
可以直接调用友元函数,不需要通过对象或指针。
根据这个函数的来源不同,可以分为三种方法:
1)目的:使普通函数能够访问类的友元
2)语法:
声明位置:公有私有均可,常写为公有
声明: friend + 普通函数声明
实现位置:可以在类外或类中
实现代码:与普通函数相同(不加不用friend和类::)
调用:类似普通函数,直接调用
3)示例代码:
1 #include <iostream> 2 3 using namespace std; 4 5 class Example 6 { 7 public: 8 Example(const int val = 0) : num(val){}; 9 virtual ~Example() {}; 10 friend void display(const Example& exam); 11 12 private: 13 int num; 14 15 }; 16 17 void display(const Example& exam) 18 { 19 cout << exam.num << endl; 20 } 21 22 void main() 23 { 24 Example example(10); 25 display(example); 26 }
1)目的:使用单个声明使Y类的所有函数成为类X的友元
它提供一种类之间合作的一种方式,使类Y的对象可以具有类X和类Y的功能
具体来说:
前提:A是B的友元(=》A中成员函数可以访问B中有所有成员,包括私有成员和公有成员)
则:在A中,借助类B,可以直接使用“B . 私有变量”的形式访问私有变量
2)语法:
声明位置:公有私有均可,常写为私有(把类看成一个变量)
声明: friend + 类名---不是对象啊
调用:
3)示例代码:
1 #include <iostream> 2 3 using namespace std; 4 5 class Boy; 6 class Girl 7 { 8 public: 9 Girl(){ name = "Lucy"; age = 18; }; 10 virtual ~Girl(){}; 11 12 private: 13 char * name; 14 int age; 15 friend Boy; //声明类Boy是类Girl的友元 16 17 }; 18 19 class Boy 20 { 21 public: 22 Boy(){ name = "Jimmy"; age = 20; }; 23 virtual ~Boy(){}; 24 void display(Girl& girl); 25 26 private: 27 char * name; 28 int age; 29 30 }; 31 32 void Boy::display(Girl& girl) //函数disp()为类Boy的成员函数,也是类Girl的友元函数 33 { 34 //正常情况,Boy的成员函数disp中直接访问Boy的私有变量 35 cout << "Boy‘s name is: " << name << ", age: " << age << "." << endl; 36 37 //借助友元,在Boy的成员函数disp中,借助Girl的对象,直接访问Girl的私有变量 38 //而正常情况下,只允许在Girl的成员函数中访问Girl的私有变量 39 cout << "Girl‘s name is: " << girl.name << ", age: " << girl.age << "." << endl; 40 41 } 42 43 44 int main() 45 { 46 Boy boy; 47 Girl girl; 48 boy.display(girl); //b调用自己的成员函数,但是以girl为参数,友元机制体现在函数display中 49 50 return 0; 51 }
1)目的:使类Y的一个成员函数成为类X的友元
具体而言:而在类Y的这个成员函数中,借助参数X,可以直接以X。私有变量的形式访问私有变量
2)语法:
声明位置:声明在公有中 (本身为函数)
声明:friend + 成员函数的声明
调用:先定义Y的对象y---使用y调用自己的成员函数---自己的成员函数中使用了友元机制
3)示例代码:
1 #include <iostream> 2 3 using namespace std; 4 5 class Girl; 6 class Boy 7 { 8 public: 9 Boy(){ name = "Jimmy"; age = 20; }; 10 virtual ~Boy(){}; 11 void display(Girl& girl); 12 13 private: 14 char * name; 15 int age; 16 17 }; 18 19 class Girl 20 { 21 public: 22 Girl(){ name = "Lucy"; age = 18; }; 23 virtual ~Girl(){}; 24 25 private: 26 char * name; 27 int age; 28 friend void Boy::display(Girl& girl); //声明类Boy的成员函数是类Girl的友元函数 29 30 }; 31 32 //函数display()为类Boy的成员函数,也是类Girl的友元函数 33 void Boy::display(Girl& girl) 34 { 35 //正常情况,Boy的成员函数disp中直接访问Boy的私有变量 36 cout << "Boy‘s name is: " << name << ", age: " << age << "." << endl; 37 38 //借助友元,在Boy的成员函数disp中,借助Girl的对象,直接访问Girl的私有变量 39 //而正常情况下,只允许在Girl的成员函数中访问Girl的私有变量 40 cout << "Girl‘s name is: " << girl.name << ", age: " << girl.age << "." << endl; 41 42 } 43 44 int main() 45 { 46 Boy boy; 47 Girl girl; 48 boy.display(girl); //b调用自己的成员函数,但是以girl为参数,友元机制体现在函数display中 49 50 return 0; 51 }
1)友元函数和类的成员函数的区别:成员函数有this指针,而友元函数没有this指针。
2)A是B的友元《=》A是B的朋友《=》借助B的对象,在A中可以直接通过“B.成员变量”(可以是公有,也可以为私有变量) 的方式访问B。
标签:style blog http color io os ar 使用 sp
原文地址:http://www.cnblogs.com/xiehongfeng100/p/4044291.html