【问题标题】:How does cin and cout support different data types?cin 和 cout 如何支持不同的数据类型?
【发布时间】:2017-10-31 14:34:12
【问题描述】:

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

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

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

【问题讨论】:

  • 您在问几个问题。第三部分是stackoverflow.com/questions/2981836/how-can-i-use-cout-myclass的副本
  • 谢谢。我假设他们是相关的,回答一个会对其他人有所帮助。
  • operator>> 用于输入和operator<< 用于输出对于每种类型都已重载。它不仅支持基本类型,例如std::string 不是基本的,您可以自己重载它以支持您自己的类。 cout 不知道如何打印出一个值,但您传递的类型的相关重载却可以。

标签: c++ type-conversion cin cout


【解决方案1】:

编译器从不同的地方收集一组名为operator<<(或operator>>)的函数:

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

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

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
相关资源
最近更新 更多