如果有一个文件foo.cpp,那么它通常有一个关联的头文件foo.h,其中包含foo.cpp中定义的函数的所有声明。这样,使用foo.cpp中的函数的所有其他文件都可以包含foo.h文件并使用它们。这是我对头文件的简单理解。
但是,我没有在iostream头文件和iostream类之间看到这样的关系。 iostream头文件只声明了一些外部变量,但它们似乎都没有直接与iostream类有任何关系。 iostream类似乎也没有声明任何新函数。为什么我们有iostream类和iostream头文件?抱歉,如果我听起来很困惑,但这些东西真让我困惑。
答案 0 :(得分:1)
标题和类之间的关系不一定是一对一的;这只是一个经验教训,经常教给新手程序员。事实上,C ++语言标准没有指定类,实现文件(翻译单元)和标题之间的任何直接关系,标准库通常偏离此规则。
std::iostream
是模板类std::basic_iostream
的typedef(特别是basic_iostream<char>
)。在我的平台上,<iostream>
包含定义<istream>
的{{1}},以及包含basic_iostream
的{{1}}。
答案 1 :(得分:0)
模板是一种特殊情况,如果您声明模板化的类或函数并在另一个文件中定义它,则会遇到麻烦。由于C ++编译器只能编译模板化元素(如std::vector<int>
)的实例化而不是它们的通用版本(即std::vector<T>
),因此需要在实例化的任何地方都使用通用版本。因此,泛型类的实现通常在其头文件中。