基本概念
友元是一种定义在类外部的普通函数或类,但它需要在类体内进行说明,为了与该类的成员函数加以区别,在说明时前面加以关键字friend。友元不是成员函数,但是它可以访问类中的私有成员。友元函数在实现类之间数据共享时,可以减少系统开销,调高效率。比如:类A中的函数需要访问类B中的成员,那么类A中该函数要是类B的友元函数。友元函数允许外面的类或函数去访问类的私有变量和保护变量,从而使两个类共享同一函数。
使用友元类时注意:
(1) 友元关系不能被继承。
(2) 友元关系是单向的,不具有交换性。若类B是类A的友元,类A不一定是类B的友元,要看在类中是否有相应的声明。
(3) 友元关系不具有传递性。若类B是类A的友元,类C是B的友元,类C不一定是类A的友元,同样要看类中是否有相应的申明
使用场景
(1)运算符重载的某些场合需要使用友元函数;
(2)两个类要共享数据的时候。
优缺点
(1)优点:能够提高效率,表达清晰、简单;
(2)缺点:破坏了类的封装(尽量不要使用成员函数,除非不得已才使用友元函数)。
示例
(1)友元函数
#include <iostream>
using namespace std;
class Hello{
private:
int m_data;
public:
Hello(int data) {
this->m_data = data;
}
~ Hello() {
}
// 友元函数
friend void friendFun(Hello *h);
};
// 友元函数
void friendFun(Hello *h) {
cout<< h->m_data <<endl;
}
int main()
{
Hello *h = new Hello(8);
friendFun(h);
if(h!=nullptr) {
delete h;
h = nullptr;
}
return 0;
}
(2)友元类
#include <iostream>
using namespace std;
class Hello{
private:
int m_data;
public:
Hello(int data) {
this->m_data = data;
}
~ Hello() {
}
// 友元函数
// friend void friendFun(Hello *h);
// 友元类
friend class World;
};
// 友元函数
//void friendFun(Hello *h) {
// cout<< "friend funtion " << h->m_data <<endl;
//}
// 友元类
//class Hello;
class World{
private:
public:
void readHelloMsg(Hello *h) {
cout<< "friend class " << h->m_data<<endl;
}
};
int main()
{
// Hello *h = new Hello(8);
// friendFun(h);
// if(h!=nullptr) {
// delete h;
// h = nullptr;
// }
Hello *h1 = new Hello(100);
World d;
d.readHelloMsg(h1);
if(h1!=nullptr) {
delete h1;
h1 = nullptr;
}
return 0;
}