鶸断腕(一)

友元函数

在进行类和普通值的加减乘除时我们通常会重载运算符来使代码更加优美而不是用什么 multiplication (int a ,const b & t) 来进行运算

即设 A 和 B 都是某个Time类,A = B * 2.75 成功的前提是已经在Time类里面定义函数:

Time Time :: operator * (double mult) const
//1.其中const是指该函数不能修改类中的值
//2.若Time类被声明为const,那么外界只能访问这种const函数

然鹅,下面的语句怎么办?

A = 2.75 * B

这时就需要一个函数处理这种情况,而且这种函数可以访问 B 中的数据,这个函数就是友元函数,该函数原型为:

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

在类中的public中声明:

class Time
{
private:
int hours;
public:
Time(int h);
friend Time operator* (double m, const Time& t);
}

函数定义:

Time operator* (double m, const Time& t)
{
Time result;
/*代码块*/
return result;
}

注意:这里可以看到友元函数虽然可以访问类里面的 private 数据,但是它并不是类里面的方法,因此 this 指针无法调用该方法。

友元是否违背OOP?

显然是没有的,看起来好像打破了数据封装原则,但是决定权依然在类的手上(友元函数在类中声明)应该把友元函数看出成类的扩展接口

实际上也可以不用这么麻烦,也可以定义一个非友元函数来实现:

Time operator*(double m,const Time &t)
{
return t* m; //用 t.operator* (m)
}

常用的友元:重载 << 运算符

说白了就是让输出更加简单:

ostream & operator << ( ostream & os ,const Time & t ) { os << t.hours << "hours" << t.minutes << "minutes" ; return os; //返回ostream类的引用 }

发布者

我乃堂堂SCUT的一条咸鱼!

发表评论

电子邮件地址不会被公开。 必填项已用*标注