【问题标题】:Two questions about cin and cout关于cin和cout的两个问题
【发布时间】:2021-12-31 16:10:21
【问题描述】:

创建我自己的 cin & cout 有点毫无意义,所以我只是好奇如何。 我知道 cin 和 cout 是 istream/ostream 类的实例;但是,我尝试了一些声明,例如“std::istream mycin” 但没用。

另外,我看了很多帖子说cin和cout是全局变量,但是我们必须通过std::cin或者std::cout来访问它们。我的理解是全局变量是在全局范围内声明的变量,但 cin 和 cout 显然在 std 命名空间中。我的哪一部分知识是错误的?谢谢。

【问题讨论】:

  • 如果我尝试回答您关于创建自己的 cin 和 cout 的问题,我如何知道我是否成功?例如,auto & my_cin = std::cin; 是可接受的答案吗?实际上你甚至没有问过这个问题,那么你具体想知道什么?
  • @DavidGrayson 我想知道如何创建我自己的 cin/cout 对象,这样我就可以使用“mycin >> string”来像“cin >> string”一样发挥作用。
  • 这里的“全局变量”实际上是指“命名空间范围”,而不是也称为文件范围的全局命名空间范围。 coutcin 是全局的,因为它们不限于单个函数或类或块,但它们不是全局命名空间的成员。请参阅namespace scope 了解更多信息。
  • @DavidGrayson 对不起,我是 C++ 的初学者,只是学习类的概念。既然我可以通过“someClass myInstance;”创建某个类的实例,为什么我不能通过“std::istream mycin”创建自己的 cin?
  • @NathanPierson 谢谢,你的解释让我明白了!

标签: c++ iostream


【解决方案1】:

std::cinstd::cout 不仅仅是“istream/ostream 类的实例”。它们还连接到 C++ 程序的标准输入和输出流。

C++ 标准没有规定如何发生,如何完成。你的 C++ 编译器和库会做任何需要做的事情来实现这一点,并且底层工作的确切细节是实现定义的。当然,仅仅声明你自己的两个 std::istreamstd::ostream 对象并不能通过法令来实现。如果您有兴趣,可以进行一些研究和调查,并确定您的 C++ 实现或库如何执行此操作,然后使用您自己的 std::istreamstd::ostream 实例自行重新实现。

std::istreamstd::ostream 本身仅使用底层instance of a std::streambuf 实现格式化输入和输出提取操作。 std::istreamstd::ostream 的构造函数采用指向 std::streambuf 实例的指针,该实例用作底层输入/输出源/接收器。

因此,总而言之,为了重新实现 std::cinstd::cout 所做的事情,您自己有必要:

  1. 实现std::streambuf 的子类,通过使用操作系统特定资源读取或写入终端来处理底层输入和输出。

  2. 使用您的std::streambuf 子类来构造std::istream 和/或std::ostream 的实例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-17
    • 1970-01-01
    • 2011-01-25
    • 1970-01-01
    • 2011-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多