近日重新看了一下C++友元,有了新的理解,如有理解有偏差,请指出,不胜感激!
我们知道,类的三大特性:封装、继承、多态。类具有隐藏内部实现细节的特性,仅暴露出接口给用户使用,但有时候我们也赋予某个函数(成员或非成员)或某个类访问非公有成员或函数的权利,这个正是友元存在的意义!
关于“友元”,可能你觉得这两个字比较抽象,你就理解有“朋友”好了。比如说,你允许让某个朋友去你家(访问类的非公有成员),你就告诉阿汪“阿汪,这是我“朋友”,可以让他进来,其他人还是要吠他!”。
使用起来也不复杂,只要把需要赋予访问特权的函数(成员或非成员)或类的放到需要被访问的类里面声明就可以了。至于放到public、protected、private,那个都没关系。
友元分为两种:友元函数和友元类
1. 友元函数:
(1)非成员函数作为友元函数:
//abc.h
class CSum
{
friend int add(CSum sum); //友元函数
public:
CSum(int x, int y){m_x = x;m_y = y;}
private:
void print(){}
int m_x;
int m_y;
};
//abc.cpp
int add(CSum sum)
{
return sum.m_x + sum.m_y;
}
(2)成员函数作为友元函数:
//abc.h
class CSum;
class CPrintSum
{
public:
void printSum(CSum sum);
};
class CSum
{
friend void CPrintSum::printSum(CPrintSumsum); //成员函数作为友元函数
public:
CSum(int x, int y){m_x = x;m_y = y;}
private:
int m_x;
int m_y;
};
//abc.c
void CPrintSum::printSum( CSum sum )
{
std::cout<<sum.m_x<<" " << sum.m_y;
}
2. 友元类
如果想某个类的所有成员函数都能访问另一个类的非公有成有,友元类就用上了!当然,你不觉得累的话也可以使用“成员函数作为友元函数”,一个个的声明。
//abc.h
class CPrintSum
{
public:
void printX(CSum sum);
void printY(CSum sum);
void printSum(CSum sum);
};
class CSum
{
friend class CPrintSum;
public:
CSum(int x, int y){m_x = x;m_y = y;}
private:
int m_x;
int m_y;
};
//abc.c
void CPrintSum::printX( CSum sum )
{
std::cout<<sum.m_x;
}
void CPrintSum::printY( CSum sum )
{
std::cout<<sum.m_y;
}
void CPrintSum::printSum( CSum sum )
{
std::cout<<sum.m_x<<" " << sum.m_y;
}
一个friend class CPrintSum,三个成员函数都搞定!