c++ 的操作符重载 operator有关问题 看c++ ,primer的疑问

c++ 的操作符重载 operator问题 看c++ ,primer的疑问
比如有这样的一个类
class Time
{
int hour;
int min;
public:
Time();
Time (int h,int m):hour(h),min(m){}
void set()
{
cin>>hour>>min;
}
friend Time operator *(const Time &h,const Time& t)
{
return Time(h.hour*t.hour,t.min*h.min);
}
friend ostream& operator<<(const Time t,ostream& out)
{
out<<t.hour<<" "<<t.min<<endl;
return out;
}
friend istream& operator>>(Time t,istream & in)
{
in>>t.hour>>t.min;
}
friend Time operator +(const Time &t1,const Time &t2)
{
Time t(t1);
t.hour+=t2.hour;
t.min+=t2.min;
return t;
}
};
我要重载+,拿掉friend会报错,成员函数参数太多,可为什么c++ primer 和effective c++ 的第19条款在说明重载时举的例子均是两个参数,且没加friend 不是很理解

------解决方案--------------------
如果定义成成员函数,就是通过对象调用+运算符。所以已经传递了一个参数(*this)。所以你只要在传递一个形参就行。
这样定义有一个缺点就是需要通过对象去调用函数。导致运算符左边必须是类的对象···
------解决方案--------------------
楼上说的基本正确了
------解决方案--------------------
友元函数不是类的成员,只是特别地充许这个函数访问非公有成员。
所以,
firend Time operator *(const Time &h,const Time& t){...}//OK!友元,可以有两个参数

Time operator *(const Time &h,const Time& t)//错误,只能有一个参数。


<<effective c++>>里采取的是非友元函数,而是在类外定义重载(应用公共接口hour() min()) 。