c语言friend函数,C++ friend函数和friend类

类的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

using namespace std;

//Count 类定义

class Count

{

friend void setX(Count &,int);//友元函数setX定义

public:

//构造函数

Count()

:x(0)//初始化x为0

{

//空的函数体

}

void print()const

{

cout<

}

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.print();

setX(counter,8);//使用友元函数

cout<

counter.print();

system("pause");

return 0;

}

其运行结果是:

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

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值