友元

36 篇文章 1 订阅

通常,类的共有方法提供了对类对象私有部分唯一的访问途径。
友元有三种:

  1. 友元函数
  2. 友元类
  3. 友元成员函数

友元函数

友元函数在类的声明中声明,在声明前加上friend关键字。
friend Time operator*(double m, const Time & t);

  • 虽然operator*()函数是在类声明中声明的,但它不是成员函数,因此不能使用成员运算符来调用;
  • 虽然operator*()函数不是成员函数,但它与成员函数的访问权限相同。
常用的友元:重载<<运算符
class Time
{
private: 
	int hours;
	int minutes;
public:
	...
	friend ostream & operator<<(ostream & os, const Time & t);	//声明
};
...
//友元函数定义不使用Time::限定符,因为友元函数不是成员函数。
ostream & operator<<(ostream & os,const Time & t)
{
	os<<h.hours<<" hours, "<<t,minutes<<" minutes";
	return os;
}

友元类

一个类A可以把另一个类B声明为自己的友元,类B的所有成员函数就都可以访问A类对象的私有成员。

  • 友元声明可以位于公有、私有或保护部分,其所在位置无关紧要。

友元成员函数

可以选择仅让特定的类成员成为另一个类的友元,而不必让整个类成为友元。

  • 注意:必须小心排列各种声明和定义的顺序。
    假设让Remote::set_chan()成为Tv类的友元,在Tv类声明中将其声明为友元:
class Tv
{
	friend void Remote::set_chan()(Tv & t, int c);
...
};

然而,友元声明和友元定义之间相互依赖,必须使用前向声明避开这种循环依赖,排列顺序如下:

class Tv;	//前向声明
class Remote { ... };
class Tv { ... };

必须先定义包含成员函数的类,才能将成员函数设为友元

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值