友元的种类
1.友元函数
2.友元类
3.友元成员函数
友元函数
- c++允许友元函数访问类中的私有数据,无this指针。
- 其他类,类的成员函数,全局函数都可用作为友元函数。
- 声明时,前面加关键字friend,只有在类声明的原型中才能使用friend关键字,除非函数定义也是原型,否则,不能在定义中使用friend关键字。
全局函数作为友元函数
//将goodGayVisit作为类的友元函数
//goodGayVisit访问类中所有数据
friend void goodGayVisit(Room &room) ;
private:
string bedRoom;/ /卧室
public:
string sittingRoom;//客厅
public:
Room()
{
this->bedRoom = "卧室";
this->sittingRoom="客厅";
}
};
//普通全局丽数作为类的友元
//好基友访问我的房问
void goodGayVisit(Room &room)
{
cout<<"好基友访问了你的"<<room.sittingRoom<<endl ;
}
一个类的所有成员函数作为另一个类的友元。
- 要访问哪一个类中的私有数据成员,就在哪个类中声明friend类。
class Room;//Room向前声明
class GoodGay
{
public:
void visit1(Room &room) ;//此处的Room为上方class Room
void visit2(Room &room) ;
};
class Room
{
//如果想方 visit2作为Room类的友元 那么Visit2就可以访问Room的私 有数据
//一定要记得加类作用城
friend void GoodGay::visit2(Room &room) ;
private :
string bedRoom;//卧室
public:
友元函数继承
- 由于友元函数不是成员函数,所以不能继承,可以通过强制类型转换,派生类引用或指针转为基类引用或指针,然后使用转换后的指针或引用来调用基类的友元函数。
std::ostream & operator<<(std::ostream & os, const baseDMA & rs)
{
os << "Label: " << rs.label << std::endl;
os << "Rating: " << rs.rating << std::endl;
return os;
}
std::ostream & operator<<(std::ostream & os, const hasDMA & hs)
{
os << (const baseDMA &) hs; /强制类型转换为基类对象
os << "Style: " << hs.style << std::endl;
return os;
}
- 也可以使用dynamic_cast<转换类型>进行强制类型转换(这种形式最佳):
os << dynamic_cast<const baseDMA &> (hs);
友元类
- 友元类的所有方法都可以访问原始类的私有和保护成员。
- 共同的友元:需要访问两个类的私有数据。它可以是一个类的友元,同时是另一个类的友元。
class Analyzer; // forward declaration
class Probe
{
friend void sync(Analyzer & a, const Probe & p); // sync a to p
friend void sync(Probe & p, const Analyzer & a); // sync p to a
...
};
class Analyzer
{
friend void sync(Analyzer & a, const Probe & p); // sync a to p
friend void sync(Probe & p, const Analyzer & a); // sync p to a
...
};
// define the friend functions
inline void sync(Analyzer & a, const Probe & p)
{
...
}
inline void sync(Probe & p, const Analyzer & a)
{
...
}