请原谅我可能会问一个相当简单的问题,但是插入操作符在程序中实际上意味着什么?(如。cout <<
/cin >>
)
这取决于你如何为你的类重载它。
-
对于
std::cout
,使用<<
写入标准输出。>>
对std::cout
没有重载。所以std::cout >> x
会给出编译错误。 -
在
std::cin
的情况下,>>
用于从标准输入读取。<<
对std::cin
没有重载。所以std::cin << x
会给出编译错误。 -
对于您的自定义类,您可以重载
添加元素<<
或>>
,或者两者都重载,并且在函数中您可以做任何您喜欢的事情。例如,在下面的代码中,我为std::vector<T>
重载<<
以向vectortemplate<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!
所有的整数都加到向量上!
同样地,我们可以为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++ ) out << v[i] << ' '; 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] << ' ';
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对象与此操作符一起使用,则会导致添加。因此,如您所见:如何处理"<<"或">>"取决于操作符是如何重载的。
它们通常被重载并用于流。& lt; & lt;实际上是一个左移运算符。>>实际上是右移操作符