什么时候需要在“.h”文件中单独声明一个类,并在c ++中的“.cpp”文件中提供函数实现?

时间:2016-11-13 03:00:33

标签: c++

何时需要在“.h”文件中单独声明一个类并提供 “.cpp”文件中的函数实现?

5 个答案:

答案 0 :(得分:1)

它是这样做的,所以你只能建立班级'代码一次。 如果你把课程' .h文件中的代码,然后每个获取.h的文件(访问该类的公共函数)也将复制该类'码。 编译器很乐意为你做这件事。 但是,链接器会对命名空间中的重复左值抱怨很大。

同样,相反: 内联函数 需要位于.h中,以便他们的代码 在其他代码文件中获取,这正是内联函数的意图。

答案 1 :(得分:1)

就C ++语言而言,并非绝对必要。您可以将所有类方法内联到.h文件中。

但是,将实现放在单独的.cpp中会带来许多好处,例如:

  1. C ++非常复杂。随着代码的增长,编译它需要更长的时间。包含相同头文件的每个.cpp文件将一遍又一遍地编译相同的代码。

  2. 与第一点相关:如果对类的方法进行了任何更改,如果所有类方法都在单独的.cpp文件中,则只有.cpp需要重新编译。如果所有类方法都内嵌到.h文件中,则必须重新编译包含will的每个.cpp

  3. 通常,类的方法将使用其他类作为执行任何需要的操作的一部分。因此,如果它们全部放在.h文件中,则还需要包含定义其他类的.h文件,同时也会减慢每个.cpp文件的编译速度包括头文件。如果类方法位于单独的.cpp文件中,则只有.cpp文件需要包含其他标头,并且大多数情况下只需要向.h添加一些前向声明。

答案 2 :(得分:1)

如果要使用声明来实现/定义函数,即不希望在* .h文件中显示的声明,则需要将函数的定义移动到单独的文件中。

答案 3 :(得分:0)

通常,类定义(.h)和类实现(.cpp)之间的良好分离人们可以只读取要知道的.h文件并使用< / strong>该课程没有费心阅读实施细节。

但是,并非强制要求始终将.h.cpp分开,您可以将类定义和实现放在一个文件中(例如,对于某些简单的类,或者一些快速原型)。

答案 4 :(得分:0)

从技术角度来看(就编译器需要或将接受的内容而言)几乎不需要 - 可以将每个(非标准)头文件的内容复制/粘贴到包含它们的源文件中,并编译。毕竟,这实际上是预处理器使用#include指令执行的操作 - 将包含的文件复制到位,然后将生成的源提供给编译器的后续阶段。

编译源代码时,编译器可能会耗尽内存 - 在这种情况下,将程序分解为较小的部分(包括头文件)会有所帮助 - 但这种情况(在硬件资源非常有限的机器上,例如内存) )在现代发展中非常罕见。

然而,在处理源文件时,人类不如编译器更不一致且更容易出错,因此人们可以从头文件的使用中受益。例如,不要在需要它们的每个源文件中键入(或复制)所需的声明(人们觉得无聊的活动,并且在做的时候往往会犯错),只需将声明放在头文件中#include它需要时。

那么它归结为当在头文件中放置声明使人类生活更轻松,允许他们避免犯错误,并将他们的精力集中在软件开发的创造性部分(实现新事物)而不是机械(将函数声明复制到需要它们的源文件中)。

实际上,通常情况下,在一个以上的编译单元(也就是源文件)中使用的类最好在头文件中定义。单个编译单元本地的类(例如,包含不需要由其他人直接访问的编译单元的实现细节)不需要在头文件中,因为它可以直接定义而不使用标题。如果出现这样的问题,那就会出现问题。#34; local&#34;类以后需要在其他编译单元中使用 - 在这种情况下,通常建议将必要的声明迁移到头文件,以帮助重用。

对于图书馆的作者来说,头文件也是必需的 - 他们编写了一组供其他程序员使用的函数,但不希望发布源代码。这是一种非技术性约束(即基于政策的约束),而不是技术约束。在这种情况下,他们可以分发头文件和编译对象(或库)文件,并保持其源代码私有。当然,从技术上讲,他们可以提供一组文本文件,其中包含表格的说明&#34;当您需要使用它们时,将这些声明复制到您的程序中。而不是头文件.....但这会使图书馆不受开发人员的欢迎,因为它迫使他们回到复制文本的普通且容易出错的活动,而不是进行有用的开发。

减少编译时间等注意事项也是非技术原因(编译器并不关心构建程序需要多长时间,但人们会这样做)。将类定义分为标题(类定义,任何内联函数)和单独的源(非内联成员函数的定义)确实会减少构建时间,并有助于增量构建。