c++入门——友元

友元

1.引入

在一个类中,我们用private和protected等访问限定符来封装成员,对外暴露接口,对内隐藏细节,但是这也同时增加了一些限制,在类外无法访问类内成员,而友元提供了一种突破类访问限定符封装的方式,可以实现类外访问类内成员,分为友元函数和友元类

2.友元函数

友元函数的实现需要在友元函数前面加上friend,并在需要访问的类中加上友元函数的声明,但这仅仅只是一种声明,并不意味着友元函数是要访问类的成员函数,这个声明可以放在类内的任何位置,不受访问限定符限制,一个函数可以是多个类的友元,在友元函数中可以自由的访问这些类的成员,如下代码所示:

//前置声明 否则A里面友元函数声明里编译器不认识B类型class B;class A{friendvoidfunc(constA&a,constB&b);private:int_a1=1;int_a2=2;};class B{//一个函数可以是多个类的友元friendvoidfunc(constA&a,constB&b);private:int_b1=1;int_b2=2;};voidfunc(constA&a,constB&b){cout<<a._a1<<endl;cout<<b._b1<<endl;}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(constD&d);/*{ cout << d._d1 << endl;这里_d1在后面 编译器找不到 }->要声明定义分离*/private:int_c1=3;int_c2=4;};class D{friend class C;//相互成为友元public://如果D里面需要频繁调用C里private 可以声明友元类voidfun(constC&c){cout<<c._c1<<endl;cout<<c._c2<<endl;}private:int_d1;int_d2;};voidC::fun(constD&d){cout<<d._d1<<endl;}intmain(){C c;D d;d.fun(c);return0;}

友元虽然提供了访问的遍历,但是也在一定程度上破坏了耦合度,所以友元不宜多用