文章目录
- 友元函数
- 友元类
- 友元成员函数
- 类的封装具有信息隐藏能力,但也带来了访问效率的问题
- c++通过友元给某些函数一项特权,可以访问类中的私有成员,使用的关键字是friend
友元函数
- 友元函数可以直接访问类的私有成员
classX{friendTf(...);// 声明f为X类的友元...};Tf(...){}//友元不是类的成员函数友元类
- 一个类可以是另一个类的友元,友元类的所有成员函数都是另一个类的友元函数,能够直接访问另一个类的所有成员
#include<iostream>usingnamespacestd;classA{private:intx,y;public:A(inti,intj){x=i;y=j;}intgetx(void){returnx;}intgety(void){returny;}friendclassB;//声明B是A的友元类};classB{private:intz;public:B(inti=0){z=i;}intadd(constA&a){returna.x+a.y+z;}intsub(constA&a){returna.x-a.y-z;}};intmain(void){Aa(2,3);Bb(4);cout<<b.add(a)<<endl;cout<<b.sub(a)<<endl;return0;}- 友元类不是双向的:B是A的友元类, 不意味着A也是B的友元类
友元成员函数
- 对一个类,可以指定它的某个成员函数是另一个类的友元,也就是友元成员函数
#include<iostream>usingnamespacestd;classB{private:intz;public:B(inti=0){z=i;}intadd(constA&);intsub(constA&);};classA{private:intx,y;public:A(inti,intj){x=i;y=j;}intgetx(void){returnx;}intgety(void){returny;}//friend class B; //声明B是A的友元类friendintB::add(constA&a);};intB::add(constA&a){returna.x+a.y+z;}intB::sub(constA&a){// return a.x - a.y - z;}intmain(void){Aa(2,3);Bb(4);cout<<b.add(a)<<endl;cout<<b.sub(a)<<endl;return0;}