我在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搜索,但继续登陆有关轮班操作员的网页。
这是否与专门的作业形式有关?
答案 0 :(得分:14)
找到答案的最简单方法是查看应用运算符的类型。左操作数是QList<TreeItem*>
,右操作数是TreeItem*
。这应该为您提供查找the documentation for QList
的提示。
在文档中,您会找到the specification for operator<<
:
QList<T> & QList::operator<< ( const T & value )
这是一个重载功能。
将值附加到列表中。
所以,T
是QList
中TreeItem*
的元素类型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.