C++中std::cout与std::ostream是什么关系?
std::cout与std::ostream的关系 直接结论:std::cout本身就是std::ostream类型的全局对象,不存在“std::cout派生自std::ostream”的说法。
核心依据
- 你在系统头文件路径
/usr/include/c++/7/iostream中看到的extern ostream cout;就是最直接的权威声明。C++语法中extern 类型名 变量名的写法,已经明确标注了cout是std::ostream类型的外部全局变量,类型不存在歧义。 - 你之前查阅的文档描述,针对的是
std::cout内部持有的流缓冲区对象:这个缓冲区是实现自定义的、派生自std::streambuf的类型,这段描述的对象是流缓冲区,而非std::cout本身,属于读文档时混淆了描述主体。 - 你写的测试代码能正常编译运行,和类的继承多态特性完全无关:
#include <iostream> int main() { std::ostream& os = std::cout; os << "thanks a lot" << std::endl; return 0; }
这段代码里引用绑定合法的逻辑非常简单:std::cout是std::ostream类型的左值,同类型的非常量左值引用可以直接绑定到对象上,根本不需要继承关系支撑。
- 顺带提一个容易混淆的点:
std::iostream才是同时继承自std::ostream和std::istream的类类型,不要把头文件<iostream>、类std::iostream、全局对象std::cout这三个概念混为一谈。
为什么找不到std::cout的具体实现
C++标准库的头文件只会对外暴露变量、函数、类的声明,具体的构造、业务逻辑实现会放在标准库的源码中,最终编译链接到二进制库文件里,不会直接在头文件中展示。std::cout会在程序启动阶段、main函数执行前完成构造,关联好对接标准输出的流缓冲区,你在头文件里看不到它的构造实现是完全正常的。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

