C++ friend函数和friend类

本文介绍了C++中的friend函数,这类函数能访问类的private和public成员。强调了友元关系是授予的,而非对称或传递的。通过一个示例展示了如何使用friend函数修改类的private数据,阐述了友元声明的位置和注意事项,并讨论了友元函数的实现通常涉及头文件、执行文件和主函数的组织。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        类的friend函数(友元函数)在类的作用域之外定义却具有访问类的非public(以及public)成员的权限。单独的函数或者整个类都可以被声明为另一个类的友元。使用friend函数可以提高程序的性能。

定义友元函数:

       在类定义中函数原型前面加保留字friend,就将函数声明为该类的友元。比如:要将类ClassTwo的所有成员函数声明为类ClassOne的友元,应在ClassOne定义中加入如下的形式的一条声明:

       friend class ClassTwo;

注意点1:即使friend函数的原型在类定义内出现,友元仍然不是成员函数

注意点2:private ,public , protected 这些成员访问说明符标志与友元的声明无关,因此友元定义可以放到类的任何地方

注意点3:养成良好的编程友习惯,在类定义中把所有友元关系声明在最前面的位置,并且不要在其前面添加任何成员访问说明符!

友元关系是授予的不是索取的!

       对于类B是类A的友元,类A必须显示的声明类B是他的友元,另外,友元关系既不是对称的也不是传递的,即如果类A是类B的友元,类B是类C的友元,不能够推断出类A是类C的友元(有缘关系不是传递的),也不能推出类B是类A的友元(友元关系不是对称的),同时也不能推出类C是类B的友元(友元关系不是对称的)。

举例说明(使用friend函数修改类的private数据):

      在这个例子中,定义friend函数setX来设置Count类的private数据成员x。请注意,友元声明首先出现在类的定义中,甚至出现在public成员函数之前。再次说明,友元声明可以在类的任何地方。

#include <iostream>
using namespace std;

//Count 类定义
class Count
{
	friend void setX(Count &,int);//友元函数setX定义
public:
	//构造函数
	Count()
		:x(0)//初始化x为0
	{
		//空的函数体
	}

	void print()const
	{
		cout<<x<<endl;
	}
private:
	int x;
};


//setX函数可以更改count类的私有成员
//因为setX被定义为count类的友元函数
void setX(Count &c, int val)
{
	c.x= val;//将val变量的值赋给count类c对象的x数据成员
}

int main()
{
	Count counter;

	cout<<"counter.x 经过实例化后是:";
	counter.print();

	setX(counter,8);//使用友元函数
	cout<<"counter.x 使用setX友元函数后的值为:";
	counter.print();

	system("pause");
	return 0;
}

其运行结果是:

函数setX是一个c语言风格的独立函数——他不是Count类的成员函数。因此,对于counter对象,当setX被调用的时候,第41行将counter作为参数传递给setX,而不是语句 counter.setX(8) ;   一样的句柄来调用此函数。如果把友元的声明去掉,就会出现错误的信息,函数setX不能修改count类的私有成员。

一般情况下,我们将上述该程序分割成如下的三个文件:

  1. 一个头文件(比如:Count.h)包含Count类的定义,而在类的定义中又包含了friend函数setX的函数模型。
  2. 一个执行文件(比如:Count.cpp)包含Count类成员函数的定义以及friend函数setX的定义。
  3. 一个主函数(比如:main.cpp)含有main函数。

 

以上就是有关friend友元的基础知识,希望对大家有帮助。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值