我們在定義一個類的時候,爲了使用方便,希望通過<<打印類的相關信息,需要重載<<運算符
一般運算符重載都設計爲類的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文件中定義這個操作符,在使用<<進行類輸出時,根據參數列表類型匹配,還是會調用這個重載函數,達到輸出目的。