cin 和 cout 如何支持不同的数据类型?
How does cin and cout support different data types?
我知道 std::cin >> x
会将输入流中的值存储在变量 x
中。我也知道 cin
将尽可能长时间地扫描输入流以获得 x
的有效表示(跳过任何白色 space)。但是,如何为不同的数据类型定义这种行为,以及支持哪些数据类型?
cin
是否只是对每种类型的 >>
有不同的重载?它只支持基本数据类型吗?
同样,std::cout
是如何知道如何打印出一个值的?我假设它使用到字符串的隐式转换,但我无法确认这一点。
编译器从不同的地方收集了一组名为operator<<
(或operator>>
)的函数:
- 当前范围
- 左侧操作数的成员及其基数 classes
- 左侧操作数的名称空间(可以使用
friend
关键字在 class 中定义)
- 右侧操作数的命名空间(可以使用
friend
关键字在 class 中定义)
- 适用于原始整数类型的内置版本
然后它以与调用具有 "ordinary" 名称的函数时相同的方式执行重载决策,以确定使用其中的哪一个。在重载解析期间考虑隐式转换,但通常为数据类型提供 iostream 支持包括提供比隐式转换为字符串更直接的匹配(例如,引用转换更好)。
由于此处的左侧操作数是 std::cout
(或 std::cin
),您对其成员或命名空间没有太多控制权。而且您无法更改内置版本。但这仍然为您提供了多种方法来添加对新类型的支持——作为程序作者,使用当前范围,作为库作者,使用您编写的 class 的命名空间。
我知道 std::cin >> x
会将输入流中的值存储在变量 x
中。我也知道 cin
将尽可能长时间地扫描输入流以获得 x
的有效表示(跳过任何白色 space)。但是,如何为不同的数据类型定义这种行为,以及支持哪些数据类型?
cin
是否只是对每种类型的 >>
有不同的重载?它只支持基本数据类型吗?
同样,std::cout
是如何知道如何打印出一个值的?我假设它使用到字符串的隐式转换,但我无法确认这一点。
编译器从不同的地方收集了一组名为operator<<
(或operator>>
)的函数:
- 当前范围
- 左侧操作数的成员及其基数 classes
- 左侧操作数的名称空间(可以使用
friend
关键字在 class 中定义) - 右侧操作数的命名空间(可以使用
friend
关键字在 class 中定义) - 适用于原始整数类型的内置版本
然后它以与调用具有 "ordinary" 名称的函数时相同的方式执行重载决策,以确定使用其中的哪一个。在重载解析期间考虑隐式转换,但通常为数据类型提供 iostream 支持包括提供比隐式转换为字符串更直接的匹配(例如,引用转换更好)。
由于此处的左侧操作数是 std::cout
(或 std::cin
),您对其成员或命名空间没有太多控制权。而且您无法更改内置版本。但这仍然为您提供了多种方法来添加对新类型的支持——作为程序作者,使用当前范围,作为库作者,使用您编写的 class 的命名空间。