我知道std::cin >> x
会在变量x
中存储输入流中的值。我也知道cin
将尽可能长时间地扫描输入流以获得x
的有效表示(跳过任何空格)。但是,如何为不同的数据类型定义此行为,以及支持哪些数据类型?
cin
对每种类型的>>
只有不同的重载吗?它只支持基本数据类型吗?
同样,std::cout
如何知道如何打印出值?我假设它使用隐式转换为字符串,但我无法确认。
答案 0 :(得分:1)
编译器从各个地方收集一组名为operator>>
(或friend
)的函数:
friend
关键字在类中定义)std::cout
关键字在类中定义)然后以与调用具有“普通”名称的函数相同的方式执行重载解析,以确定使用哪个。在重载解析期间会考虑隐式转换,但通常为数据类型提供iostream支持包括提供比字符串隐式转换更直接的匹配(例如,引用转换更好)。
由于此处的左侧操作数为std::cin
(或Any
),因此您无法控制其成员或其名称空间。而且您无法更改内置版本。但是,这仍然为您提供了几种方法来添加对新类型的支持 - 作为程序作者,使用当前作用域,并作为库作者,使用您编写的类的命名空间。