除了换档,<< C++操作员还做什么?

What does the << C++ operator do, other than shifting?

本文关键字:lt 什么 操作员 C++      更新时间:2023-10-16

我在一个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 <<缩进<<0

我在谷歌上搜索了一下,但总是找到关于移位运算符的页面。

这是否与特殊形式的赋值有关?

找到答案的最简单方法是查看操作符应用于哪些类型。左操作数是QList<TreeItem*>,右操作数是TreeItem*。这应该会给你提示去查找QList的文档。

在文档中,您可以找到operator<<的规范:

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

这是一个重载函数。

将值附加到列表中。

因此,其中TQList中元素的类型,即TreeItem*, operator<<的重载获取对T的引用并将其添加到列表中。

这应该与用于插入输出流的比喻一致,例如std::cout << "Hello!";。也就是说,它通常被认为是一个插入操作符。另一方面,operator>>通常用于提取。然而,它在这里只是用作语法糖。

使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中没有包含这样一个工具的原因。

在c++中,可以重载操作符。所以& lt; & lt;Operator依赖于您在Operator重载上定义的其他内容。对于>>、+、-等其他操作符也是一样的

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