当前位置: 首页 > 知识库问答 >
问题:

“std::cout”和“std::ostream”之间有什么关系?

太叔志尚
2023-03-14

我在下面的某个地方看到了代码片段。

#include <iostream>


int main()
{
    std::ostream& os = std::cout;

    os << "thanks a lot" << std::endl;
    return 0;
}

由于前面提到的代码片段工作得很好,它表明std::cout是从std::ostream派生而来的。但我还找不到任何直接的参考资料。

根据文件,其中说[强调我的]:

全局对象std::cout和std::wcout控制输出到实现定义类型的流缓冲区(源自std::stream buf),与标准C输出流stdout相关联。

上面的引文表示,控制输出到派生自std::streambuf的类型,而不是派生自std::streambuf的类型。

我只在一个名为usr/include/c/7/iostream的文件中找到了std::cout的声明:

  extern ostream cout;      /// Linked to standard output

我找不到std::cout的实现。

共有3个答案

戴化
2023-03-14

为了帮助这篇文章的读者,请参阅下面的代码片段

#include<iostream>
#include<typeinfo>

int main()
{
    std::cout << typeid(std::cout).name() << std::endl;
    std::cout << typeid(std::ostream).name() << std::endl;

    return 0;
}

以下是输出:

So
So

输出表明它们是相同的类型。

艾焱
2023-03-14

由于上述代码片段运行良好,它表明std::c来自std::ostream。

不完全是。代码之所以有效,是因为std::c是一个std::ostream。无需继承即可阅读和理解该代码示例。

上面的引文表示,控制输出到派生自std::streambuf的类型,而不是派生自std::streambuf的类型。

引用是在谈论您不需要关心的细节(除非您确实关心它们;)。extern ostream cout的重要部分;这个问题的ostream cout;这意味着coutostream类型的实例(extern只是表示它只是一个声明,而定义(实例)在其他地方,何时在C中使用extern)。

亢正德
2023-03-14

ostream是一个类cout是该类的一个实例。

这与class Person{}; Person john;没有什么不同。Person是类,john是该类的实例。C标准库恰好提前创建了这个特定类(ostream)的实例(cout),配置为写入标准输出流。

该行std::ostream

 类似资料:
  • 我想这样使用std::ostream: 有一个错误,说ostream构造函数受到保护: 错误:'std::basic_ostream 但我记得

  • std::cout是std::ostream的一个实例。我可以在一个名为usr/include/c/7/iostream的文件中看到std::cout的声明: 而std::ostream由typedef std::basic\u ostream定义 此外,您似乎无法创建std::ostream的实例。请参阅此演示代码片段: 以下是编译器对上述代码段的抱怨: 问题来了,因为

  • 要检查向量是否为空,我可以使用或。我查看了cplike上的签名,但缺乏理解它们的知识。它们如何相互关联?一个实现调用另一个实现吗? 我知道其中一个来自容器库,另一个来自迭代器库,但仅此而已。

  • 我知道了从< code>std::async返回的< code>future具有某种特殊共享状态的原因,通过这种状态,< code >等待返回的future发生在future的析构函数中。但是当我们使用< code>std::pakaged_task时,它的未来不会表现出同样的行为。要完成打包的任务,必须从< code>packaged_task显式调用< code>future对象上的< cod

  • 我创建了以下代码: 如果我没有像预期的那样在main.cpp中包含iostream头文件,则无法识别STD::Cout。我的问题是:如果不包括iostream,为什么在quote.h中使用std::oStream没有问题?。在前面提到的库中,将cout定义为ostream,为什么cout的使用是一个问题而ostream不是? 我使用VS2017,以防这些信息很重要。

  • 并行开发挺复杂的,特别是在试图用好线程和锁的过程中。如果要用到条件变量或std-atomics(一种无锁开发方式),那就更复杂了。C++0x提供了future和promise来简化任务线程间的返回值操作;同时为启动任务线程提供了packaged_task以方便操作。其中的关键点是允许2个任务间使用无(显式)锁的方式进行值传递;标准库帮你高效的做好这些了。基本思路很简单:当一个任务需要向父线程(启动