【问题标题】:In C++, after overloading operator, does the operator lose its old functionality?在 C++ 中,重载运算符后,运算符是否会失去其旧功能?
【发布时间】:2012-11-22 01:50:23
【问题描述】:

当我重载一个运算符时,它是否会失去对之前定义的类型进行运算符的能力,或者新定义是否仅在我调用时适用

cout << that_specific_class_type_variable

如果我写cout &lt;&lt; that_specific_class_type_variabe-&gt;Left()会是重载函数还是正常的cout语句?

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

【问题讨论】:

    标签: c++ class operator-overloading


    【解决方案1】:

    它只会改变它重载的特定类型的行为,在你的情况下,TreeNode *。现有版本的运算符将继续正常运行。

    对于递归调用:如果LeftRight 的类型为TreeNode *(或指向从TreeNode 派生的类的指针),它将使用您对运算符的新定义。如果它们属于不同类型,则将使用默认版本的运算符。

    我怀疑Entry() 返回的对象类型不同于TreeNode *。在这种情况下,operator&lt;&lt; 的标准定义将应用于它。

    【讨论】:

    • 如果我想正常计算该类的成员变量。我会简单地编写普通的 cout 函数吗?
    • 这取决于你应用它的数据类型。我猜LeftRight 也是TreeNode*,在这种情况下它会递归地应用你的operator&lt;&lt;。但Entry() 可能返回不同的数据类型,在这种情况下,标准operator&lt;&lt; 将应用于它。
    【解决方案2】:

    运算符重载并不意味着永远改变特定运算符或内置数据类型的功能和行为。 它仅有助于您对用户定义的数据类型执行类似于对整数类型执行的操作。

    例如,如果您有两个整数变量,您可以像这样将一个赋值给另一个。

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

    同样,您可能还希望自己的数据类型具有类似的行为,以提高效率和易于使用。

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

    至于输出,您使用&lt;&lt; 运算符重载cout 以像这样输出对象的数据。

    cout << obj1 ;
    

    如果你想在你的整型类中输出变量,如果它们是公共成员,你可以这样做。

    cout << myVar << endl ;
    

    如果他们是私人成员,也可以这样。

    cout << getmyVar() << endl ;
    

    【讨论】:

      猜你喜欢
      • 2012-11-26
      • 1970-01-01
      • 1970-01-01
      • 2021-07-01
      • 2016-02-19
      • 1970-01-01
      • 1970-01-01
      • 2012-09-04
      相关资源
      最近更新 更多