在头文件中实现类的优点和缺点是什么?

Bry*_*man 11 c++

我喜欢DRY的概念(不要重复自己[oops]),但C++的头文件概念违背了这种编程规则.完全在头文件中定义一个类成员有什么缺点吗?如果对模板做的是正确的,为什么不对正常的类?我有一些缺点和好处的想法,但你的是什么?

Kri*_*son 23

将所有内容放在头文件中的可能优点:

  • 冗余更少(更容易更改,更容易重构等)
  • 可以为编译器/链接器提供更好的优化机会
  • 通常更容易合并到现有项目中

将所有内容放在头文件中的可能缺点:

  • 更长的编译/链接周期
  • 失去接口和实现的分离
  • 可能导致难以解决的循环依赖关系
  • 大量内联可能会增加可执行文件的大小
  • 防止共享库/ DLL的二进制兼容性
  • 让喜欢传统使用C++方式的同事感到不安

  • 内联确实适用.除非定义位于标题中,否则编译器不会在每个转换单元中看到完整的函数定义.这意味着它通常在调用函数时不会看到完整的定义,这与内联函数有关. (2认同)

Aar*_*ron 17

嗯 - 一个问题是,通常实现的更改比类定义更频繁 - 因此对于大型项目,您最终必须为每个小的更改重新编译世界.

  • @Eric - 我目前正在处理一百万行软件的大量工作,这些软件在头文件中有很多类定义(没有充分理由).每当我改变一些东西时,我都需要经历5-10分钟的重新编译 - 这实际上会导致生产力下降.(但允许我回答StackOverflow上的问题!) (9认同)
  • @Eric--真的取决于项目.当我更改所有编译单元包含的头文件时,重新编译需要数小时.如果代码在头文件中,则不再可能进行任何工作. (4认同)
  • 每个人都知道编译时间导致生产力下降.我认为这是一个很好的理由. (3认同)
  • 这当然是一个原因,但是在不将头部文件中的实现包括在内的原因列表中,这个原因相当低. (2认同)

Eri*_*ric 6

不在头文件中实现类的主要原因是:您的类的使用者是否需要知道其实现细节?答案几乎总是没有.他们只想知道他们可以用什么界面与班级互动.让类实现在头文件中可见会使得理解这个界面变得更加困难.

除了紧凑性的考虑和将界面与实现分离之外,还存在商业动机.如果您开发了要销售的库,您(可能)不想泄露您所销售的库的实施细节.


jal*_*alf 6

你不是在重复自己.您只能在一个标题中编写一次代码.它由预处理器重复,但这不是你的问题,并且它不违反DRY.

如果对模板做的是正确的,为什么不用于普通类

对于模板来说,这不是正确的做法.它只是唯一一个真正起作用的.

无论如何,如果在头文件中实现一个类,您将获得以下优点和缺点:

  • 在使用它的任何地方都可以看到完整的实现,这使编译器可以根据需要进行内联.
  • 将多次解析和编译相同的代码,从而导致更高的编译时间.
  • 另一方面,如果所有内容都在标题中,那么可能会导致翻译单元减少,因此编译器必须运行的次数更少.最终,你最终可能会得到一个翻译单元,它只包括一次,这可以导致非常快速的编译.

而且......就是这样,真的.

我的大部分代码往往都在标题中,但这是因为我的大部分代码都是模板.