在C++中,我们如何将插入运算符和其他运算符链接在一起

How are we allowed to chain together the insertion operator and other operators in general in C++?

本文关键字:运算符 插入 其他 在一起 链接 C++ 我们      更新时间:2023-10-16

我试图理解C++中的底层过程,它允许我们在C++中形成以下表达式:

cout << "Hello," << "World" << a + b;

根据我的理解,首先,插入运算符将ostream对象cout和字符串文字"Hello"作为操作数,表达式返回类型为cout,因此cout现在是下一个字符串文字的类型,最后也是表达式a + b的类型。

我很难理解这个过程的技术细节,我知道有参考文献可以让我们这样做吗?

根据我的理解,首先,插入运算符将ostream对象cout和字符串文本"Hello"作为操作数,表达式返回一种类型的cout。。。

到目前为止很好。。。

,因此cout现在是下一个字符串文字的类型,最后也是表达式a+b的类型。

我不确定你想说什么。如果操作员按照优先级分组,也许会有所帮助:

(((cout << "Hello,") << "World") << (a + b));

第一次调用operator<<时,它的参数是cout"Hello",正如您所说。返回cout。然后,第二次,自变量是cout(上一次的结果)和"World"。然后,第三次,自变量是couta + b的结果。

也许使用(技术上不正确,请参阅@DavidRodríguez-dribeas的评论)函数调用语法来重写代码会有帮助:

operator<<(operator<<(operator<<(cout, "Hello,"), "World"), a + b);

因为每次调用operator<<都会返回cout,所以每次调用的第一个参数将是cout

您可以将<<运算符看作是在stdio函数中实现的(现在只考虑字符串):

ostream &operator <<(ostream &stream, const string &data)
{
fprintf(stream, "%s", data.c_str());
return stream;
}

由于fprintf的第一个参数应该是FILE*,而不是ostream,所以此代码不能完全按照编写的方式工作。但这并不重要。与您的问题相关的重要部分是末尾的return stream;,它将您传递回的流返回给调用者。有了这个,你就可以把电话串在一起。

表达式

cout << a << b;

与相同

(cout << a) << b;

(cout << a)的结果再次为cout(加上实际打印a的值的副作用)。

移位运算符<<从左到右分组。所以陈述

cout << "Hello," << "World" << a + b;

对应于表达式

( ( ( cout << "Hello," ) << "World" ) << a + b );

表达中

cout << "Hello,"

使用了重载运算符函数<lt;对于类型std::basic_ostream的左操作数和类型const char *的右操作数

template<class charT, class traits>
basic_ostream<charT,traits>& operator<<(basic_ostream<charT,traits>&, const charT*);

它返回对basic_ostream的引用。std::cout被定义为basic_iostream<char>类型的对象

所以在执行之后

cout << "Hello,"

您可以参考std::cout。它又变成表达式的左操作数

cout << "World"

最后返回的上述表达式的引用成为表达式的左操作数

cout << a + b

其中a和b是一些算术类型。此表达式是对std::basic_ostream和此算术类型的重载运算符函数的调用。

由于此运算符返回对std_basic_ostream的引用,或者更准确地说是对std::cout的引用,因此它成为完整表达式的返回类型。