由于两个相互矛盾的原因,我不太了解C ++头文件:
我认为头文件的目的通常是分离接口和实现。换句话说,客户端使用头文件来学习如何使用该类,但不必担心类如何在内部实际实现此功能。
那么,为什么它是头文件中指定的C ++类的私有变量?
在我看来,在头文件中使用私有变量会违反接口和实现的分离。直觉上,我认为私有变量在源文件中更有意义,因为这是不暴露给外部世界的文件。
也许我只是误解了头文件的目的,而且1.上面只是完全错误?以什么方式?
答案 0 :(得分:10)
C ++区分函数和类的声明和定义。通常,C ++头文件包含类的声明。由于不允许部分声明,头文件需要包含完整的类声明,包括所有私有成员(变量和成员函数)。
如果您想隐藏公开的完整实现,可以使用pimpl idiom来实现此目的。
答案 1 :(得分:7)
C ++头文件的主要功能是在C ++语言中没有模块导入或其他语言中存在的类似内容。编译器从其他文件中了解类型,函数等的唯一方法是使用#include
将代码粘贴到当前源文件中。
理论上,您可以将所有源代码放入标题中,并且只有一个包含所有标题的源文件。通常不这样做的原因是双重的。首先,编译需要更长的时间(某些项目的重大问题),任何文件的任何更改都会导致项目的完全重新编译。其次,将实现放入源文件确实有助于将接口与实现分开,即使仍然在头文件中指定了部分实现。
请注意,标题中的内联方法也会向您的类的公共/客户端公开详细的实现细节。
如果你真的希望将接口与实现完全分开(具有明确的优点),那么C ++的方法就是利用pimpl习语。使用该成语,所有私有数据都隐藏在源文件中,并且只向公众提供抽象接口。此外,使用非虚拟接口(NVI)模式可以进一步帮助隔离客户端与接口更改。
答案 2 :(得分:4)
头文件的目的是为编译器提供在编译单元(.cpp源文件)之间共享定义所需的信息。这是一个机械的东西,而不是哲学的东西。
例如,需要声明私有成员变量,因为它们定义了对象的大小,编译器在分配对象时需要知道大小。
答案 3 :(得分:0)
在C / C ++中,头文件的一个目的是允许多个翻译单元使用具有相同定义的类型,而不会跨多个文件复制定义。类的定义的一部分是它的私有成员。