问题就在标题中;我确定有一个逻辑性的解释,但现在我却被难住了!
cout << "Output sentence"; // prints Output sentence on screen
cout << 120; // prints number 120 on screen
cout << x; // prints the content of x on screen
<< 运算符将其后面的数据插入到其前面的流中。在上面的示例中,它将常量字符串“Output sentence”、数值常量120和变量x插入到标准输出流cout中。
标准输入设备通常是键盘。在C++中处理标准输入是通过在cin流上应用重载的提取运算符(>>)来完成的。该运算符必须跟随将存储从流中提取的数据的变量。例如:
int age;
cin >> age;
我假设你知道C++允许运算符重载。通常,只有在语义完全可转移的情况下才会重载运算符(例如,为向量类重载加法以将两个向量相加)。我认为你的问题是关于为什么要使用位移运算符,重载它们用于iostream,并赋予它们完全不同于原始目的的含义。之所以可以这样做,是因为位移操作与iostreams的功能相差甚远,没有人会混淆<<或>>是否对iostream进行位移。而且它们方便使用的原因也是因为它们的顺序是先评估左边的操作数,然后是右边的操作数,再执行操作。当您使用运算符从iostream中附加或提取内容时,这符合您想要发生的情况。
但是,对于最初的问题,为什么?我真的不知道,对我来说,<<和>>似乎很容易理解,它们将信息从一个实体中取出并放入另一个实体中。为什么原因需要比这更复杂?使用它们看起来很明智,因为它们的含义是显而易见的...你还能要求运算符更好的含义吗?
<<
和 >>
操作符左右两边的执行顺序不能保证。有时候人们会写类似于 s << foo() << bar()
的代码,并期望先调用 foo
函数再调用 bar
函数,这种情况可能会导致 bug 的出现。但是可以保证的是,foo
函数的结果会在 bar
函数的结果之前被发送到流中,但计算顺序是不确定的。只有 ,
、||
和 &&
二元操作符提供了这样的保证... 而且这种保证仅在你没有重载它们的情况下才存在。 - 6502
read()
和write()
这样的函数怎么处理?我认为用户自定义运算符应该具有与内置运算符类似的语义,例如+
可以用于添加复数或几何向量。但是ostream::operator<<
与位移操作无关。一些早期的 C++ 设计决策现在被认为存在问题,例如自动生成复制构造函数如果存在析构函数,则不一定需要在operator<<
的选择中体现出逻辑相关性。 - Philipp