1

演算子は、オーバーロードすると、以前に定義されていた型の演算子の機能を失いますか、それとも新しい定義は呼び出したときにのみ適用されますか

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;
    }
4

2 に答える 2

2

あなたの場合、オーバーロードされている特定のタイプの動作のみを変更しますTreeNode *。オペレーターの既存のバージョンは、引き続き通常どおり機能します。

Left再帰呼び出しの場合:およびRightが型TreeNode *(または から派生したクラスへのポインター) である場合、演算子の新しい定義が使用されますTreeNode。それらが異なるタイプである場合、オペレータのデフォルト バージョンが使用されます。

Entry()が とは異なる型のオブジェクトを返すと思われますTreeNode *。その場合、 の標準定義operator<<が適用されます。

于 2012-11-22T01:51:36.767 に答える
1

演算子のオーバーロードは、その特定の演算子の機能と動作を永久に、または組み込みのデータ型に対して変更することを意味するものではありません。整数型で行う操作と同様に、ユーザー定義のデータ型で操作を実行するのが容易になるだけです。

たとえば、2 つの整数変数がある場合、次のように一方の値を他方の値に割り当てることができます。

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 ;
于 2012-11-22T01:53:26.900 に答える