原谅我可能会问一个相当简单的问题,但是插入算子在程序中实际意味着什么呢?(例如cout <</ cin >>)
Naw*_*waz 16
这取决于你如何为你的课超重.
在用的情况下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;
}
Run Code Online (Sandbox Code Playgroud)
现在我可以使用这个重载来写这个:
std::vector<int> v;
v << 1 << 2 << 3 << 4 << 5; //inserts all integers to the vector!
Run Code Online (Sandbox Code Playgroud)
所有整数都被添加到向量中!参见在线演示: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;
}
Run Code Online (Sandbox Code Playgroud)
现在我们可以将矢量打印为:
v >> std::cout; //crazy!
Run Code Online (Sandbox Code Playgroud)
在线演示:http://ideone.com/BVSm7
关键是你可以以任何你想要的方式重载这些运算符.超负荷和它们的使用看起来多么疯狂或理智取决于你.例如,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;
}
Run Code Online (Sandbox Code Playgroud)
现在你可以这样写:
std::cout << v << std::endl; //looks sane!
Run Code Online (Sandbox Code Playgroud)
它们是按位移位运算符(<<左移,>>右移)。它们通常也作为流操作符重载(<<然后意味着流输出,>>流输入)——流类型在左侧(例如std::ostreamor std::istream)和任何其他类型在右侧。
它写入或读取对象;
std::cout << 5; // writes the integer 5 to the standard output
int x;
std::cin >> x; // reads an integer from the standard input
Run Code Online (Sandbox Code Playgroud)
它对于所有标准类型都是重载的。
大多数人会为自己的用户定义类型覆盖它们。
注意:运算符的左侧可以是任何流类型(例如 std::fstream 或 std::stringstream),因此它成为对象序列化的通用机制。