使用类 友元简介

来源:互联网 发布:u盘数据恢复后文件沒 编辑:程序博客网 时间:2024/05/19 13:29

C++提供了另外一种形式的访问权限:友元。友元有三种,友元函数 友元类 友元成员函数

通过让函数成为类的友元,可以赋予该函数与类的成员函数相同的访问权限。

为什么需要友元

   重载乘的时候,将一个Time对象和一个double值结合在一起的时候,限制了该操作符的使用方法,因为左侧的是调用对象

A=B*2.75;
被转化为

A=B.operator*(2.75);

但是编译器不能编译

A=2.75*B;

非成员函数不是由对象调用的,它使用的左右的值(包括对象),都是显示参数。

这样,上面的两个表达式都与下面非成员函数相匹配

A=operator*(2.75,B);

函数原型是

Time operator*(double m,const Time & t);

使用非成员函数可以按所需的顺序获得操作数,但是引发了一个新问题,非成员函数不能直接访问类的私有数据,至少常规成员函数不能访问。但是,有一类特殊的非成员函数可以访问类的私有成员,它们被称为友元函数。


创建友元

将其原型放在类声明中,并在声明前加上关键字friend

friend Time operator*(double m,const Time & t);
该原型声明意味着两点:虽然operator*()函数是在类声明中声明的,但它不是成员函数,因此不能使用成员操作符来调用。 虽然operator*()函数不是成员函数,但它与成员函数的访问权限相同。

编写函数定义。 因为他不是成员函数,所以不要使用Time::限定符。另外,不要在定义中使用关键字friend,定义如下:

Time operator*(double m,const Time &t){Time result;long totalminutes=t.hours*mult*60+t.minutes*mult;result.hours=totalminutes/60;result.minutes=totalminutes%60;return result;}
只有类声明可以决定哪一个函数是友元,因此类声明仍然控制了哪些函数可以访问私有数据。简而言之,类方法和友元只是表达类接口的两种不同机制。

0 0
原创粉丝点击