2022.7.13 C++——友元

1. 友元的定义及特点

1.2 友元定义

(1)友元(friend)机制允许一个类授权其他的函数访问它的非公有成员,也就是,加上友元后,可以访问类私有和保护成员;
(2)友元声明以关键字friend开头,它只能出现在类的声明中,它们不受其在类体中的公有(public),私有(private)以及保护(protected),也就是,加上友元后,不管是公有,私有还是保护成员,都可以进行访问。

1.2 友元的特点

(1)不具有对称性:A是B的友元,并不意味着B是A的友元;
(2)不具有传递性:A是B的友元,B是C的友元,但A不是C的友元;
(3)不具有继承性:Base类型继承Object类型,如果Object类型是A的友元,但Base类型不是A的友元。

2. 友元的应用特点

2.1 外部函数友元

在这里插入图片描述
运行结果:
在这里插入图片描述
运行Int a(10),先调用类中带参的构造函数,然后调用Print进行值打印,结束后再调用析构函数。
在上面的程序中,实际上fun是一个外部函数,通过友元关键字将fun注册为类的友元函数,这样的话,可以对类中的私成员进行访问,并且友元函数不含有this指针,因为只有类的成员函数才含有this指针。

2.2 成员函数友元

class Base;
class Object
{
public:
	void fun(Base& base);
};
class Base
{
private:
	int value;
public:
	Base(int x = 0) :value(x)
	{
		cout << "create Base: " << this << endl;
	}
	~Base()
	{
		cout << "destroy  Base: " << this << endl;
	}
	friend void Object::fun(Base& base);
};
void Object::fun(Base& base)
{
	base.value += 10;
}

int main()
{
	Object obj;
	Base a(10);
	obj.fun(a);
	return 0;
}

其中成员函数友元:
在这里插入图片描述
在类object中,声明fun函数,并且在Base之后写该函数的功能:
在这里插入图片描述
总结:
(1)友元函数不是类的成员函数,在函数体中访问对象的成员,必须用对象名加运算符“.”加对象成员名,但友元函数可以访问类中的所有成员,公有,私有以及保护,一般的函数只能访问类中的公有函数;
(2)友元函数不受类中的访问权限关键字限制,可以把它放在类的公有,私有,保护部分,但结果一样。
(3)某类的友元函数的作用域并非该类作用域,如果该友元函数是另一类的成员函数,则其作用域为另一类的作用域,否则与一般函数相同。

2.3 类友元

整个类可以是另一个类的友元,友元类的每个成员函数都是另一个类的友元函数,都可以访问另一个类中的所有成员,公有、私有或保护数据成员。
如:

class Object;
class Int
{
	friend class Object;
private:
	int value;
public:
	Int(int x = 0) :value(x)
	{
		cout << "create Int: " << this << endl;
	}
	~Int()
	{
		cout << "destroy Int: " << this << endl;
	}

};
class Object
{
public:
	void Print(const Int& it)
	{
		cout << it.value << endl;
	}
};
int main()
{
	Int a(10);
	Object obj;
	obj.Print(a);

	return 0;
}

运行结果:
在这里插入图片描述
其中类友元为:
在这里插入图片描述
这样设置的话,Object这个类是Int的友元函数,那也就说明Int可以访问Object中的所有成员,包括公有、私有以及保护。
总结:整个类可以是另一个类的友元,也就是说友元类的每个成员函数都是另一个类的友元函数,都可访问另一个另一个类的所有成员,公有,保护或私有数据成员。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值