【发布时间】:2011-12-07 02:55:26
【问题描述】:
请原谅我可能提出了一个相当简单的问题,但是插入运算符在程序中的实际含义和作用是什么? (例如cout << / cin >>)
【问题讨论】:
标签: c++
请原谅我可能提出了一个相当简单的问题,但是插入运算符在程序中的实际含义和作用是什么? (例如cout << / cin >>)
【问题讨论】:
标签: c++
这取决于你如何为你的班级重载它。
在std::cout 的情况下,<< 用于写入标准输出。 >> 没有为 std::cout 重载。所以std::cout >> x 会报编译错误。
如果是std::cin,>> 用于从标准输入读取。 << 没有为 std::cin 重载。所以std::cin << x 会报编译错误。
对于您的自定义类,您可以重载<< 或>>,或者两者都重载,并且在函数中您可以做任何您喜欢的事情。例如,在下面的代码中,我为std::vector<T>重载了<<,为vector添加元素,
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!
【讨论】:
它们是按位移位运算符(<< 是左移,>> 是右移)。它们通常也被重载为流操作符(<< 表示流出,>> 流入)——流类型位于左侧(例如std::ostream 或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
它对所有标准类型都进行了重载。
大多数人会为自己的用户定义类型覆盖它们。
注意:运算符的左侧可以是任何流类型(例如 std::fstream 或 std::stringstream),因此它成为对象序列化的通用机制。
【讨论】:
它们经常被重载并用于流。 > 实际上是一个右移运算符。
【讨论】:
> 是简单的运算符,就像 +、-、=、==、+=、/= 等,你会得到练习。这意味着,它取决于您使用它的对象/结构。使用 cout 和 cin 这些是读/写运算符,但您可能会重载运算符以执行完全不同的操作。
class myclass {
int x;
myclass operator << ( int a ) {
x += a;
}
}
现在,我并不是说任何人都应该这样做,但是如果您将 myclass 对象与此运算符一起使用,这将导致添加。所以,正如你所看到的:你用“>”做什么取决于操作符是如何重载的。
【讨论】: