何时需要在“.h”文件中单独声明一个类并提供 “.cpp”文件中的函数实现?
答案 0 :(得分:1)
它是这样做的,所以你只能建立班级'代码一次。
如果你把课程' .h
文件中的代码,然后每个获取.h
的文件(访问该类的公共函数)也将复制该类'码。
编译器很乐意为你做这件事。
但是,链接器会对命名空间中的重复左值抱怨很大。
同样,相反: 内联函数 需要位于.h
中,以便他们的代码 将 在其他代码文件中获取,这正是内联函数的意图。
答案 1 :(得分:1)
就C ++语言而言,并非绝对必要。您可以将所有类方法内联到.h
文件中。
但是,将实现放在单独的.cpp
中会带来许多好处,例如:
C ++非常复杂。随着代码的增长,编译它需要更长的时间。包含相同头文件的每个.cpp
文件将一遍又一遍地编译相同的代码。
与第一点相关:如果对类的方法进行了任何更改,如果所有类方法都在单独的.cpp
文件中,则只有.cpp
需要重新编译。如果所有类方法都内嵌到.h
文件中,则必须重新编译包含will的每个.cpp
。
通常,类的方法将使用其他类作为执行任何需要的操作的一部分。因此,如果它们全部放在.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;当您需要使用它们时,将这些声明复制到您的程序中。而不是头文件.....但这会使图书馆不受开发人员的欢迎,因为它迫使他们回到复制文本的普通且容易出错的活动,而不是进行有用的开发。
减少编译时间等注意事项也是非技术原因(编译器并不关心构建程序需要多长时间,但人们会这样做)。将类定义分为标题(类定义,任何内联函数)和单独的源(非内联成员函数的定义)确实会减少构建时间,并有助于增量构建。