cin和cout如何支持不同的数据类型?

时间:2017-10-31 14:34:12

标签: c++ type-conversion cin cout

我知道std::cin >> x会在变量x中存储输入流中的值。我也知道cin将尽可能长时间地扫描输入流以获得x的有效表示(跳过任何空格)。但是,如何为不同的数据类型定义此行为,以及支持哪些数据类型?

cin对每种类型的>>只有不同的重载吗?它只支持基本数据类型吗?

同样,std::cout如何知道如何打印出值?我假设它使用隐式转换为字符串,但我无法确认。

1 个答案:

答案 0 :(得分:1)

编译器从各个地方收集一组名为operator>>(或friend)的函数:

  • 当前范围
  • 左侧操作数及其基类的成员
  • 左侧操作数的名称空间(可以使用friend关键字在类中定义)
  • 右侧操作数的命名空间(可以使用std::cout关键字在类中定义)
  • 适用于基本整数类型的内置版本

然后以与调用具有“普通”名称的函数相同的方式执行重载解析,以确定使用哪个。在重载解析期间会考虑隐式转换,但通常为数据类型提供iostream支持包括提供比字符串隐式转换更直接的匹配(例如,引用转换更好)。

由于此处的左侧操作数为std::cin(或Any),因此您无法控制其成员或其名称空间。而且您无法更改内置版本。但是,这仍然为您提供了几种方法来添加对新类型的支持 - 作为程序作者,使用当前作用域,并作为库作者,使用您编写的类的命名空间。