对C++中头文件的实际用途感到困惑

Confused about the actual purpose of header files in C++

本文关键字:C++ 文件      更新时间:2023-10-16

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

我不太了解C++头文件,原因有两个:

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

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

在我看来,在头文件中包含私有变量违反了接口和实现的分离。直观地说,我认为私有变量在源文件中更有意义,因为这是一个不向外界公开的文件。

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

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

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

请注意,头中的内联方法还提供了向类的公共/客户端公开的实现细节。

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

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

如果你想向公众隐藏完整的实现,你可以使用皮条客习语来实现这一点。

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

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

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