1.为什么需要友元
2.友元类和友元函数
3.友元的一些原则
1.为什么需要友元
我们都知道,类中private类型的成员,只能由类内部的函数访问,类外部是不能访问的,但如果用了友元,则可以声明一个友元类或者友元函数,他们可以访问类的所有类型成员,包括 protected 和 private。但友元也是有缺点的,就是他令外部可以访问私有成员,破坏了封装性,降低了该类的可靠性和可维护性。
2.友元类和友元函数
1.友元类:
友元可以是类,A类可以作为B类的友元,这样的话,A类中的所有成员都是B类的友元,都可以访问A类的所有成员(包括变量和函数)。
声明方法: friend class 类名;
友元类代码:
class A
{
friend class B; //B是A的友元类
private:
void private_print()
{
cout<<"this is private print"<<endl;
}
int a;
};
class B
{
public:
void B_fun(A&a)
{
a.a=500;
a.private_print();
cout<<a.a<<endl;
}
};
int main()
{
A a;
B b;
b.B_fun(a);
return 0;
}
/*打印结果:this is private print
500 */
2.友元函数:
友元还可以是函数,声明方法: friend 类型 函数名(参数);
友元函数代码:
class A
{
friend void friend_fun(A &ao); //声明友元函数
public:
private:
void private_print();
int a;
};
/*A类私有函数*/
void A::private_print()
{
cout<<"this is private way from A"<<endl;
}
/*友元函数定义*/
void friend_fun(A &ao)
{
ao.a=100;
ao.private_print();
cout<<ao.a<<endl;
}
int main()
{
A a;
friend_fun(a);
return 0;
}
/*打印结果:this is private way from A
100 */
3.友元的一些原则
1.友元不具有继承性,如B是A的友元,C继承B,但C不是A的友元。除非A中有也声明了C为A的友元
2.友元的声明。如:friend void friend_fun();可以在类中的任何地方。因为友元不是类成员,所以不会受public,protected,private影响
3.友元是单向的,不具备交换。如B是A的友元,但不能因此认为A也是B的友元。
4.友元关系不能继承。父类的友元不能访问父类的子类的成员。