いずれの演算子も基本的に関数です。引数は、我々が誤って、オペランド自体を変更しないことを確認するには、ここconst
に作られていること、
class Rational
{
private:
...
...
public:
...
//Implicit arg "this" is Left Hand operand.
//Explicitly stated arg objRational is Right Hand operand.
Rational operator+(const Rational& objRational) const {...};
...
};
は注意してください。例えば 、合理的なクラスのための加算演算子オーバーロードされた演算子+は、メンバ関数として表現されることがありますまた、const
というマークを付けて、this
オブジェクトを変更しないようにしています。 Argはrefで渡されます。なぜなら、私たちが確かにそれを変更していなければ、コピーする必要はなく、refに害はないからです。あなたはその後、ちょうど糖衣構文が
Rational r3 = r1 + r2;
と同じコールを許可するためにC++の文法に追加されます
Rational r1(3, 4), r2(22, 7);
Rational r3 = r1.operator+(r2); //Really possible! Try it!
ような何かを行うことができますので
上記は、技術的機能であります
あなたが書きました
cout << *temp ;
(*temp)
のタイプノードでの
、およびcout
はostream
クラスのオブジェクトです。
コンパイラは、左オペランドであるostream
オブジェクトと右オペランドであるNode
オブジェクトを持つオーバーロードされた演算子を探しています。
だから、それは我々が最初の場所でクラスのostreamを書いていないので、我々は、その可能性を持っていない、どこかのクラスのostream自体の内部、
class ostream : ...
{
...
...
//Here, the only one explicit arg is Node,
//which is Right Hand side operand.
//Since it is a member operator,
//implicit arg "this" will be, by default, the LH operand.
public ostream& oprtator<<(const Node& objNode){...}
...
}
書き込みと同じくらい良いですが。それが書かれたとき、あなたのノードは存在しませんでした!また、Nodeクラスのメンバーではない関数に対しては許可されないobjNodeのプライベートメンバーにアクセスする必要があるかもしれません。
Nodeクラスのメンバーとして配置しようとすると、Nodeのプライベートメンバーにアクセスできます。しかし、今度はoperator<<
の左手オペランドはノードでなければならず、これは目的を全滅させます。
私たちがやっていることは、それを友人の機能にすることです。
class Node
{
...
...
public:
...
//Since this is NOT a member, bot LH and RH operand need to be stated explicitelty
friend ostream& operator<< (ostream& out, const Node& objNode) { out << node.data; return out; }
...
};
これはostream
と右オペランドnode
オペランドを残しているし、それは友人だからこれは、ノードのプライベートメンバーにアクセスすることができoperator<<
を作成します。 (^_^)
なぜ受け入れと返信 ostreamオブジェクトの参照?
コールをチェーンしようとすると、同じオブジェクトにシリアルに書き込まれる必要があるためです。
文を考えてみましょう:cout << "First: " << objNode1 << ", Second: " << objNode2;
それぞれの呼び出しのために、私たちは以前のすべてを持っているオーバーロードされた演算子に渡されるostream
オブジェクトを必要とし、裏返しから
(
(
(
cout << "First: " //Innermost call
) << objNode1
) << ", Second: "
)<< objNode2;
として評価されます内部コールは、変更された(挿入後の)オブジェクトostream
への参照を返す必要があります。
希望します。ハッピーコーディング:)
標準ライブラリに 'Node'の' <<'オーバーロードはありません。あなたはまた、 'Node * temp = new Node;'をリークします – user4581301
次にノードの値を見てから、私は今宣言しましたか? ありがとう! –
'Node'を扱うための独自の' << '演算子を書く必要があります。 Stream(Bitshift)演算子を参照してください。https://stackoverflow.com/questions/4421706/what-are-the-basic-rules-and-idioms-for-operator-overloading – user4581301