2012-11-22 39 views
1

是否操作員,當我超載了,失去其操作能力類型它是爲之前定義的,還是新的定義,只有當我打電話在C++中,運算符重載後,運算符是否會失去舊功能?

cout << that_specific_class_type_variable 

如果我寫cout << that_specific_class_type_variabe->Left()將它重載函數應用或正常的cout聲明?

ostream& operator<< (ostream& out, TreeNode* tptr) 
    { 
    if(tptr!=NULL) 
    { 
     operator<<(out,tptr->Left()); 
     out<<(*(tptr->Entry())); 
     operator<<(out,t->Right()); 
    } 
    return out; 
    } 

回答

2

它只會改變它超載的特定類型的行爲,在你的情況下,TreeNode *。操作員的現有版本將繼續正常工作。

對於遞歸調用:它將會使用新的運營商的定義,如果LeftRightTreeNode *類型(或指針從TreeNode派生的類)。如果它們屬於不同類型,則將使用操作員的默認版本。

我懷疑Entry()返回一個不同於TreeNode *類型的對象。在這種情況下,operator<<的標準定義將應用於它。

+0

如果我想正常cout該類的成員變量。我會簡單地寫出正常的cout函數嗎? – user1722022

+0

它取決於您將其應用於的數據類型。我猜'Left'和'Right'也是'TreeNode *',在這種情況下,它會遞歸地應用你的'operator <<'。但是'Entry()'可能會返回一個不同的數據類型,在這種情況下,標準的'operator <<'將應用於它。 – jogojapan

+0

好吧,現在我非常感謝 – user1722022

1

運算符重載並不意味着永遠改變該特定運算符的功能和行爲,也不意味着內置數據類型。 它只會幫助您對用戶定義的數據類型執行操作,類似於您在整型類型上執行的操作。

例如,如果您有兩個整數變量,您可以像這樣分配一個另一個的值。

int a = 5 ; 
int b = 7 ; 
b = a ; 

同樣,您可能還希望自己的數據類型的行爲如此高效且易於使用。

//Hypothetical class 
myClass obj1 (5, "abc") ; 
myClass obj2 (109, "xyz") ; 
......... 
...... 
obj2 = obj1 ; 

至於輸出,你cout<<運算符重載輸出你的對象這樣的數據。

cout << obj1 ; 

如果你想輸出你的整型類中的變量,你可以這樣做,如果它們是公共成員。

cout << myVar << endl ; 

或者像這樣,如果他們是私人成員。

cout << getmyVar() << endl ;