我们在定义一个类的时候,为了使用方便,希望通过<<打印类的相关信息,需要重载<<运算符
一般运算符重载都设计为类的member function,但是operator<<却不能这样设计,Essential C++中解释如下:
为什么不把output运算符设计为一个member function呢?因为作为一个member function,其左侧操作数必须是隶属同一个class之下的对象,如果output运算符被设计为menber function,那么该类的对象必须被置于output运算符的左侧:
object << cout << endl;
这种形式不符合常规代码书写规范,所以不建议这样做。
以我的理解是因为member function默认有一个this指针的传入,导致默认将this指针对象作为了左操作数。
为了解决这个问题,只能定义为非成员函数,举例如下:
template <typename valType>
inline ostream& operator<< (ostream &os, const BinaryTree<valType> &bt) {
os << "Binary Tree: " << endl;
bt.print( os );
return os;
}
只要在h文件或者cpp文件中定义这个操作符,在使用<<进行类输出时,根据参数列表类型匹配,还是会调用这个重载函数,达到输出目的。