什么<<除了转移之外,C ++运算符呢?

时间:2013-05-12 17:55:53

标签: c++ operators

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

运营商在最后两行做了什么:父母&lt;&lt;父母缩进&lt;&lt; 0

我用Google搜索,但继续登陆有关轮班操作员的网页。

这是否与专门的作业形式有关?

4 个答案:

答案 0 :(得分:14)

找到答案的最简单方法是查看应用运算符的类型。左操作数是QList<TreeItem*>,右操作数是TreeItem*。这应该为您提供查找the documentation for QList的提示。

在文档中,您会找到the specification for operator<<

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

这是一个重载功能。

     

将值附加到列表中。

所以,TQListTreeItem*的元素类型operator<<T的这个重载会引用std::cout << "Hello!";并将其添加到列表中。

这应该与用于插入输出流的比喻一致,例如与operator>>一致。也就是说,它通常被认为是插入运算符。另一方面,{{1}}通常用于提取。但是,它实际上只是用于语法糖。

答案 1 :(得分: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中的原因。

答案 2 :(得分:1)

在C ++中,您可以重载运算符。所以&lt;&lt;运算符取决于您在运算符重载上定义的任何其他内容。对于其他运算符也是如此,例如&gt;&gt;,+, - 等

答案 3 :(得分:1)

&LT;&LT;在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.