friend是C++中封装的漏网之鱼。
C++中的friend允许其他的类或者是函数访问本类的任何成员,甚至是private成员,只要该类声明其为友元。
可是,在有些情况下,并不是允许外界访问类的内部实现而使用友元。
这就是在 “模板定义” 与 “隐式类型转换” 之间的一个trick了。
首先,看一个简单的有理数的模板类,该类定义了有理数,并且实现有理数的乘法。
注:下述代码中,将operator*声明为非成员函数,是因为
“如果你需要对成员函数所有的参数(所有的,当然也就包括this指针啦)进行类型转换,那么将该函数声明为非成员函数”。
也就是说,只有当参数位于参数列的时候,这个参数才是隐式类型装换的合格参与者。
updated:这里的参数列指的就是函数的形参列表!!!但是类的成员函数的那个隐式参数(即this指针)不是隐式转换的合格参与者!!!
这对C++模板类同样适用。
template
class Rational
{
private:
int numerator;
int denominator;
public