通俗说法:

如果将类的封装比喻成一堵墙的话,那么友元机制就像墙上了开了一个门,那些得 到允许的类或函数允许通过这个门访问一般的类或者函数无法访问的私有属性和方
法。友元机制使类的封装性得到消弱,所以使用时一定要慎重。

友元只授权特有对象访问自己(类中)的私有函数或数据,同时避免频繁调用的处理器开销。

友元只能包含不能继承,只有单向性,不具有可交换性和可传递性。

C++良好的共有、私有、受保护机制可以保证封装的安全访问,但友元刚好相反,它以牺牲封装性为代价,可以通过友元函数、友元类、友元成员函数让不同访问级别的对象可以通讯访问:

友元函数:可以让同类的public函数可以访问本类的私有数据,格式:本类的共有函数前加关键字“friend”。友元函数不属于类的成员函数而是定义在外部,不需要加类限定,声明可以放在public部分,也可以放在private部分。

友元类:只能是包含关系,B的整个成员函数都作为A类中的一个成员,则B就直接访问A(墙和门的例子,主要应用场合是当B类要存取A类时),格式:本类的共有数据成员中加加关键字“friend class 类型”。

友元成员函数:B的成员函数作为友元成为A的友元成员函数,则B就可以访问A的函数,但必须先声明B,再声明B的函数是A的友元成员函数,最后才能定义友元函数。格式:本类的public成员函数中加加关键字“friend 返回类型 B::函数名”

       一个函数可以成为多个类的的友元函数,只需要在各个类中将其声明即可

具体应用:可以通过友元的重载,在不同类中使用IO流库;可以让不支持类的其它编程语言(C/汇编)和C++融合编程。