为什么在C++中将类声明和定义放在两个单独的文件中?

LM.*_*LM. 16 c++

我只是想知道,将类分成.h和.cpp文件的重点是什么?这使得它更难编辑,如果你的类不会被编译成的.lib或.dll外部使用,有什么意义呢?

编辑:我问的原因是Boost库将所有内容都放在.hpp文件中(大多数库都是这样),我想知道为什么它在我看到的大多数其他代码中都是分开的.

rlb*_*ond 17

C++有一个叫做One Definition Rule的东西.这意味着(不包括内联函数),定义只能出现在一个编译单元中.由于C++头文件只是"复制粘贴"在每一个包含文件,现在你是把定义在多个地方,如果你只是把定义中的头文件.

当然,你可能会说,为什么不把一切都内联.好吧,如果编译器尊重你的内联建议,长函数的代码将在每个调用站点复制,使你的代码过大,并可能导致颠簸,缓存问题和各种未完成的东西.

另一方面,如果编译器不听你的话,并且没有内联任何内容,那么现在你有两个问题:1)你不知道哪个翻译单元得到你的类定义,2)编译器仍然需要每次#include他们时,都会浏览你的定义.此外,没有简单的方法可以确保您不会在两个不同的标题中两次意外地定义相同的方法,这是不同的.

您还会遇到循环依赖问题.对于要调用另一个类的方法的类,需要首先声明该类.因此,如果2个类需要调用彼此的方法,则必须先声明每个类,然后才能定义它们.在一个文件中无法使用声明和定义执行此操作.

真的,这是语言和解析器的构建方式.这是一种痛苦,但你只需要处理它.


Pab*_*ruz 5

好吧,以这种方式编写代码的好处之一是它减少了编译时间。

假设您的项目中有这些文件:

  • a.cpp
  • b.cpp

如果你已经有a.cpp编译成目标文件AO,那么如果你有b.cpp,编制应该是更快,因为解析器将不必处理的整个声明/定义一个