15

可能重复:
在 C++ 中为什么有头文件和 cpp 文件?

由于两个相互矛盾的原因,我不太了解 C++ 头文件:

  1. 我认为头文件的目的通常是分离接口和实现。换句话说,客户端使用头文件来学习如何使用类,而不必担心类在内部实际上是如何实现这个功能的。

  2. 那么,为什么 C++ 类的私有变量会在其头文件中指定呢?

在我看来,头文件中的私有变量违反了接口和实现的分离。直观地说,我认为将私有变量放在源文件中会更有意义,因为这是不暴露给外界的文件。

也许我只是误解了头文件的用途,而1.上面是完全错误的?以什么方式?

4

4 回答 4

12

C++ 头文件的主要功能目的是在 C++ 语言中没有模块导入或其他语言中存在的任何类似内容。编译器从其他文件中了解类型、函数等的唯一方法是使用 . 将代码粘贴到当前源文件中#include

从理论上讲,您也可以将所有源代码放入标头中,并且只需一个包含所有标头的源文件。通常不这样做的原因是双重的。首先,编译需要更长的时间(对某些项目来说是一个重大问题),对任何文件的任何更改都会导致项目的完全重新编译。其次,将实现放入源文件实际上有助于将接口与实现分开,即使部分实现仍然在头文件中指定。

请注意,标头中的内联方法还会向您的类的公共/客户端公开详细的实现细节。

如果您真的希望将接口与实现完全分离(这有一定的优点),那么 C++ 的方法就是使用 pimpl idiom。使用该习语,所有私有数据都隐藏在源文件中,只向公众提供一个抽象接口。此外,使用非虚拟接口 (NVI) 模式可以进一步帮助将客户端与接口更改隔离开来。

于 2012-07-17T17:31:08.750 回答
10

C++ 区分函数和类的声明和定义。通常,C++ 头文件包含类的声明。由于不允许部分声明,因此头文件需要包含完整的类声明,包括所有私有成员(变量和成员函数)。

如果你想对公众隐藏完整的实现,你可以使用pimpl idiom来实现这一点。

于 2012-07-17T17:30:58.440 回答
7

头文件的目的是为编译器提供在编译单元(.cpp 源文件)之间共享定义所需的信息。这是机械的东西,而不是哲学的东西。

例如,私有成员变量需要声明,因为它们定义了对象的大小,编译器在分配对象时需要知道大小。

于 2012-07-17T17:35:54.220 回答
0

在 C/C++ 中,头文件的一个目的是允许多个翻译单元使用具有相同定义的类型,而不会在多个文件中重复定义。类的部分定义是它的私有成员。

于 2012-07-17T17:32:35.180 回答