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;
    // ...

运算符在最后两行做了什么:parents << parentindentations << 0

我用谷歌搜索了一遍,但一直在谈论轮班操作员的页面上。

这是否与特殊形式的作业有关?

4

4 回答 4

14

找到答案的最简单方法是查看运算符应用于哪些类型。左操作数是 a QList<TreeItem*>,右操作数是 a TreeItem*。这应该会提示您查找.QList

在文档中,您将找到以下规范operator<<

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

这是一个过载功能。

将值附加到列表。

那么,T你的元素的类型在哪里QListTreeItem*也就是说,这个重载operator<<需要一个对 a 的引用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 回答