为何需要友元?
在为类重载二元运算符时(带两个参数的运算符),常常需要友元
例子
该例子中重载了*运算符,需要一个double类型的参数
#ifndef __TIME_H__
#define __TIME_H__
class TIME
{
private:
int nHours;
int nMinutes;
public:
TIME();
TIME(int H, int M);
void SetTime(int H, int M);
void ShowTime(void) const;
TIME operator+(const TIME & t) const;
TIME operator*( double b) const;
};
#endif
TIME TIME::operator*( double b) const
{
TIME Result;
long TotalMinutes = nHours * b * 60 + nMinutes * b;
Result.nHours = TotalMinutes/60;
Result.nMinutes = TotalMinutes%60;
return Result;
}
#include "Time.h"
int main(int argc, char* argv[])
{
TIME a(1,50);
TIME b(2,10);
TIME c = a * 10.3 ;
c.ShowTime();
return 0;
}
当操作符的左边给出的是对象,右边给出的是double变量时,没有错误
因为他是转化成 c = a.operator(10.3);*
但是T IME c = 10.3 * a ; 将引发错误
解决这个问题可以有两种方法
①时刻牢记 左边应该是调用对象
②用可以访问类私有成员的 非成员函数 :友元函数