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

Noo*_*low 14 c++

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

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

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

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

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

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

πάν*_*ῥεῖ 10

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

如果你想隐藏公开的完整实现,你可以使用pimpl习语来实现这一点.


Mar*_*k B 10

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

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

请注意,标题中的内联方法也会向您的类的公共/客户端公开实现详细信息.

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


Mar*_*som 7

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

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