【问题标题】:iostream header vs iostream classiostream 标头与 iostream 类
【发布时间】:2011-04-19 18:20:54
【问题描述】:

如果有文件 foo.cpp,那么它通常有一个关联的头文件 foo.h,其中包含 foo.cpp 中定义的函数的所有声明。这样,使用 foo.cpp 中函数的所有其他文件都可以只包含 foo.h 文件并使用它们。以上就是我对头文件的简单理解。


但是,我没有看到 iostream 头文件和 iostream 类之间存在这种关系。 iostream 头文件只声明了一些外部变量,但它们似乎都与 iostream 类没有直接关系。 iostream 类似乎也没有声明任何新函数。为什么我们有 iostream 类和 iostream 头文件?如果我听起来很困惑,请道歉,但这些东西真的让我很困惑。

【问题讨论】:

  • 它们是公认的错误选择的名字,主要是由于历史。 iostream 甚至不是一个类,而是一个类模板的 typedef。在新的 C++11 标准中,您至少可以通过包含 . 来保证访问iostream

标签: c++ iostream


【解决方案1】:

标题和类之间的关系不一定是一对一的;这只是一个经常教给新手程序员的经验法则。事实上,C++ 语言标准根本没有指定类、实现文件(翻译单元)和头文件之间的任何直接关系,标准库经常偏离这个规则。

std::iostream 是模板类std::basic_iostream 的类型定义(特别是basic_iostream<char>)。在我的平台上,<iostream> 包括定义basic_iostream<istream>,以及包含typedef<iosfwd>

【讨论】:

  • 我可以补充一点,根据 C++ 标准,<iostream> 甚至不需要与文件对应。在任何情况下,大型库通常会公开“聚合标头”,这些标头可以保证使用 #include 指令使源文件可以使用库符号的子集。
【解决方案2】:

模板是一种特殊情况,如果你声明一个模板化的类或函数并在另一个文件中定义它,你就会遇到麻烦。由于 C++ 编译器只能编译模板化元素的实例化(如 std::vector<int>),而不能编译它们的通用版本(即 std::vector<T>),因此无论在何处进行实例化,它都需要提供通用版本。因此,泛型类的实现一般在其头文件中。

【讨论】:

    猜你喜欢
    • 2010-09-17
    • 2012-03-28
    • 2012-02-15
    • 2021-12-03
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 2017-05-21
    • 2012-01-27
    相关资源
    最近更新 更多