原谅我可能会提出一个相当简单的问题,但插入运算符在程序中实际意味着什么呢? (例如cout <<
/ cin >>
)
答案 0 :(得分:14)
这取决于你如何为你的课程重载。
如果是std::cout
,<<
用于写入标准输出。 >>
没有超载std::cout
。因此std::cout >> x
会出现编译错误。
如果是std::cin
,>>
用于从标准输入中读取。 <<
没有超载std::cin
。因此std::cin << x
会出现编译错误。
对于您的自定义类,您可以重载<<
或>>
或两者,并在该函数中可以执行任何您喜欢的操作。例如,在以下代码中,我为<<
重载std::vector<T>
以向向量添加元素,
template<typename T>
std::vector<T> & operator<<(std::vector<T> & v, T const & item)
{
v.push_back(item);
return v;
}
现在我可以使用这个重载来写这个:
std::vector<int> v;
v << 1 << 2 << 3 << 4 << 5; //inserts all integers to the vector!
所有整数都被添加到向量中!请参阅在线演示:http://ideone.com/TsqtS
同样,我们可以为>>
重载std::vector<T>
以打印其中的所有项目:
template<typename T>
std::vector<T> & operator>>(std::vector<T> & v, std::ostream & out)
{
for(size_t i = 0 ; i < v.size(); i++ )
std::cout << v[i] << std::endl;
return v;
}
现在我们可以将矢量打印为:
v >> std::cout; //crazy!
关键是你可以以任何你想要的方式重载这些运算符。超负荷和它们的使用看起来多么疯狂或理智取决于你。例如,对于大多数程序员来说,语法v >> std::cout
看起来会很疯狂,我猜。对于std::ostream
来说,更好且可能更理智的重载是:
template<typename T>
std::ostream & operator << (std::ostream & out, const std::vector<T> & v)
{
for(size_t i = 0 ; i < v.size(); i++ )
out << v[i] << std::endl;
return out;
}
现在你可以这样写:
std::cout << v << std::endl; //looks sane!
答案 1 :(得分:2)
它们是按位移位运算符(<<
向左移位,>>
向右移位)。它们也常常被重载为流媒体运营商(<<
然后意味着流出,>>
流入) - 左侧有流类型(例如std::ostream
或std::istream
)以及右侧的任何其他类型。
答案 2 :(得分:1)
写入或读取对象;
std::cout << 5; // writes the integer 5 to the standard output
int x;
std::cin >> x; // reads an integer from the standard input
所有标准类型都超载 大多数人都会根据自己的用户定义类型覆盖它们。
注意:运算符的左侧可以是任何流类型(例如std :: fstream或std :: stringstream),因此它成为对象序列化的通用机制。
答案 3 :(得分:1)
&LT;&LT;和&gt;&gt;是简单的运算符,就像+, - ,=,==,+ =,/ =等,你得到了演练。这意味着,它取决于您使用它的对象/结构。使用cout和cin这些是读/写操作符,但是你可能会使操作符超载以完成不同的操作。
class myclass {
int x;
myclass operator << ( int a ) {
x += a;
}
}
现在,我没有说任何人都应该这样做,但如果你将myclass对象与此运算符一起使用,这将导致添加。所以,你可以看到:你用“&lt;&lt;”做什么或“&gt;&gt;”取决于运算符的过载方式。
答案 4 :(得分:0)
它们经常被重载并用于流。 &LT;&LT;实际上是一个左移算子。 &GT;&GT;实际上是一个右移操作员。