在C++中,我们如何将插入运算符和其他运算符链接在一起
How are we allowed to chain together the insertion operator and other operators in general in C++?
我试图理解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"
。然后,第三次,自变量是cout
和a + 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
的引用,因此它成为完整表达式的返回类型。
- 重载运算符的范围是什么?它是否会影响作为类成员的集合的插入函数?
- 我的运算符重载是否有效<<(流插入)左操作数不是 ostream
- 重载嵌套结构/类的流插入运算符
- 屏幕插入运算符<<的运算符过载问题
- 类方法的C++插入运算符
- 在设计方面:重载vector类型的类成员的插入运算符
- 类重载运算符 '<' 插入指向该对象集的共享指针时不调用
- std::map 索引运算符与插入方法的性能
- 我在C++中遇到插入运算符错误
- 基类和派生类的虚拟插入运算符重载
- 如何在 std::map<const int、int> C++ 中重载插入运算符>>?
- 派生类 插入和提取运算符重载以及基类与派生类之间的强制转换
- 如何将重载>>运算符中输入的值插入到资源库
- 插入运算符的过载与使用二传手功能相比
- Visual Studio 15:重载"<<" C++中的插入运算符
- 使用 std::stringbuf 进行缓冲的效果,同时通过插入运算符'<<'执行写入
- 为什么当我使用额外的括号而不使用运算符重载时,插入运算符在 std::cout 中给出不同的结果?
- 带有指针的重载插入/提取运算符
- 编译器在遇到提取或插入运算符时处理信息(字符串、操纵器等)的顺序是什么?
- 插入运算符无法使用矢量,我不知道为什么