2

いくつかの << 演算子を含む Qt サンプルの C++ スニペットを見ました。私はビットシフトを認識していますが、これらが何か他のことをしていることは明らかです:

このリンク: http://qt-project.org/doc/qt-4.8/itemviews-simpletreemodel-treemodel-cpp.htmlには、次のようなコードがあります。

void TreeModel::setupModelData(const QStringList &lines, TreeItem *parent)
{
    QList<TreeItem*> parents;
    QList<int> indentations;
    parents << parent;
    indentations << 0;
    // ...

演算子は最後の 2 行で何をしますか: parent << parent and indentations << 0

私はグーグルで検索しましたが、シフトオペレーターについて話しているページに着陸し続けます.

これは、特殊な形式の割り当てと関係がありますか?

4

4 に答える 4

14

答えを見つける最も簡単な方法は、演算子が適用されている型を調べることです。左のオペランドは aQList<TreeItem*>で、右のオペランドは aTreeItem*です。これにより、 のドキュメントQListを検索するためのヒントが得られるはずです。

ドキュメントには、次の仕様がありoperator<<ます。

QList<T> & QList::operator<< ( const T & value )

これはオーバーロードされた関数です。

リストに値を追加します。

したがって、Tは の要素の型でありQList、これは ですTreeItem*。この のオーバーロードはoperator<<、 への参照をT取得し、それをリストに追加します。

これは、 with など、出力ストリームへの挿入に使用されるメタファと一致するはずstd::cout << "Hello!";です。つまり、挿入演算子と見なされることがよくあります。一方、は抽出operator>>によく使用されます。ただし、ここでは構文糖衣として使用されているだけです。

于 2013-05-12T17:58:27.597 に答える
2

C++ ポリモーフィズムをより強力にし、時には誤用されていると主張するもののいくつかは、言語に含まれる一般的な演算子のいくつかにカスタム実装を提供できるようにする演算子のオーバーロードです+, -, <<,

これの例は次のとおりです。

std::ostream& operator << (std::ostream &out, RationalNumber &fraction)
{
    return out << fraction.getNumerator() << "/" << fraction.getDenominator();
}


bool RationalNumber::operator == ( const RationalNumber & right )
{
    return (this->Numerator == right.Numerator && this->Denominator == right.Denominator ? true:false);
}

ご覧のとおり、これにより、オペレーターの最初の意味とは関係のないことを含め、オペレーター内で必要なことを何でも実行できるようになります。これが、私が読んだことによると、そのようなツールが Java に含まれていない理由です。

于 2013-05-12T18:00:45.373 に答える
1

C++ では、演算子をオーバーロードできます。したがって、 << 演算子は、演算子のオーバーロードで定義した他のものに依存します。>>、+、-などの他の演算子についても同じです

于 2013-05-12T18:00:25.040 に答える
1

<< は QList でオーバーライドされます

QTリファレンスマニュアルから:

**QList<T> & QList::operator<< ( const QList<T> & other )**
Appends the items of the other list to this list and returns a reference to this list.

See also operator+=() and append().

**QList<T> & QList::operator<< ( const T & value )**
This is an overloaded function.

Appends value to the list.
于 2013-05-12T18:00:54.467 に答える