友元1.引入在一个类中我们用private和protected等访问限定符来封装成员对外暴露接口对内隐藏细节但是这也同时增加了一些限制在类外无法访问类内成员而友元提供了一种突破类访问限定符封装的方式可以实现类外访问类内成员分为友元函数和友元类2.友元函数友元函数的实现需要在友元函数前面加上friend并在需要访问的类中加上友元函数的声明但这仅仅只是一种声明并不意味着友元函数是要访问类的成员函数这个声明可以放在类内的任何位置不受访问限定符限制一个函数可以是多个类的友元在友元函数中可以自由的访问这些类的成员如下代码所示//前置声明 否则A里面友元函数声明里编译器不认识B类型class B;class A{friendvoidfunc(constAa,constBb);private:int_a11;int_a22;};class B{//一个函数可以是多个类的友元friendvoidfunc(constAa,constBb);private:int_b11;int_b22;};voidfunc(constAa,constBb){couta._a1endl;coutb._b1endl;}intmain(){A a;B b;func(a,b);return0;}func()函数需要访问到类A、B中的私有成员变量_a1、_b1如果不加友元是无法突破访问限定符访问的此处将友元声明添加在了A和B类内部使得func()可以访问类A、B的成员友元函数没有this指针必须显示传对象的参数3.友元类友元类为该类中所有的成员函数提供了一种访问其他类成员的方式友元类中的成员函数都可以看做是同一个其他类的友元函数都可以访问另一个类中的成员友元类的关系是单向的比如A是B的友元但是B并不是A的友元友元类的关系不能传递比如A是B的友元B是C的友元但A不是C的友元class C{friend class D;//单向关系 D可以访问C,C不能访问Dpublic:voidfun(constDd);/*{ cout d._d1 endl;这里_d1在后面 编译器找不到 }-要声明定义分离*/private:int_c13;int_c24;};class D{friend class C;//相互成为友元public://如果D里面需要频繁调用C里private 可以声明友元类voidfun(constCc){coutc._c1endl;coutc._c2endl;}private:int_d1;int_d2;};voidC::fun(constDd){coutd._d1endl;}intmain(){C c;D d;d.fun(c);return0;}友元虽然提供了访问的遍历但是也在一定程度上破坏了耦合度所以友元不宜多用
郑州网站建设
网页设计
企业官网