当我重载它时,运算符是否会失去对之前定义的类型的运算符的能力,或者新的定义仅在我调用时适用
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;
}
答案 0 :(得分:2)
它只会更改其重载的特定类型的行为,在您的情况下为TreeNode *
。现有版本的运营商将继续正常运作。
对于递归调用:如果Left
和Right
类型为TreeNode *
(或指向从TreeNode
派生的类的指针,它将使用运算符的新定义)。如果它们的类型不同,则将使用运算符的默认版本。
我怀疑Entry()
会返回与TreeNode *
不同类型的对象。在这种情况下,operator<<
的标准定义将适用于它。
答案 1 :(得分: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 ;