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

时间:2009-11-23 15:27:32

标签: c++

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

6 个答案:

答案 0 :(得分:23)

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

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

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

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

答案 1 :(得分:17)

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

答案 2 :(得分:6)

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

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

答案 3 :(得分:6)

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

  

如果对模板做的是正确的,为什么不对正常的类

对于模板来说,这不是正确的事情。它只是唯一一个真正起作用的。

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

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

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

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

答案 4 :(得分:2)

主要缺点(除了冗长的构建)是没有明确的界面和实现分离。

理想情况下,您不需要看到直观且记录良好的界面的实现。

答案 5 :(得分:0)

还没有提到:为每个include实例化虚函数,所以你可以膨胀你的可执行文件(我不确定这是否适用于所有编译器)。

还有另一种选择:
在源文件中声明的类中做了很多东西。一个例子是pimpl-idiom,但是也有人害怕从头文件中声明类。但是,这对私人课程来说很有意义。