2012-11-22 40 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 ;