2012-07-17 30 views
8

可能重复:
In C++ why have header files and cpp files?困惑的头文件在C实际目的++

我不完全得到C++头文件,有两个相互矛盾的原因:

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

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

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

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

+0

你从哪里得到1.从? – Robottinosino 2012-07-17 17:17:38

+0

除了'friend'函数,我敢打赌,这只是编译器确定类的大小的技术限制。 – Mysticial 2012-07-17 17:17:50

+0

@DaveSwersky那个笨蛋没有回答OP的第二个问题,“那么为什么它的头文件中指定的C++类的私有变量?” – Mysticial 2012-07-17 17:18:40

回答

9

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

如果您想隐藏公众的完整实施,您可以使用pimpl idiom来实现此目的。

6

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

理论上你可以把所有的源代码放到头文件中,只需要一个包含所有头文件的源文件。这通常不会完成的原因是双重的。首先,编译需要更长的时间(对某些项目有重大关注),任何对任何文件的更改都会导致项目完全重新编译。其次,将实现放入源文件实际上有助于将接口与实现分离,即使在头文件中仍然指定了部分实现。

请注意,标题中的内联方法还会向您的课程的公共/客户端展示细化的实现细节。

如果你真的想将接口从实现中完全分离出来(具有明确的优点),C++的方法是利用pimpl的习惯用法。使用该成语,所有私人数据都隐藏在源文件中,只向公众提供抽象接口。此外,使用非虚拟接口(NVI)模式可以进一步帮助客户端与接口更改隔离。

0

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

3

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

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

+0

这不是在编译单元之间“共享声明”的正确术语吗?它经常弄糊涂,声明和定义的手段是什么...... – 2012-07-17 17:55:56

+0

@ g-makulik,我在英文意义上使用“定义”,而不是正式的C++用法。当然,可以在头文件中包含定义,例如模板几乎是强制性的。 – 2012-07-17 18:06:19

+0

为什么只有私有成员变量? – zgulser 2016-11-27 18:17:45