c++友元

64 篇文章 0 订阅

友元的种类

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)
{
    ...
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值