首页 > 代码库 > C++学习笔记(十六):友元
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 }
C++学习笔记(十六):友元
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。